Bei StringListe Listenindex überschreitet das Maximum
Hey Leute ich bins mal wieder. Ich bekomme derzeit bei ner 3fach verschachtelten Schleife den Fehler Listenindex überschreitet das maximum wenn ich die procedure aufrufe.
Delphi-Quellcode:
procedure TFrmHpt.EditingInis(IniPfade: TStringList);
var ini: TIniFile; i,s,v, suchPunkt, searchChar: Integer; Modul, fullFileName, IniName: String; begin try for i := 0 to IniPfade.Count-1 do // Über alle Inis gehen mit for Schleife begin // Block pro Ini ini := TIniFile.Create(iniPfade.Strings[i]); fullFileName := IniPfade[i]; Modul := ExtractFileName(fullFileName); // Dateiname aktueller Ini + .Ini Endung suchPunkt := Pos('.', Modul); IniName := Copy(Modul, 1, suchPunkt-1); // Aktueller Modulname ohne ini Endung Sections := TStringList.Create; Ini.ReadSections(Sections); // Alle Sektionen der aktuellen Ini i in StringList Sections gespeichert for s := 0 to Sections.Count-1 do // Jetzt über alle Sektionen gehen [COLOR="Red"]Laut Debuggen bekomm ich dann hier den Fehler.[/COLOR] begin SectionTmp := Sections.Strings[s]; // Aktuelle Sektions Name für Query wichtig ini.ReadSectionValues(Sections.Strings[s], NamesValues); // Alle Namen + Werte von jeder Sektion in StringList Names Values eintragen for v := 0 to NamesValues.Count-1 do begin searchChar := Pos('=', NamesValues[v]); NameTmp := Copy(NamesValues[v], 1, searchChar - 1); ValueTmp := Copy(NamesValues[v], searchChar + 1, MaxInt); TransferToDB(IniName, SectionTmp, NameTmp); // Übertragung in Datenbank | Query + Execute end; end; end; finally ini.Free; NamesValues.Free; Values.Free; Names.Free; Sections.Free; end; end; for s := 0 to Sections.Count-1 do // Jetzt über alle Sektionen gehen Laut Debuggen bekomm ich dann hier den Fehler. begin SectionTmp := Sections.Strings[s]; // Aktuelle Sektions Name für Query wichtig ini.ReadSectionValues(Sections.Strings[s], NamesValues); // Alle Namen + Werte von jeder Sektion in StringList Names Values eintragen Möchte mir jemand weiterhelfen? :stupid: |
AW: Bei StringListe Listenindex überschreitet das Maximum
Brr das ist ja kurz vor Spaghetti....
Wo kommen eigentlich die "Sections" her? gleiches gilt für "NamesValues" und "Values". Und diese
Delphi-Quellcode:
Unart ist auch nicht auszurotten.
procedure TFrmHpt.EditingInis(IniPfade: TStringList);
var ini: TIniFile; i,s,v, suchPunkt, searchChar: Integer; Modul, fullFileName, IniName: String; begin try wie wäre es hiermit:
Delphi-Quellcode:
Zumindestens "Sections" sollte nicht von außen kommen, sondern in dieser Prozedur definiert, initialisiert und wieder freigegeben werden.
procedure TFrmHpt.EditingInis(IniPfade: TStringList);
var ini: TIniFile; i, s, v, suchPunkt, searchChar : Integer; Modul, fullFileName, IniName : String; begin try Dann ist auch die Fehlersuche etwas einfacher. Gruß K-H |
AW: Bei StringListe Listenindex überschreitet das Maximum
Ich habe das Ganze mal aufgeteilt, so dass keine Speicherlecks mehr entstehen sollten. Ungetestet:
Delphi-Quellcode:
procedure TFrmHpt.ProceedSectionValues(Ini: TIniFile; const Section, IniName: string);
var SectionValues: TStringlist; i: integer; StrippedIniName: string; begin StrippedIniName := ChangeFileExt(ExtractFileName(IniName), ''); SectionValues := TStringlist.Create; try Ini.ReadSectionValues(Section, SectionValues); for i := 0 to SectionValues.Count - 1 do TransferToDB(StrippedIniName, Section, SectionValues.Names[i]); finally SectionValues.Free; end; end; procedure TFrmHpt.ProceedSections(Ini: TIniFile; const IniName: string); var Sections: TStringlist; i: integer; begin Sections := TStringlist.Create; try Ini.ReadSections(Sections); for i := 0 to Sections.Count - 1 do ProceedSectionValues(Ini, Sections[i], IniName); finally Sections.Free; end; end; procedure TFrmHpt.EditingInis(IniPfade: TStrings); var i: integer; ini: TIniFile; begin for i := 0 to IniPfade.Count - 1 do begin Ini := TIniFile.Create(IniPfade[i]); try ProceedSections(Ini, IniPfade[i]); finally ini.Free; end; end; end; |
AW: Bei StringListe Listenindex überschreitet das Maximum
Das ist doch nicht dein Ernst?
oder hab ich was übersehen?
Delphi-Quellcode:
Da fehlt doch noch ein ReadSections
procedure TFrmHpt.ProceedSections(Ini: TIniFile; const IniName: string);
var Sections: TStringlist; i: integer; begin Sections := TStringlist.Create; try for i := 0 to Sections.Count - 1 do { sections ist leer! } ProceedSectionValues(Ini, Sections[i], IniName); finally Sections.Free; end; end; Gruß K-H |
AW: Bei StringListe Listenindex überschreitet das Maximum
Aber die Speicherlecks sind weg und die Performance wurde um 1000% verbessert :mrgreen:
|
AW: Bei StringListe Listenindex überschreitet das Maximum
Wo? :angel: :mrgreen:
Kann doch mal passieren, wenn man Code im Editor tippt. |
AW: Bei StringListe Listenindex überschreitet das Maximum
Hallo,
warum ist Sections nicht lokal definiert ? Außerdem erzeugst du in der Schleife deine Klassen (Ini, Sections ...) x mal, gibst sie aber außerhalb der Schleife nur 1 mal frei. Heiko |
AW: Bei StringListe Listenindex überschreitet das Maximum
Da hier eh viel zu refaktorisieren ist, schau doch bitte bei der Gelegenheit mal die Klasse TMemIniFile an.
|
AW: Bei StringListe Listenindex überschreitet das Maximum
Wo ist denn der Unterschied zwischen
Delphi-Quellcode:
und
TIniFile
Delphi-Quellcode:
(außer, das letzere die INI-Datei im Speicher hält)?
TMemIniFile
|
AW: Bei StringListe Listenindex überschreitet das Maximum
Hast du jetzt eine rhetorische Frage mit Antwort gepostet? :gruebel:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz