Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schleife schleift nicht wie erwartet (aber jetzt schon) (https://www.delphipraxis.net/105359-schleife-schleift-nicht-wie-erwartet-aber-jetzt-schon.html)

toyoman 20. Dez 2007 13:10


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;

Muetze1 20. Dez 2007 13:13

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.

toyoman 20. Dez 2007 13:20

Re: Schlaufe schlauft nicht wie erwartet
 
Zitat:

Zitat von Muetze1
Schlaufe? Nicht eher eine Schleife? :gruebel:

Wird durch " btnoeffnen.Click; " vllt. ein Eintrag in der ListView oder der Liste entfernt?

von mir aus schleife.. ;)

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?

toyoman 20. Dez 2007 13:25

Re: Schlaufe schlauft nicht wie erwartet
 
Zitat:

Zitat von toyoman
Zitat:

Zitat von Muetze1
Schlaufe? Nicht eher eine Schleife? :gruebel:

Wird durch " btnoeffnen.Click; " vllt. ein Eintrag in der ListView oder der Liste entfernt?

von mir aus schleife.. ;)

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?

Konnte das mit einem Workaround lösen:

if i< listview1.Items.Count-1 then
listview1.ItemIndex:=listview1.ItemIndex+1;

Gollum 20. Dez 2007 13:25

Re: Schlaufe schlauft nicht wie erwartet
 
Hallo,

der Fehler steckt in dieser Zeile:
Delphi-Quellcode:
  ...
  liste.LoadFromFile(listview1.Items.Item[listview1.itemindex].SubItems[5]+'.dec');
  ...
So sollte es funktionieren:
Delphi-Quellcode:
  ...
  liste.LoadFromFile(listview1.Items.Item[i].SubItems[5]+'.dec');
  ...
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.

Muetze1 20. Dez 2007 13:36

Re: Schlaufe schlauft nicht wie erwartet
 
Zitat:

Zitat von Gollum
Ich wusste gar nicht, dass die ListView einen ItemIndex mitführt.

Gibt den aktuell selektierten Eintrag an. Kann ausgelesen werden und natürlich auch gesetzt werden. In der Reportansicht ist es der Auswahlbalken.

toyoman 20. Dez 2007 14:04

Re: Schlaufe schlauft nicht wie erwartet
 
Zitat:

Zitat von Gollum
Hallo,

der Fehler steckt in dieser Zeile:
Delphi-Quellcode:
  ...
  liste.LoadFromFile(listview1.Items.Item[listview1.itemindex].SubItems[5]+'.dec');
  ...
So sollte es funktionieren:
Delphi-Quellcode:
  ...
  liste.LoadFromFile(listview1.Items.Item[i].SubItems[5]+'.dec');
  ...
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.

Brauch ich für die Anzeige (wo bin ich in der listview).
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');

Hawkeye219 20. Dez 2007 14:15

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

Muetze1 20. Dez 2007 14:16

Re: Schlaufe schlauft nicht wie erwartet
 
Zitat:

Zitat von toyoman
Die Änderung macht allerdings keinen Unterschied

Dann liegt der Fehler nicht in dem oben geposteten Quellcode Teil.

Gollum 20. Dez 2007 14:22

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:
listview1.ItemIndex:=listview1.ItemIndex+1;
durch
Delphi-Quellcode:
listview1.ItemIndex:=i;
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 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