Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - ListView einträge zählen?
csigg - Fr 08.04.05 14:25
Titel: ListView einträge zählen?
Kann mir jemand sagen wie ich ListView-Einträge zählen kann??
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure Tfrm_Main.lvRaum1Insert(Sender: TObject; Item: TListItem); begin if then begin end; end; |
ScorpionKing - Fr 08.04.05 14:26
Liefert integer zurück!
csigg - Fr 08.04.05 14:35
OK, dankeschön
Amiga-Fan - Sa 27.01.07 00:08
Zitat: |
ListView.Items.Count |
genau damit habe ich ein Problem gerade. Und zwar wird der Wert, der durch Count zurückgeliefert wird, durch ListView.Items.Clear nur temporär zurückgesetzt. Angenommen ich habe 30 Einträge, und mache dann items.clear, dann liefert Count 0. Dann mache ich items.add; und er zeigt bei Count 31 Einträge an. Das ganze habe ich reproduzierbar. Wie kann man das umgehen? :?
matze - Sa 27.01.07 11:01
Das kann ja fast nicht sein. Poste doch bitte mal den Quelltextabschnitt in dem du das machst (mit ein bisschen von deinem Code aussenrum)
Amiga-Fan - Sa 27.01.07 17:53
eigentlich nichts besonderes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| lb_EmuFamilys.items.clear; i:=0; while i<=high(tmpEmuFamilys) do begin if high(tmpEmuFamilys[0])>=0 then begin if trim(tmpEmuFamilys[i,0])<>'' then begin lb_EmuFamilys.Items.Add; lb_EmuFamilys.Items.Item[lb_EmuFamilys.Items.Count-1].SubItems.clear; lb_EmuFamilys.Items.Item[lb_EmuFamilys.Items.Count-1].Caption:=(trim(tmpEmuFamilys[i,0])); end; end; i:=i+1; end; |
Ich habe Delphi 7 Prof. mit SP1. Es handelt sich um ein tlistview.
jaenicke - Sa 27.01.07 18:24
Also mir siehst das so aus, als würdest du hier mehrfach Items.Add benutzen. Und wenn du die 30 Einträge nach dem Clear wieder hinzufügst, dann sind die natürlich auch wieder da.
Amiga-Fan - Sa 27.01.07 18:53
ja klar rufe ich das mehrmals auf. Ok also zur Verdeutlichung: ich verändere die Routine folgendermaßen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| lb_EmuFamilys.items.clear; i:=0; while i<=high(tmpEmuFamilys) do begin if high(tmpEmuFamilys[0])>=0 then begin if trim(tmpEmuFamilys[i,0])<>'' then begin lb_EmuFamilys.Items.Add; lb_EmuFamilys.Items.Item[lb_EmuFamilys.Items.Count-1].SubItems.clear; lb_EmuFamilys.Items.Item[lb_EmuFamilys.Items.Count-1].Caption:=(trim(tmpEmuFamilys[i,0])); end; end; i:=i+1; end; showmessage(inttostr(i)); showmessage(inttostr(lb_EmuFamilys.Items.Count)); |
rufe ich die Routine das erste mal auf, zeigt er mir 30 und 29 in der Messagebox an. Rufe ich sie ein zweites Mal auf, zeigt er 30 und 58 in der Messagebox. An der ersten Zahl sieht man, das sich am Array nix verändert hat.
Gestern habe ich nicht gesehen, das beim zweiten mal alle Einträge doppelt drin sind, ich habe nur gesehen das die erste Zeile frei war und dann die Einträge kamen. Es sind also beim zweiten Aufruf alle Einträge doppelt drin obwohl ich clear mache und sich am Array nix verändert hat (demnach scheint count doch richtig zu zählen). Woran liegt das?
matze - So 28.01.07 11:10
was ist denn tmpEmuFamilys ist das dein ListView ?
jaenicke - So 28.01.07 11:28
matze hat folgendes geschrieben: |
was ist denn tmpEmuFamilys ist das dein ListView ? |
Amiga-Fan hat folgendes geschrieben: |
Delphi-Quelltext 1:
| while i<=high(tmpEmuFamilys) do begin | |
Amiga-Fan hat folgendes geschrieben: |
An der ersten Zahl sieht man, das sich am Array nix verändert hat. |
Nein, ein Array ;-)
lb_EmuFamilys ist die ListView, der Name mit lb_ ist zwar irreführend, aber was solls.
Nachvollziehen kann ich den Fehler jedenfalls nicht, hier mein Testprojekt, und da geht alles wie es soll:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| var Form1: TForm1; tmpEmuFamilys: array[0..29] of array[0..1] of String;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var i, j: Integer; begin for i := 0 to High(tmpEmuFamilys) do for j := 0 to High(tmpEmuFamilys[i]) do tmpEmuFamilys[i, j] := 'aaa';
lb_EmuFamilys.items.clear; i:=0; while i<=high(tmpEmuFamilys) do begin if high(tmpEmuFamilys[0])>=0 then begin if trim(tmpEmuFamilys[i,0])<>'' then begin lb_EmuFamilys.Items.Add; lb_EmuFamilys.Items.Item[lb_EmuFamilys.Items.Count-1].SubItems.clear; lb_EmuFamilys.Items.Item[lb_EmuFamilys.Items.Count-1].Caption:=(trim(tmpEmuFamilys[i,0])); end; end; i:=i+1; end; showmessage(inttostr(i)); showmessage(inttostr(lb_EmuFamilys.Items.Count)); end; |
Beide Ausgaben sind 30, egal wie oft ich klicke. Aber was anderes hatte ich auch nicht erwartet...
// EDIT: Ach so: Habe auch Delphi 7 genommen, weil du geschrieben hast, dass du es benutzt. ;-)
Amiga-Fan - So 28.01.07 15:40
das war vor kurzem noch eine listbox, habe das ausgetauscht. Nunja aber bei mir gibt es wie gesagt andere zahlen. Werde weiter suchen.... aber sp1 hast du nicht drauf, oder? Vielleicht hat es auch mit dem bs zu tun... nehme an, das er eine windows-kompo kapselt, oder?
Amiga-Fan - Do 15.02.07 19:09
wenn ich lb_EmuFamilys.clear statt lb_EmuFamilys.items.clear mache scheints zu gehen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!