![]() |
TListView - viele Daten - viel Zeit ...
Hallo zusammen,
ich habe so ca. 2.000 Datensätze, die angezeigt werden sollen - bis jetzt mittels TListView. Das funktioniert auch alles wunderschön, dauert aber im Aufbau uuunglaublich lange. Ein ernsthafter Geschwindigkeitsgewinn ergibt sich schon, wenn man vor dem Befüllen der Liste sämtliche Spaltenbreiten auf 0 setzt, und sie, nach dem Befüllen, wiederherstellt. Gibt es eine Komponente, die hierfür geeigneter ist? Übrigens: D5 Std, also leider nix mit Datenbank o.ä. Für einen Tipp wäre ich dankbar Viele Grüße Marco |
AW: TListView - viele Daten - viel Zeit ...
Zitat:
Sonst halt den virtuellen Modus verwenden. |
AW: TListView - viele Daten - viel Zeit ...
Zitat:
die OH kennt nichts "virtuelles". Gruß K-H |
AW: TListView - viele Daten - viel Zeit ...
Zitat:
![]() Mit den angesprochenen Methoden ![]() ![]() |
AW: TListView - viele Daten - viel Zeit ...
Vielen Dank!
Ich hätte "OwnerData" nie mit "virtuell" in Verbindung gebracht, man lernt nie aus. Gruß K-H |
AW: TListView - viele Daten - viel Zeit ...
Hallo zusammen,
Tja, wenn's bei euch so schnell geht, dann liegt's evtl. an meinem Screenreader (Programm das den Bildschirminhalt vorliest), das es so lange dauert - probier ich gleich mal aus. Aaaber: Begin- und EndUpdate hab ich bereits verwendet. Aber, vielleicht bin ich auch heute zu doof, was nützt mir die OwnerData? Ich kann hier zwar Zeiger auf die korrespondierenden Objekte hinterlegen - und jetzt? Viele Grüße Marco |
AW: TListView - viele Daten - viel Zeit ...
... vielleicht ist ja was anderes falsch...
Delphi-Quellcode:
ja, ;-), ich weiß, ich hätte alles auf Englisch machen sollen... schlechte Angewohnheit...
procedure TPostHauptformular.FuelleEintragsliste;
var NeueSpalte: TListColumn; NeuerEintrag: TListItem; i, x: integer; s: string; breiten: array of integer; begin with liEintraege do // normale TListView, style Report begin {Alle (alten) Spalten und ListenItems bereinigen.} columns.clear; Items.clear; {Memo vorhanden?} NeueSpalte := Columns.add; NeueSpalte.Caption := ' '; NeueSpalte.Width := ColumnTextWidth; {Versanddatum} NeueSpalte := Columns.add; NeueSpalte.Caption := 'Datum'; NeueSpalte.Width := ColumnTextWidth; // und noch 4 stück... // breiten speichern und auf 0 setzen... SetLength (breiten, Columns.Count); for i := 0 to columns.count -1 do begin breiten[i] := columns[i].Width; columns[i].width := 0 end; Items.BeginUpdate; for i := 0 to se.letzter do begin with se[i] do begin NeuerEintrag := Items.Add; neuerEintrag.Caption := s; NeuerEintrag.SubItems.Add(empfaenger); NeuerEintrag.SubItems.Add(inhalt); // und noch'n paar... end end; Items.EndUpdate; for i := 0 to columns.count -1 do columns[i].Width := breiten[i]; end end; {FuelleEintragsliste} Hab ich hier irgendwo einen Grundfehler drin... Viele Grüße Marfco |
AW: TListView - viele Daten - viel Zeit ...
Zitat:
Delphi-Quellcode:
with liEintraege do // normale TListView, style Report
begin Items.BeginUpdate; Zitat:
|
AW: TListView - viele Daten - viel Zeit ...
Ne er hat recht, er macht nix falsch ist ein BUG in TCustomListView, der ist sogar noch in XE3 drinne...
das liegt am (ViewStyle = vsReport) der in TCustomListView.ColumnsShowing abgefragt wird. ist die spaltengröße <= ColumnTextWidth rast er jedesmal ins UpdateColumns, das macht die Verlangsamung. Müssen nicht mal mehrere Spalten definiert sein. Also UpdateColumn und UpdateColumns (bei mehreren spalten) sind die Bösewichte
Delphi-Quellcode:
bei mehreren Spalten ist der Aufrufende
procedure TListItem.SetCaption(const Value: string);
begin if Value <> Caption then begin FCaption := Value; if not Owner.Owner.OwnerData then {$IFDEF CLR} ListView_SetItemText(Handle, Index, 0, IntPtr(Integer(LPSTR_TEXTCALLBACK))); {$ELSE} ListView_SetItemText(Handle, Index, 0, LPSTR_TEXTCALLBACK); {$ENDIF} if ListView.ColumnsShowing and (ListView.Columns.Count > 0) and (ListView.Column[0].WidthType <= ColumnTextWidth) then ListView.UpdateColumns; //hier passierts if ListView.SortType in [stBoth, stText] then ListView.AlphaSort; end; end;
Delphi-Quellcode:
procedure TSubItems.SetColumnWidth(Index: Integer);
var ListView: TCustomListView; begin ListView := Owner.ListView; if ListView.ColumnsShowing and (ListView.Columns.Count > Index) and (ListView.Column[Index].WidthType = ColumnTextWidth) then ListView.UpdateColumn(Index); //hier.... end; Ne vernünftige alternative ohne Spaltenbreite auf 0 zu setzen sehe ich leider nicht :( |
AW: TListView - viele Daten - viel Zeit ...
Hallo, und herzlichen Dank für eure Antworten.
Prima, und ich dachte schon, ich hätte was grundlegendes nicht verstanden - schon witzig,daß der Bug sogar noch in den neuesten Versionen drin ist... Bleibt also offensichtlich wirklich nur, spaltenbreite auf 0, oder gleich mit festen Spaltenbreiten zu arbeiten. Noch eine Frage zu OwnerData: OwnerData steht auf true. Im einfachsten Beispiel brauche ich dann ja nur im OnData der Listview z.B.
Delphi-Quellcode:
zu schreiben, und erhalte, sagen wir der listview.Items.Count steht auf 3, 3 Elemente.
item.caption := format ('Test%d', [item.index]);
Das funktioniert auch prima. Das OnData wird aber unglaublich oft aufgerufen, egal, ob ich mich durch die Liste bewege, oder nicht. Lasse ich mein Testprogramm, und mehr steht da wirklich nicht drin, einfach 10 Sekunden völlig in Ruhe, hab ich gut 250 Aufrufe von OnData - ähm, hab ich hier was verpaßt, denn ich dachte, das Ereignis wird nur aufgerufen, wenn wirklich was geschrieben werden muß, oder weißt der, ernsthaft, bei jedem Durchlauf, alles neu zu... Ähm, etwas ratlose Grüße Marco |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 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 by Thomas Breitkreuz