AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TListView - viele Daten - viel Zeit ...

Ein Thema von Marco Steinebach · begonnen am 16. Jul 2014 · letzter Beitrag vom 14. Okt 2018
Antwort Antwort
Seite 1 von 3  1 23   
Marco Steinebach

Registriert seit: 4. Aug 2006
486 Beiträge
 
Delphi 5 Enterprise
 
#1

TListView - viele Daten - viel Zeit ...

  Alt 16. Jul 2014, 07:57
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
Marco Steinebach
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.828 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TListView - viele Daten - viel Zeit ...

  Alt 16. Jul 2014, 07:59
Zitat:
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.
Da wäre ein BeginUpdate/EndUpate besser.

Sonst halt den virtuellen Modus verwenden.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: TListView - viele Daten - viel Zeit ...

  Alt 16. Jul 2014, 10:22
Sonst halt den virtuellen Modus verwenden.
Könntest Du da bitte ein paar weitere Informationen zu geben?
die OH kennt nichts "virtuelles".

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: TListView - viele Daten - viel Zeit ...

  Alt 16. Jul 2014, 10:29
Sonst halt den virtuellen Modus verwenden.
Könntest Du da bitte ein paar weitere Informationen zu geben?
die OH kennt nichts "virtuelles".

Gruß
K-H
Die OH in die ich schaue ist da anderer Meinung Delphi-Referenz durchsuchenVcl.ComCtrls.TListView.OwnerData

Mit den angesprochenen Methoden Delphi-Referenz durchsuchenVcl.ComCtrls.TListItems.BeginUpdate und Delphi-Referenz durchsuchenVcl.ComCtrls.TListItems.EndUpdate ist es aber kein Problem selbst 10000 Einträge in so einer ListView in akzeptabler Zeit zu präsentieren.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (16. Jul 2014 um 10:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: TListView - viele Daten - viel Zeit ...

  Alt 16. Jul 2014, 12:30
Vielen Dank!
Ich hätte "OwnerData" nie mit "virtuell" in Verbindung gebracht, man lernt nie aus.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
486 Beiträge
 
Delphi 5 Enterprise
 
#6

AW: TListView - viele Daten - viel Zeit ...

  Alt 16. Jul 2014, 14:30
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
Marco Steinebach
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
486 Beiträge
 
Delphi 5 Enterprise
 
#7

AW: TListView - viele Daten - viel Zeit ...

  Alt 16. Jul 2014, 14:38
... vielleicht ist ja was anderes falsch...
Delphi-Quellcode:
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}
ja, , ich weiß, ich hätte alles auf Englisch machen sollen... schlechte Angewohnheit...
Hab ich hier irgendwo einen Grundfehler drin...
Viele Grüße
Marfco
Marco Steinebach
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.828 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TListView - viele Daten - viel Zeit ...

  Alt 16. Jul 2014, 15:00
Zitat:
Aaaber: Begin- und EndUpdate hab ich bereits verwendet.
Jein.
Delphi-Quellcode:
with liEintraege do // normale TListView, style Report
begin
  Items.BeginUpdate;
Zitat:
Ich kann hier zwar Zeiger auf die korrespondierenden Objekte hinterlegen - und jetzt?
Die Erzeugung geht dann schneller. Du musst Dich bei der Anzeige dann selber um die Daten kümmern; dann aber auch nur um die wirklich sichtbaren.
Markus Kinzler
  Mit Zitat antworten Zitat
4dk2

Registriert seit: 4. Sep 2007
176 Beiträge
 
#9

AW: TListView - viele Daten - viel Zeit ...

  Alt 16. Jul 2014, 15:36
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:
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;
bei mehreren Spalten ist der Aufrufende
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
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
486 Beiträge
 
Delphi 5 Enterprise
 
#10

AW: TListView - viele Daten - viel Zeit ...

  Alt 17. Jul 2014, 06:33
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.
item.caption := format ('Test%d', [item.index]); zu schreiben, und erhalte, sagen wir der listview.Items.Count steht auf 3, 3 Elemente.
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
Marco Steinebach
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf