Autor Téma: Treevieew  (Přečteno 1024 krát)

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 144
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Treevieew
« Odpověď #15 kdy: 24-01-2021, 11:40:26 »
Excellent
Rated 1 time
Pokud budeš mít tabulku ve stylu:
ID (jednoznačné ID v tabulce kvůli opravám/mazání)
IDKategorie - vazbu na další tabulku s kategoriemi (auto, zábava, ...)
datum
popis
částka
...

Při plnění TreeView vytvoříš nejprve root nody (kategorie) a pak do nich budeš přidávat child nody z tabulky. Protože tam máš údaj o kategorii, tak to jednoduše rozhážeš do jednotlivých kategorií
Add/Edit/Delete si musíš zajistit sám - předpokládám, že se otevře nějaký formulář pro editaci. Při uložení aktualizuješ tabulku a pak provedeš aktualizaci TreeView. Při jednouživatelském přístupu stačí konkrétní řádek v TreeView, při víceuživatelském přístupu znovu naplníš TreeView.

Můžeš použít TreeView ve virtuálním režimu, ale pak se ti to trošku komplikuje s těmi úrovněmi. Tam by sis mohl pomoct tím, že rozbalená bude vždy jen jedna úroveň.

Offline hairdresser

  • Nováček
  • *
  • Příspěvků: 17
  • Karma: 0
    • Verze Delphi: Delphi PRO 10.3.1
Re:Treevieew
« Odpověď #16 kdy: 25-01-2021, 21:57:23 »
Moc Vám děkuji za cenné rady. Pořád s tím bojuji. A to hodně.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 144
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Treevieew
« Odpověď #17 kdy: 25-01-2021, 22:11:11 »
Excellent
Rated 1 time
Když jsem o tom přemýšlel, tak by to šlo zjednodušit.

Krok 1 - stáhnout tabulku kategorií a naplnit kategorie (root nody)
Krok 2 - při rozkliknutí kategorie, pokud není žádný child node, tak stáhnout obsah pouze pro danou kategorii a naplnit ji, pokud child node existuje, jen zobrazit.

Tím si ušetříš zbytečné plnění celého treeview na začátku

Editace
tady máš 2 možnosti
1. změny synchronně promítnout do TreeView a tabulky
2. promítnout změny pouze do tabulky, smazat a znovu naplnit obsah dané kategorie (stejně jako při prvotním rozkliknutí)




Offline František

  • Guru
  • *****
  • Příspěvků: 623
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Treevieew
« Odpověď #18 kdy: 25-01-2021, 23:49:11 »
Excellent
Rated 1 time
Kód: Delphi [Vybrat]
  1. Kategorie 1
  2. --Podkategorie 1_1
  3. --Podkategorie 1_2
  4. Kategorie 2
  5. --Podkategorie 2_1
  6. --Podkategorie 2_2
tento tvoj príklad vyzerá vid. obr. a priložený súbor
ten texťák môžeš nahrať do ItemsEditora TTreeView (cez Load) alebo alebo metódou LoadFromFile
taký trexták si vygeneruješ z DB




Offline František

  • Guru
  • *****
  • Příspěvků: 623
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Treevieew
« Odpověď #19 kdy: 26-01-2021, 00:15:17 »
ešte možnosti uloženia stromu v DB
1. klasika id-parent-order
2. Preorder Tree Traversal vid. https://www.zdrojak.cz/clanky/ukladame-hierarchicka-data-v-databazi-ii/

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Treevieew
« Odpověď #20 kdy: 26-01-2021, 09:38:56 »
Nechceš to skúsiť s VirtualStringTree? Neviem či si povinne viazaný na TreeView.
Ak by si to chcel vyskúšať, tak sa mi ozvi súkromnou správou. Nech to tu nezahltíme.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Guru
  • *****
  • Příspěvků: 623
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Treevieew
« Odpověď #21 kdy: 26-01-2021, 10:03:39 »
stanislav, netaj to ... šak to je prínosné aj pre iných

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Treevieew
« Odpověď #22 kdy: 26-01-2021, 12:40:07 »
Ja chcem za to peniaze!
Dobre, dám to tu formou prílohy. Tých súborov bude viac. Snáď dostanem spätne nejaké návrhy na vylepšenie.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Treevieew
« Odpověď #23 kdy: 26-01-2021, 12:48:15 »
Excellent
Rated 1 time
Tu to je. Dal som to bez akejkoľvek úpravy. Ak tam niečo chýba, dajte vedieť.
SQL.Text pre VST musia spĺňať určité podmienky. Zvlášť pre režim Table a Tree. Neviem či to v tých súboroch mám napísané.
Stojím o Vaše názory a pripomienky.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Treevieew
« Odpověď #24 kdy: 31-01-2021, 22:11:42 »
Hm, našlo sa niekoľko "sťahovačov", ale žiaden z nich nemá vlastný názor :(  Škoda. Dúfal som v nejakú spätnú väzbu :'(
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline hairdresser

  • Nováček
  • *
  • Příspěvků: 17
  • Karma: 0
    • Verze Delphi: Delphi PRO 10.3.1
Re:Treevieew
« Odpověď #25 kdy: 01-02-2021, 17:22:16 »
Dlouho jsem nad tim sedel:


var
  node: TTreeNode;

  function FindParentNode(id:Integer):TTreeNode;
  var
    i:Integer;
  begin
    Result := nil;
    for i := 0 to treeview1.Items.Count - 1 do
    begin
      if Integer(treeview1.Items.Data) = id then
      begin
        Result := treeview1.Items;
        Break;
      end;
    end;
  end;

begin
    treeview1.Items.BeginUpdate;
    treeview1.Items.Clear;
    FDMemTable1.First;
    while not FDMemTable1.Eof do
    begin
      if FDMemTable1.FieldByName('Parentid').AsInteger = -1 then
        treeview1.Items.AddObject(nil,FDMemTable1.FieldByName('Name').AsString,Pointer(FDMemTable1.FieldByName('id').AsInteger))
      else
      begin
        node := FindParentNode(FDMemTable1.FieldByName('parentid').AsInteger);
          treeview1.Items.AddChildObject(node,FDMemTable1.FieldByName('Name').AsString,Pointer(FDMemTable1.FieldByName('id').AsInteger));
      end;
     FDMemTable1.next;
    end;
    treeview1.Items.EndUpdate;

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Treevieew
« Odpověď #26 kdy: 01-02-2021, 19:04:27 »
Hm, akosi tej funkcii function FindParentNode(id:Integer):TTreeNode; nerozumiem.
Pozri sa, aké vlastnosti má TTreeNode. Napríklad TTreeNode.Parent. Nenahradí Ti to Tvoju funkciu?
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 144
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Treevieew
« Odpověď #27 kdy: 09-02-2021, 12:04:46 »
Hm, akosi tej funkcii function FindParentNode(id:Integer):TTreeNode; nerozumiem.
Pozri sa, aké vlastnosti má TTreeNode. Napríklad TTreeNode.Parent. Nenahradí Ti to Tvoju funkciu?

Nenahradí mu to, protože přidává nové nody a ty chce přidat ke správnému parent.
Pomohlo by mu spíš následující:
Seřadit tabulku tak, aby na začátku byly parent nody a zbytek byl seřazený dle parent nodů
Pak bys postupně vytvořil všechny parent, až bys narazil na první child, tak by sis našel jeho parent a postupně vytvářel child nody až do okamžiku, kdy by se změnil parent nod.
Tím bys eliminoval hledání parent nodu pro každý child nod.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5615
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Treevieew
« Odpověď #28 kdy: 09-02-2021, 12:25:48 »
Citace
Nenahradí mu to, protože přidává nové nody a ty chce přidat ke správnému parent.
To som si práve nebol istý. V tom kóde som sa stratil.
Otázka je, či ich pridáva z SQL, alebo dodatočne.
Lebo ako ich pridáva len z jediného SQL, tak má zlý postup.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3119
  • Karma: 136
    • Verze Delphi: D2007, XE3, DX10
Re:Treevieew
« Odpověď #29 kdy: 09-02-2021, 17:19:40 »
Lebo ako ich pridáva len z jediného SQL, tak má zlý postup.
Proc zly postup? Za predpokladu, ze SQL dotaz setridi uzly podle level, aby mel vzdy kam pridavat, tak mu to bude fungovat, ne?
To hledani by se dalo zefektivnit nejakym traverzovanim stromu misto linearnim scanem vsech uzlu, ale to lze povazovat za optimalizaci a na tu ma casu dost, pokud by jim potreboval.

Jina vec je, pokud by tech uzlu bylo hodne a chtel prejit do virtualniho rezimu - tam se to pak necte vsechno naraz, ale on demand v nejake OnExpand udalosti. Pak mu staci nacist jen uzly na nejvyssi urovni.