![]() |
Schleife schleift nicht wie erwartet (aber jetzt schon)
hallo
in meiner verschachtelten (such)schlaufe wird eine listview durchlaufen und innerhalb dieser wird eine stringlist durchlaufen. soweit so gut. wenn ich for i:=0 to listview1.items.count-2 mache dann funzt es ausser, dass er dann in der letzten zeile nicht sucht. das heisst er ignoriert die letzte zeile der listview. (aber keine fehlermeldung). wenn ich nun die zeile logischerweise umschreiben nach: for i:=0 to listview1.items.count-1 dann bearbeitet er zwar die letzte zeile auch aber DANACH kommt ein hässlicher Access Violation fehler. (das heisst er will irgendwie noch über das listenende hinaus suchen). kann sich das jemand erklären? ist bestimmt ein kleiner mistfehler.. aber ich find ihn nicht. siehe code:
Delphi-Quellcode:
screen.Cursor:=crhourglass;
listview1.ItemIndex:=0; liste:=TStringList.Create; for i:=0 to listview1.Items.Count-1 do begin liste.LoadFromFile(listview1.Items.Item[listview1.itemindex].SubItems[5]+'.dec'); for j:=0 to liste.Count-1 do begin if pos(uppercase(edsuch.Text),uppercase(liste[j])) >0 then begin if Application.Messagebox(pchar('Eintrag gefunden! Weitersuchen? = ja / Öffnen = nein'),pchar('Suche erfolgreich'),MB_YESNO or MB_ICONWARNING) = mryes then begin // Weitersuchen end else begin // Gefundenes Statement öffnen btnoeffnen.Click; screen.Cursor:=crdefault; exit; end; end else begin //showmessage('nichts gefunden'); end; end; listview1.ItemIndex:=listview1.ItemIndex+1; end; liste.Free; showmessage('Suche abgeschlossen!'); screen.Cursor:=crdefault; |
Re: Schlaufe schlauft nicht wie erwartet
Schlaufe? Nicht eher eine Schleife? :gruebel:
Wird durch " btnoeffnen.Click; " vllt. ein Eintrag in der ListView oder der Liste entfernt? Ansonsten ist der ItemIndex beim ListView beim letzten Schleifendurchlauf mit i ungültig, da dann der ItemIndex der ListView auf einen zu großen Wert gesetzt wird. |
Re: Schlaufe schlauft nicht wie erwartet
Zitat:
nein durch btnoeffnen werden dann nur daten in ein anderes form gelesen. also in der listview verändert sich nie etwas. Ansonsten ist der ItemIndex beim ListView beim letzten Schleifendurchlauf mit i ungültig, da dann der ItemIndex der ListView auf einen zu großen Wert gesetzt wird. was meinst du damit? bzw. was kann ich dagegen tun? |
Re: Schlaufe schlauft nicht wie erwartet
Zitat:
if i< listview1.Items.Count-1 then listview1.ItemIndex:=listview1.ItemIndex+1; |
Re: Schlaufe schlauft nicht wie erwartet
Hallo,
der Fehler steckt in dieser Zeile:
Delphi-Quellcode:
So sollte es funktionieren:
...
liste.LoadFromFile(listview1.Items.Item[listview1.itemindex].SubItems[5]+'.dec'); ...
Delphi-Quellcode:
Ich wusste gar nicht, dass die ListView einen ItemIndex mitführt. Lass den Quatsch weg, da Du ja bereist eine Schleife über alle Einträge der Listview hast.
...
liste.LoadFromFile(listview1.Items.Item[i].SubItems[5]+'.dec'); ... |
Re: Schlaufe schlauft nicht wie erwartet
Zitat:
|
Re: Schlaufe schlauft nicht wie erwartet
Zitat:
Der Benutzer sieht so schön in welcher Zeile etwas gefunden wurde... Die Änderung macht allerdings keinen Unterschied
Delphi-Quellcode:
liste.LoadFromFile(listview1.Items.Item[i].SubItems[5]+'.dec');
|
Re: Schlaufe schlauft nicht wie erwartet
Hallo,
es würde doch reichen, den ItemIndex nur im Erfolgsfall zu setzen, dann kannst du dir die Sonderbehandlung für den letzten Schleifendurchlauf ebenfalls sparen. Gegen das Speicherleck solltest du ebenfalls etwas unternehmen. Die Stringliste wird nicht freigegeben, falls der Anwender die Suchschleife vorzeitig beendet. Bei einen Einsatz von TRY..FINALLY könntest du auch den Cursor an einer Stelle restaurieren. Gruß Hawkeye |
Re: Schlaufe schlauft nicht wie erwartet
Zitat:
|
Re: Schlaufe schlauft nicht wie erwartet
Hallo,
ich vermute, dass das mit dem setzen des ItemIndex zu tun hast. Ersetze einmal die Zeile
Delphi-Quellcode:
durch
listview1.ItemIndex:=listview1.ItemIndex+1;
Delphi-Quellcode:
Wenn die Liste Items.Count-1 erreicht, läuft die Zuweisung ItemIndex:=ItemIndex+1 auf einen Fehler. Maximale Anzahl von Einträgen + 1 = Listindex überschreitet Maximum.
listview1.ItemIndex:=i;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz