Šta je novo?

TValueListEditor & TMemIniFile problem

hwfanatic

Čuven
Učlanjen(a)
13.02.2002
Poruke
659
Poena
630
Imam mali problem... Sledeće parče koda se nalazi u petlji. ValueListEditor1 je već popunjen.
Kod:
  Section := ValueListEditor1.Strings.Names[i];
  ValueListEditor1.Strings.Values[Section] := #32;
Sve radi kako valja i trebuje. Međutim, kada drugi red pokušam da zamenim sa...
Kod:
  ValueListEditor1.Strings.Values[Section] := MemIniFile1.ReadString(Section, 'Default', #32);
E, onda dobijem otprilike duplo kraću listu (po nasumičnom principu, čini mi se), i prijavljuje mi grešku "List index out of bounds". Pritom, u ini datotci postoje sve potrebne sekcije i vrednosti. Ja uopšte ne kapiram u čemu je stvar...
 
Odakle ti ono MemIniFile1, da li koristis neku komponentu ili sam kreiras objekat, posto ovo sto si naopisao delje kao da nisi kreirao neki od ova dva objekta (ValueList ili MemIniFile).
znaci trebalo bi da imas neki kod ovako:

Kod:
procedure citaj;
var
  MemIniFile: TMemIniFile;
  i: integer;
  section: string;
begin
  MemIniFile := TMemIniFile.Create;
  for i:= 0 to ValueListEditor1.Strings.Count-1 do
  begin
    Section := ValueListEditor1.Strings.Names[i];
    ValueListEditor1.Strings.Values[Section] := MemIniFile1.ReadString(Section, 'Default', #32);
  end;
  MemIniFile.free;
end;

Nadam se da nisam pogresio negde, kucao sam iz glave, ali ovo bi trebalo da bude to sto ti treba, naravno po ovome sto si napisao, u ValueList bi trebalo da su unesene sekcije, oko ovoga ti nemogu pomoci, jer dosad nisam radio sa valuelistom, pa bih morao da pogledam.
 
Poslednja izmena:
Ne, nije u tome problem. Objekat je propisno napravljen.
Evo i kompletne metode, da ne bude zabune...
Kod:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  Temp: TStringList;
  EditStyle: String;
  Section: String;
begin
  Setup := TMemIniFile.Create('setup.ini');
  Temp := TStringList.Create;
  Setup.ReadSections(Temp);
  VLE.Strings.Clear;
  for i := 0 to Temp.Count - 1
    do VLE.Strings.Add(Temp[i] + '=');
  Temp.Free;
  for i := 0 to VLE.Strings.Count - 1
    do begin
      Section := VLE.Strings.Names[i];
      VLE.ItemProps[Section].EditMask := Setup.ReadString(Section, 'EditMask', '');
      EditStyle := Setup.ReadString(Section, 'EditStyle', 'Simple');
      if EditStyle = 'PickList'
        then VLE.ItemProps[Section].EditStyle := esPickList
        else if EditStyle = 'Ellipsis'
          then VLE.ItemProps[Section].EditStyle := esEllipsis
          else VLE.ItemProps[Section].EditStyle := esSimple;
      VLE.ItemProps[Section].PickList.CommaText := Setup.ReadString(Section, 'PickList', '');
      VLE.ItemProps[Section].ReadOnly := Setup.ReadBool(Section, 'ReadOnly', FALSE);
      VLE.Strings.Values[Section] := Setup.ReadString(Section, 'Default', '');
    end;
  Setup.Free;
end;
 
Poslednja izmena:
takva greska se definitivno javlja kad neki objekat nije kreiran, ako si resio problem, javi nam barem.
 
Ne, nisam rešio problem. Morao sam privremeno da ostavim taj projekat po strani... Nego, koji to objekat nije napravljen, po tvom mišljenju?
 
Ako je ovo doslovce copy/paste procedure, pitanje je: gde si deklarisao "Setup :TMemIniFile;"? Ako si ga deklarisao negde na nivou klase da bi ga i druge stvari koristile, onda nisi smeo ovde u FormCreate eventu da uradis Setup.Free();
 
Nema to veze... Setup je globalna varijabla, i samo je ova procedura koristi.
 
Da ali negde moras da je kreiras i unistis, pa makar i vise puta. ako se koristi u ovoj procedure i eventalno u proceduri koja snima stanja, onda ih definisi lokalno, kreiraj i unistavaj. Radi trace step by step sa F7 pa ce da vidis gde javlja gresku.

Greska se meni javljala sa nekim listama kje sam kreirao, slicno tom tvom primeru, ali kad probam upis ili citanje nekog nepostojeceg sloga onda je pucao sa tom greskom, proveo sam sate buljeci u kod, dok nisam skontao u cemu je problem.

Ako treba sve dodele izmedju objekata radi preko neke privremene promenljive ne bi li ustanovio gde puca, posle to obrisi pa uradi na stari nacin.

Mozda ti je greska sto nemas sta da citac, a on pokusava da cita i ulazi u petlje bez kontrole.
 
Ajde ostavite objekte na miru. :) Kažem vam da cela stvar vrlo dobro radi bez poslednje linije. Međutim, kada pokušam da priključim vrednost nekom imenu, onda to u nekim slučajevima uspe, a negde se verovatno poremeti name=value struktura, i onda se dogodi da ima manje unosa nego što je planirano. Ali, da to ima veze sa tim što nema šta da pročita, nema veze, jer kao što sam rekao, nisam uočio neku naročitu pravilnost u svemu tome...
 
Nazad
Vrh Dno