Forum Delphi.cz

Delphi => Obecné => Téma založeno: František 17-10-2019, 16:16:43

Název: Pomalé vykreslovanie TListView
Přispěvatel: František 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?
Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: František 18-10-2019, 09:33:18
nič nikoho nenapadá?
Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: Radek Červinka 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.
Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: pf1957 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
Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: František 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
Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: František 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 (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;
Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: Stanislav Hruška 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.
Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: Radek Červinka 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.

Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: František 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)
Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: Stanislav Hruška 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.
Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: vandrovnik 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)?
Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: František 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
Název: Re:Pomalé vykreslovanie TListView
Přispěvatel: František 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ť