Hirdetés

Aktív témák

  • Alan

    aktív tag

    válasz lao ce #69 üzenetére

    Hát, nem biztos, hogy akkora mázli, mert így az első két olvasás után attól tartok, rossz híreim vannak.

    A VT működését jól értelmezed, valóban ezért villámgyors, de adatbáziskezeléshez nyers formában nem a legoptimálisabb, mert azon alapul, hogy a memóriában lévő adatstruktúrádból Te magad veszed majd elő neki az adatot (OnGetText) jó gyorsan, így nem kell az adatokat neki még egyszer letárolnia valahol (mint azt a ''klasszikus'' TTreeView teszi). Ha az OnGetText eseménykezelőben Te adatbázishoz fordulsz, akkor akár el is mehetsz vacsorázni közben (ahogyan láttad is).

    Azért nem reménytelen a helyzet, de mindenképpen létre kell hoznod valami gyorsítótárat a memóriában, különben használhatatlan lesz a programod. Arra gondoltam, hogy először is definiálsz egy struktúrát, mondjuk egy rekordot, amiben a tulajdonságfa egy csomópontjának adatai teljesen beleférnek (olyasmi lesz ez, mint egy adatbázisrekord). Az első select alapján beállítod a RootNodeCount tulajdonságot, erre elkezdenek áramlani az OnInitNode események. Ezekben a gyökérelemeknél nem csinálsz mást, csak megjegyzed, hogy melyik eredménysorhoz melyik node tartozik, és beállítod, hogy van neki gyermeke, valahogy így:

    [CODE]
    procedure TLaoCeForm.VSTInitNode(...);
    var Data: TLaoCeNodeData;
    begin
    if ParentNode = nil // ezek a root node-ok
    then
    InitialStates := InitialStates + [ivsHasChildren]
    else begin // ezek meg a subselectek-hez tartozó node-ok lesznek
    Data := Sender.GetNodeData(Node);
    {itt kitöltöd a cuccaiddal az adatstruktúrát}
    end;
    end;
    [/CODE]

    Ezek után az a lényeg, hogy az OnInitChildren eseménykezelőben lefuttathatsz egy-egy subselect-et az aktuális node-hoz eltárolt paraméter alapján, és beállíthatod, hogy hány eredménysora van (erre megint beindulnak az OnInitNode-ok, de már a gyermekelemekre), a többit meg elintézed a fenti OnInitNode eseménykezelőben. Az általam TLaoCeNodeData-nak nevezett struktúrát tehát jól találd ki.

    Ezzel a megoldással megúszod a teljes adatbázis letárolását a memóriában, de a jó teljesítményhez annyit muszáj megtenned, hogy a képernyőn látható (a megnyitott node-okhoz tartozó) adatok a memóriában legyenek.

    Bedobhatsz egy olyan trükköt is, hogy egyszerre csak egy root node-ot lehessen lenyitni, a második lenyitásakor a korábban már lenyitottat felcsukod, így a hozzá tartozó gyermekelemeknek a memóriáját (TLaoCeNodeData csomagjait) klasszul újra felhasználhatod az aktuálisan lenyitott node-hoz.

    Végső soron tény, hogy nem kifejezetten DataSet típusú működéshez találták ki ezt a komponenst - de annál szebb a kihívás, nemde? :)

    (Ha nagyon sz**sz vele, tudok küldeni kisebb példakódokat, de szerintem ez alapján már minden OK lesz.)

Aktív témák