Autor Téma: Pomalé vykreslovanie TListView  (Přečteno 1562 krát)

Offline František

  • Guru
  • *****
  • Příspěvků: 523
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Pomalé vykreslovanie TListView
« kdy: 17-10-2019, 16:16:43 »
V ListView1CustomDrawSubItem mám podmienky na zmenu farby vykreslovania takto:

Kód: Delphi [Vybrat]
  1.   if (item.SubItems.count > 1)
  2.      and (SubItem = 2)
  3.      and (strtoint(item.SubItems[0]) > 1)
  4.    then (sender as TListView).Canvas.brush.Color := clWebDarkSeaGreen
  5.    else (sender as TListView).Canvas.brush.Color := clWhite;
  6.  
  7. if (item.SubItems.count > 4)
  8.     and (SubItem = 5)
  9.     and (strtointdef(item.SubItems[4],0) > 1)
  10.   then (sender as TListView).Canvas.font.Color := clWebCrimson
  11.   else (sender as TListView).Canvas.font.Color := clBlack;

dosť dlho trvá, kým sa zobrazí prvý krát formulár, potom je to už ok
mám dojem že brzdenie spôsobuje to, že to čekuje aj počas BeginUpdate
alebo je to niečo iné? Je možné zistiť, či je ListView.Items v stave BeginUpdate?
« Poslední změna: 17-10-2019, 16:20:24 od František »

Offline František

  • Guru
  • *****
  • Příspěvků: 523
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Pomalé vykreslovanie TListView
« Odpověď #1 kdy: 18-10-2019, 09:33:18 »
nič nikoho nenapadá?

Online Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2401
  • Karma: 103
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Pomalé vykreslovanie TListView
« Odpověď #2 kdy: 18-10-2019, 10:37:21 »
dosť dlho trvá, kým sa zobrazí prvý krát formulár, potom je to už ok
mám dojem že brzdenie spôsobuje to, že to čekuje aj počas BeginUpdate
alebo je to niečo iné? Je možné zistiť, či je ListView.Items v stave BeginUpdate?

Spise ti dlouho trva plneni. Co jsem se dival tak ten stav se da tezko (ciste) zjistit,  na druhou stranu ti nic nebrani si krome BeginUpdate nastavit i svoji promennou a tu checknout.

A proc tu zmenu barvy delas v CustomDraw?  misto primo pri plneni.

A pokud mas moc zaznamu (kolik?) tam pouzij virtualTreeView.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2623
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Pomalé vykreslovanie TListView
« Odpověď #3 kdy: 18-10-2019, 11:37:52 »
A pokud mas moc zaznamu (kolik?) tam pouzij virtualTreeView.
Ja sice na vsechno pouzival ten VTV, ale on snad ma virtual mode i ten TListView (OwnerData)

Jinak StrToInt[ Def] neni neco, co by se melo pouzivat pri kazdem kresleni, kdyz se honi rychlost, tak se vyclenuje vyhodnocovani invariantu... Ale jak pise Radek, tim to nejspis nebude, protoze to by to bylo pomale porad, nejen poprve

Offline František

  • Guru
  • *****
  • Příspěvků: 523
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Pomalé vykreslovanie TListView
« Odpověď #4 kdy: 18-10-2019, 11:52:23 »
A pokud mas moc zaznamu (kolik?) tam pouzij virtualTreeView.
záznamov je max 500, zvyčajne 200
nad VTS som uvažoval, ale ešte sme sa neskamarátili (aj keď sa práve pokúšam)

A proc tu zmenu barvy delas v CustomDraw?  misto primo pri plneni.
ktorý event použť, ked čekujem aj subitem?
a po naplnení mením aj obsah subitem?

Jinak StrToInt[ Def] neni neco, co by se melo pouzivat pri kazdem kresleni, kdyz se honi rychlost, tak se vyclenuje vyhodnocovani invariantu... Ale jak pise Radek, tim to nejspis nebude, protoze to by to bylo pomale porad, nejen poprve
ale nakoniec tam mám vždy integer.. ale ani po úprave to nepomohlo

Offline František

  • Guru
  • *****
  • Příspěvků: 523
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Pomalé vykreslovanie TListView
« Odpověď #5 kdy: 18-10-2019, 12:00:50 »
.... pouzij virtualTreeView.

z tvojho článku mi nie sú jasné nejaké veci
https://delphi.cz/post/Lehky-uvod-do-Virtual-TreeView.aspx

Citace
Další na řadě je inicializace jednotlivých uzlů a to buďto obsloužením OnInitNode nebo za běhu.
    procedure TfrmVTtest.vtInitNode(Sender: TBaseVirtualTree; ParentNode,
      Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
    var
      MyNodeData:PMyNodeData;
    begin
      MyNodeData := Sender.GetNodeData(Node); // získáme data pro uzel
      MyNodeData^.iCommission := Node.Index; // a pro ukázku nastavíme číslo zakázky
      MyNodeData^.crPrice := Random(1000);  // nějaká náhodná cena
    end;
neviem čo toto robí a aké údaje tu dať

a ako naplniť ten vts

moja štruktúra
Kód: Delphi [Vybrat]
  1. type
  2.   TvtData = record
  3.      Fid: integer;
  4.      Ftd: TDate;
  5.      Fco: TTime;
  6.      Fpo: integer;
  7.      Fpt: integer;
  8.      Ftm: integer;
  9.      Fpp: String;
  10.   end;
  11.   PvtData = ^TvtData;
« Poslední změna: 18-10-2019, 12:14:24 od František »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4575
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Pomalé vykreslovanie TListView
« Odpověď #6 kdy: 18-10-2019, 12:27:16 »
Ja osobne InitNode v podstate nepoužívam. Používam údaje z DB a mám funkciu FillVst. Tam to robím klasicky tak, ako to je v návode pre VST.
Skús mi poslať na e-mail:
  ukážku údajov
  ako má ten strom vyzerať
  čo a ako chceš zmeniť - farby, písmo a pod.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2401
  • Karma: 103
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Pomalé vykreslovanie TListView
« Odpověď #7 kdy: 18-10-2019, 12:32:30 »
A pokud mas moc zaznamu (kolik?) tam pouzij virtualTreeView.
záznamov je max 500, zvyčajne 200
To je nic, ja jsem myslel, ze se bavime radove vice.

Embarcadero MVP - Czech republic

Offline František

  • Guru
  • *****
  • Příspěvků: 523
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Pomalé vykreslovanie TListView
« Odpověď #8 kdy: 18-10-2019, 12:52:32 »
To je nic, ja jsem myslel, ze se bavime radove vice.
aj tak mi načítanie 210 záznamov z DB to LV trvá cca 8s (bez priznaku beginupdate 35s)
« Poslední změna: 18-10-2019, 13:05:37 od František »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4575
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Pomalé vykreslovanie TListView
« Odpověď #9 kdy: 18-10-2019, 13:17:02 »
Overoval si, koľko trvá samotné načítanie údajov z DB? Neviem či čítaš priamo z tabuľky alebo pomocou Query. Predpokladám, že zádrh bude v ošetrovaní TListView.
Pošli mi čo som písal a urobím Ti základný vzorový projekt.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 836
  • Karma: 45
    • Verze Delphi: 10.3
Re:Pomalé vykreslovanie TListView
« Odpověď #10 kdy: 18-10-2019, 14:18:18 »
aj tak mi načítanie 210 záznamov z DB to LV trvá cca 8s (bez priznaku beginupdate 35s)

Pak je prostě třeba tu úlohu testovat po částech - jak dlouho trvá samotné načtení z databáze, aniž by se údaje dál předávaly? Jak dlouho by trvalo přidání položek, které nejsou z databáze, ale je to jen něco jako IntToStr(i)?

Offline František

  • Guru
  • *****
  • Příspěvků: 523
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Pomalé vykreslovanie TListView
« Odpověď #11 kdy: 18-10-2019, 14:19:44 »
Neviem či čítaš priamo z tabuľky alebo pomocou Query.

Mám zaužívaný taký system že z DB čítam cez Query s ConectionPool a potom rezult múvnem do MemTable a odpojím DB, a funkcia vracia ako MemTable ako rezult, a s tým ďalej pracujem

Offline František

  • Guru
  • *****
  • Příspěvků: 523
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Pomalé vykreslovanie TListView
« Odpověď #12 kdy: 19-10-2019, 20:48:09 »
odpoveď na všetko je 42


keby niekto nevedel tak VirtualStringTree

z 8s ListView na 0.12s VST, no paráda

Stanislav, ďakujem za trpezlivosť