![]() |
ListView: Virtueller Modus
Hi!
Man aktiviert den virtuellen Modus bei einer TListView indem man OwnerData aktiviert. Anschließend muss man den Count setzen und OnData verwenden. Ich habe es so gemacht:
Delphi-Quellcode:
Die Prozedur Liste befüllt die ListView udn setzt daher am Ende den Count. So wie ich es mache, ist der erste Item.Index -1. Daraus folgt eine sofortige Zugriffsverletzung. Daher die If-Abfrage. Diese If-Abfrage möchte ich vermeiden, denn dank ihr ist der erste Eintrag leer. Alle Einträge sind um eins nach hinten verschoben. Habt ihr einen Tipp, was ich dafür tun muss ?
constructor TRazFileManager.Create(aForm : TForm; aSep : String; aViewStyle : TViewStyle);
begin LV := TListView.Create(Form); with LV do begin OwnerData := True; [...] end; end; procedure TRazFileManager.Liste(Directory : String; Recursive, ClearList : Boolean); begin [...] LV.Items.Count := Succ(Length(DirsFiles)); end; procedure TRazFileManager.LVData(Sender: TObject; Item: TListItem); begin if Pred(Item.Index) > -1 then Item.Caption := DirsFiles[Pred(Item.Index)].Name+' < '+IntToStr(Item.Index); end; |
Re: ListView: Virtueller Modus
Hallo Nils,
aus deiner Beschreibung wird für mich nicht deutlich, warum Items.Count auf Succ(Length(DirFiles)) gesetzt wird. Die Verwendung von Pred() beim Ereignis OnData() erscheint mir auch sehr seltsam. Erkläre mal ein wenig. Der Wert von Items.Count darf übrigens erst gesetzt werden, wenn die Daten für OnData() auch wirklich bereit stehen. -1 als Item.Index habe ich noch nie gesehen. Freundliche Grüße |
Re: ListView: Virtueller Modus
Es ist um 1 nach hinten verschoben. Damit nicht das letzte Item wegfällt muss der Count um 1 erhöht werden. Wie die Verschiebung zustande kommt versteh ich nicht.
|
Re: ListView: Virtueller Modus
Mit deiner Verschiebung kann ich nichts anfangen.
DirsFiles scheint mir ein Array zu sein. Die Anzahl der darin enthaltenen Items ist Length(DirsFiles) - mehr geht nicht. Also übernimmst du diesen Wert für die ListItems.
Delphi-Quellcode:
So müsste das nach meinem Verständnis aussehen, wenn die Zahl der ListItems mit der Zahl der Items in DirsFiles übereinstimmt.
procedure TRazFileManager.Liste(Directory : String; Recursive, ClearList : Boolean);
begin [...] LV.Items.Count := Length(DirsFiles); end; procedure TRazFileManager.LVData(Sender: TObject; Item: TListItem); begin with Item do begin // bei 0-basiertem Array: Caption := Format('%s < %d', [DirsFiles[Index].Name, Index]); // ansonsten allgemein: Caption := Format('%s < %d', [DirsFiles[Index + Low(DirsFiles)].Name, Index]); //SubItems.Add(...); end; end; |
Re: ListView: Virtueller Modus
Habe lange gebraucht um meinen Fehler zu sehen: Vorher habe ich noch andere Einträge hinzugefügt, wie man es gewöhnlich tut. Danke, denn dank deines Codes konnte ich den Fehler finden, da dein Code nicht funktionierte und bei fast allen Benutzern des Forums drübersteht, wenn er eventuell nicht ganz funktioniert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 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