Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bei StringListe Listenindex überschreitet das Maximum (https://www.delphipraxis.net/173777-bei-stringliste-listenindex-ueberschreitet-das-maximum.html)

Back2Code 15. Mär 2013 14:49

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:

p80286 15. Mär 2013 15:07

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:
procedure TFrmHpt.EditingInis(IniPfade: TStringList);
var ini: TIniFile;
i,s,v, suchPunkt, searchChar: Integer;
Modul, fullFileName, IniName: String;
begin
try
Unart ist auch nicht auszurotten.
wie wäre es hiermit:
Delphi-Quellcode:
procedure TFrmHpt.EditingInis(IniPfade: TStringList);
var
  ini: TIniFile;
  i,
  s,
  v,
  suchPunkt,
  searchChar : Integer;
  Modul,
  fullFileName,
  IniName    : String;
begin
try
Zumindestens "Sections" sollte nicht von außen kommen, sondern in dieser Prozedur definiert, initialisiert und wieder freigegeben werden.
Dann ist auch die Fehlersuche etwas einfacher.

Gruß
K-H

DeddyH 15. Mär 2013 15:20

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;

p80286 15. Mär 2013 15:34

AW: Bei StringListe Listenindex überschreitet das Maximum
 
Das ist doch nicht dein Ernst?
oder hab ich was übersehen?
Delphi-Quellcode:
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;
Da fehlt doch noch ein ReadSections

Gruß
K-H

Sir Rufo 15. Mär 2013 15:37

AW: Bei StringListe Listenindex überschreitet das Maximum
 
Aber die Speicherlecks sind weg und die Performance wurde um 1000% verbessert :mrgreen:

DeddyH 15. Mär 2013 15:38

AW: Bei StringListe Listenindex überschreitet das Maximum
 
Wo? :angel: :mrgreen:

Kann doch mal passieren, wenn man Code im Editor tippt.

hoika 16. Mär 2013 07:43

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

TiGü 16. Mär 2013 10:17

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.

Furtbichler 16. Mär 2013 11:13

AW: Bei StringListe Listenindex überschreitet das Maximum
 
Wo ist denn der Unterschied zwischen
Delphi-Quellcode:
TIniFile
und
Delphi-Quellcode:
TMemIniFile
(außer, das letzere die INI-Datei im Speicher hält)?

TiGü 17. Mär 2013 14:36

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.
Seite 1 von 2  1 2      

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