Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView: Virtueller Modus (https://www.delphipraxis.net/116701-listview-virtueller-modus.html)

Nils_13 4. Jul 2008 15:50


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:
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;
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 ?

marabu 4. Jul 2008 16:09

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

Nils_13 4. Jul 2008 16:12

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.

marabu 4. Jul 2008 17:00

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:
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;
So müsste das nach meinem Verständnis aussehen, wenn die Zahl der ListItems mit der Zahl der Items in DirsFiles übereinstimmt.

Nils_13 4. Jul 2008 21:05

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 14:19 Uhr.

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