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 TListView ... sehr viele Einträge (https://www.delphipraxis.net/18651-tlistview-sehr-viele-eintraege.html)

cheatzs 22. Mär 2004 19:09


TListView ... sehr viele Einträge
 
Hi Leutz,
hab mal ein ganz verrücktes Problem.
Also die Anzeige in einem TListView mit Report als ViewStyle ist ja nicht so schwierig.
Das Problem liegt bei der Anzahl der Elemente:
Ich muss ziemlich viele Einträge (ca. 10000-100000) dort reinschreiben. Nun braucht das ganze schon bei 1000 Einträge ca 2 Sekunden bis das wieder aktualisiert ist (Es müssen alle Datensätze neu eingetragen werden).
Ich hab alle Datensätze in einem dynamischen Array gespeichert, aus dem dann die Daten zur Anzeige genommen werden.
Vielleicht kennt jemmand eine Methode um den Teil, der gerade im TListView angezeigt wird, aus dem Array zu laden ohne den Rest zu benötigen, wobei die Scrollbalken aber noch richtig anzeigen. Sodass er beim Aktualisieren und beim Scrollen nur das kleine Sichtbare stück aktualisieren muss.

Wenn jemmand eine andere Möglichkeit kennt, wie man noch sehr viele Daten relativ schnell anzeigen kann - ich bin für alles offen.

Danke im Vorraus

Bye

stoxx 22. Mär 2004 19:17

Re: TListView ... sehr viele Einträge
 
probier mal das:

Code:
var oldViewStyle : TViewStyle;

begin

    oldViewStyle := lv.ViewStyle;
    lv.ViewStyle := vsList;

    lv.Items.BeginUpdate;
    lv.Items.Clear;

    try
     ListViewLoadFromFile(lv, pfad);
    except
     MessageDlg('Keine Original LV Datei !', mtWarning, [mbOK], 0);
    end;

    lv.Items.EndUpdate;
    lv.ViewStyle := oldViewStyle;

end;

MathiasSimmack 22. Mär 2004 19:18

Re: TListView ... sehr viele Einträge
 
Bringen dich "BeginUpdate" und "EndUpdate" weiter? Ersteres wird vor dem Laden der Einträge aufgerufen und blockiert die Bildschirmausgabe. Letzteres wird danach aufgerufen und stellt den Inhalt dann sozusagen auf einen Schlag dar.

Schau mal in die Hilfe. Ich verspreche aber nicht, dass es das Allheilmittel ist. ;)

Bernhard Geyer 23. Mär 2004 07:07

Re: TListView ... sehr viele Einträge
 
Für sehr viele Elemente im ListView gibt es folgende Tipps

1, Verwendung von Begin...EndUpdate

2, Betrieb des Listviews im Virtual Modus (Demo unter Demos\VirtualListView verfügbar)

3, Verwendung eines auch mit vielen Einträgen schnellen Controls (z.B. das Virtual TreeView von Mike Lischke oder die Tree/Listcontrols vom ElPack). Beide Controls bieten auch für 100.000 Einträge gute Performance.

cheatzs 23. Mär 2004 14:13

Re: TListView ... sehr viele Einträge
 
Hey,
danke für die Antworten:

@stoxx:
Das geht leider bei mir nicht, weil ich die Daten nicht vorher extra noch in eine Datei speichern kann. Ich glaube dann würde die Performance noch mehr drunter leiden.

@MathiasSimmack:
Danke, dies benutze ich bereits in meinen Aktualisierungen.

@Bernhard Geyer:
Dein 2. Methode intressiert mich sehr. Leider blicke ich in dem Beispiel nicht durch, weil damit gleich ein ganzer Explorer geschrieben wurde und ich die Sachen für den Virtuellen Modus und dem des Explorers nicht unterscheiden kann. Kennst du noch ein anderes Bsp. bzw. kannst du mir das ganze kurz mal erklären?

Danke

Bye

neolithos 23. Mär 2004 14:44

Re: TListView ... sehr viele Einträge
 
Wenn du eh alle Datensätze schon in einem Array hast.

Nimm doch die OwnerData = true variante.

Da muss man nur Count auf sagen wir 1000000 setzen und mit dem Ereignis OnData, die Daten geben die Dargestellt werden.

Einfach und Effizient

cheatzs 23. Mär 2004 15:28

Re: TListView ... sehr viele Einträge
 
Hi neolithos,
vielen Dank.
Das war genau das, was ich gesucht habe!

Bye

stoxx 23. Mär 2004 19:08

Re: TListView ... sehr viele Einträge
 
Hallo cheatzs,


das mit der Datei war doch nur ein Codestück aus meinem Proggi, Sorry, dass ich Dich verwirrt habe.
Es ging doch nur darum, während des Eintragens das ViewStyle zu ändern !

Matze 8. Nov 2005 15:48

Re: TListView ... sehr viele Einträge
 
Hallo,

ich habe eine Frage dazu:

So fülle ich die ListView:

Delphi-Quellcode:
ListView2.Items.Count := Length(RegExArray);
ListView2.Repaint;
Ich habe OwnerData auf true und im OnData steht folgendes:

Delphi-Quellcode:
procedure TFormMain.ListView2Data(Sender: TObject; Item: TListItem);
begin
  Item.Caption := 'hallo';
end;
Nun ist es so, dass es die Items hinzufügt, was ich am Scrollbalken erkennen kann, doch sehe ich keinen Text in der ListView, die Caption wird also nicht zugewiesen. Setze ich in das OnData-Ereignis ein ShowMessage sehe ich den Dialog, folglich muss OnData ja ausgeführt werden. Wo liegt mein Denkfehler?


Nachtrag: Ich weiß nicht, woran es lag, aber ich habe die Komponente entfernt, neu auf's Formular gezogen und dann ging's. :gruebel:

Nachtrag 2: Es geht mir vsReport nicht, daran liegt's. :cry:


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