Autor Téma: Ako na to?  (Přečteno 10321 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #15 kdy: 26-04-2014, 13:50:15 »
Citace
Čtu si ten tvůj úvodní příspěvek a vůbec se mi nelíbí, že máš nějakou globální proměnnou MyClass, kterou neustále měníš.
Veľmi si nepamätám všetky dôvody pre toto riešenie. Robil som to ako som vedel.
Idem urobiť hĺbkovú analýzu. Predpokladám, že jej výsledkom bude zrušenie MyClass.
« Poslední změna: 26-04-2014, 15:31:34 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #16 kdy: 03-05-2014, 11:26:11 »
Tak som sa pustil do štúdia vzorov. Vychádza mi nasledovné:

Prvý problém:
Pôjdem podľa #9 2) explicitni binding...

Vzor Singleton nepotrebujem, lebo
  - inštancie vytvorím pri spustení programu
  - inštancie zničím pri ukončení programu
  - pri zmene projektu (DB - Access) zmením/nastavím hodnoty (typicky DataSet) vo všetkých inštanciách

Ďalej predpokladám nasledovné:
  - vytvorím triedu vzoru Factory
  - do uzlov si uložím identifikátor triedy
 
Použitie Factory
Kliknem na uzol a budem tam mať niečo také
  - Factory(IdTriedy).metodax
  - Factory(IdTriedy).metoday 

Druhý problém
Používam TActionManager a neviem ako ho správne riešiť.

Teraz tam mám pár Action (berme len Insert, Edit, Post, Cancel, Delete). Riešim ich cez globálny MyClass.
Kód: Delphi [Vybrat]
  1. procedure TfrmMain.actInsertExecute(Sender: TObject);
  2. begin
  3. {$IF isDemo}
  4.   if adoipv(CurrClass.ADOTable, 0) then
  5.     Exit;
  6. {$IFEND}
  7.  
  8.   CurrClass.InsertRecord;
  9. end;
  10.  
MyClass sa chcem zbaviť. Vidím dve možnosti:
  - doplním samostatné actions pre každú triedu. Bude ich tam asi 5 x 20
  - nejakým spôsobom priradím do action správnu udalosť - pre aktuálnu inštanciu. Netuším ako.

Je iná možnosť?
« Poslední změna: 03-05-2014, 11:45:33 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline starous

  • Mladík
  • **
  • Příspěvků: 59
  • Karma: 2
Re:Ako na to?
« Odpověď #17 kdy: 03-05-2014, 21:15:01 »
MyClass sa chcem zbaviť. Vidím dve možnosti:
  - doplním samostatné actions pre každú triedu. Bude ich tam asi 5 x 20
  - nejakým spôsobom priradím do action správnu udalosť - pre aktuálnu inštanciu. Netuším ako.

Je iná možnosť?


Tam bude nějaký zakopaný pes už v základním návrhu té aplikace. Mám tomu rozumnět tak, že těch 20 tříd představuje práci nad 20 různými databázovými tabulkami?

Dále nerozumím proč přenášíš logiku práce s datasetem na uživatelské rozhraní. Zkus ty akce pojmout z hlediska uživatele a ne z hlediska databáze.

Když nad tím přemýšlím, tam v tom stromu mohou být různé typy uzlů, kde každý uzel přestavuje různý objekt. U každého objektu zřejmě eviduju různé údaje (proto je tam pravdědpodobně ten PageControl s mnoha záložkami) a samozřejmě to jiným způsobem ukládám.

Když nad tím přemýšlím, tak bych spíš pro každý typ uzlu vytvořil specifický formulář a vedle toho třídu, která bude zastávat roli datového modelu. K tomu si vytvořit 2 továrny - jednu pro generování formulářů a druhou pro generování datových modelů. Asi nedjříve vytvořit objekt datového modelu a pak formulář, kterému se jako parametr předá odkaz na datový model. Jde o to, že by datový model neměl nic vědět o fomuláři, který jej používá.

Obsluha akcí v TActionManager pak může vypadat tak, že budeš volat v rámci akce metodu v datovém modelu. Akcí zůstane jen 5, ale každý datový model si to bude řešit po svém.

Obě továrny by měly mít zřejmě za úkol, aby v danou chvíli existoval jen jeden formulář (resp. datový model).

Ber to jen jako určitou úvahu k zamyšlení - nevím, co přesně řešíš.


Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #18 kdy: 04-05-2014, 07:47:12 »
  - nejakým spôsobom priradím do action správnu udalosť - pre aktuálnu inštanciu. Netuším ako.
Je iná možnosť?
Akci bys mel mit jen jednu, ktera zavola polymorfni metodu, stejne jako to delas pres tu globalni tridu tj. napr. CurrClass.InsertRecord

Rozdil bude v tom, ze ty nebudes volat globalni tridu, ale instanci, ktera je spojena s konkretnim stromem + uzlem.

Kdybys pouzil tridu pro reprezentaci uzlu, tak by sis musel udelat nejakou obdobu  GetNodeData() tak, aby ti ji vratila (v podstate pretypovala NodeData na nejakou tvoji polymorfni tridu) a na ni bys volal   NodeClass.InsertRecord (to je reseni 1/)

Ale ty chces reseni 2/, takze musis normalne ziskat GetNodeData() a v nich (pravdepodobne v nekterem poli recordu predstavujici NodeData) musis mit ulozenou primo referenci na odpovidajici NodeClass (kterou si tam priradis pri vytvareni uzlu) a nebo tam musis mit nejake ID teto instance a tu pak vyloudit na factory.


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #19 kdy: 04-05-2014, 10:14:49 »
Citace
Mám tomu rozumnět tak, že těch 20 tříd představuje práci nad 20 různými databázovými tabulkami?
Áno.
Citace
Dále nerozumím proč přenášíš logiku práce s datasetem na uživatelské rozhraní. Zkus ty akce pojmout z hlediska uživatele a ne z hlediska databáze.
Lebo som to ináč nevedel.
Citace
Když nad tím přemýšlím, tam v tom stromu mohou být různé typy uzlů, kde každý uzel přestavuje různý objekt.
Typy uzlov sa menia len podľa Node.Level, okrem jednej výnimky, ktorú si viem ošetriť.
Citace
Když nad tím přemýšlím, tak bych spíš pro každý typ uzlu vytvořil specifický formulář a vedle toho třídu, která bude zastávat roli datového modelu.
Tým by som prišiel o štýl "všetko v jednom". V prípade použitia samostatných formulárov by som to mal dávno v poriadku.
Citace
Rozdil bude v tom, ze ty nebudes volat globalni tridu, ale instanci, ktera je spojena s konkretnim stromem + uzlem.
Zas ma budete biť, že riešim čo nemám. Mám strom a v ňom 100 uzlov na úrovni 1. Riešenie 1) znamená vytvoriť 100 rovnakých inštancií triedy. Riešenie 2) znamená len 1 inštanciu triedy. Mám sa na to vykašľať? Myslím tým na počet vytvorených inštancií. Ja to vidím ako plytvanie systémovými prostriedkami.
Citace
Kdybys pouzil tridu pro reprezentaci uzlu, tak by sis musel udelat nejakou obdobu  GetNodeData() tak, aby ti ji vratila (v podstate pretypovala NodeData na nejakou tvoji polymorfni tridu) a na ni bys volal NodeClass.InsertRecord (to je reseni 1/)
Až teraz vidím o čo ide  :) Nechápal som to.
Citace
Ale ty chces reseni 2/,...
Ešte nie som rozhodnutý. Nechápal som riešenie 1) a OOP ma svojou logikou a možnosťami dosť trápi.
Pokiaľ nevadí nejaká stovka inštancií tried namiesto asi 20, tak sa začnem prikláňať k riešeniu 1)

V prílohe je pár charakteristických snímok programu ako to mám.


« Poslední změna: 04-05-2014, 11:47:31 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 20
    • Verze Delphi: D2007, XE3
Re:Ako na to?
« Odpověď #20 kdy: 04-05-2014, 11:57:16 »
pre dnesne pocitace aj pre pocitace z pred piatich rokov je 100 tried nic, aj 1000 tired je nic. Znepokojovat by ma zacali az desatisice tried. Zacal by som uvazovat nad nejakou tou optimalizaciou, ale aj desatisice tried dnesne pocitace zvladnu. Instancie triedy su praveze setrne v tom ze pri ich vytvoreni sa samozrejme alokuje ku kazdej instancii nejaka ta drobna rezijna pamat a potom uz len pamat pre jej datove polozky. Jej exekucny kod sa do pamate zavedie len raz. Priemerne sa v triedach vytvara tak nekolko malo premennych, az niekolko desiatok. To znamena ze si tam das niekolko ciselnych premennych ktore potrebujes, sem tam nejaky boolean, sem tam nejaky ten pointer, nejake to handle. Pokial v triede nepouzivas nejake divoke buffre, velkorozmerne polia, dlhe stringy a tak podobne, tak ti instancia alokuje 100, 200, 300, 400 bajtov. A to aj po vynasobeni 100x je stale nic. Takze nemaj obavy. Existuje aj jeden taky programatorsky smer, ktory neviem presne ako sa vola, ale v nom programatori radsej volia nesetrne zaobchadzanie s prostriedkami systemu koli prehladnejsiemu a bezpecnejsiemu kodu a spoliehaju sa na to ze vykon dnesnych PC proste enormne rychlo rastie. Nie ze by som tento smer obhajoval, ale prehladnost a urcitu blbovzdornost a bezpecnost kodu staviam na jedno z prvych miest pri vyvoji. A ak to ma zvisit spotrebu ramky mojej aplikacie zo 40MB na 80MB tak kludne. Ak ma moja apka vytazit procesor o 5% viac tak kludne. Kebyze vyvyjam aplikaciu pre desatisice a statisice zakaznikov tak si do tymu nasadim par optimalizatorov, ak robim aplikaciu pre jednotky az desiatky zakaznikov a na jej vyvoji sa ucastni 1,5 vyvojara, tak bez hamby obetujem tych niekolko percent systemovych prostriedkov pre skratenie a sprehladnenie vyvoja.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #21 kdy: 04-05-2014, 13:28:31 »
Zas ma budete biť, že riešim čo nemám. Mám strom a v ňom 100 uzlov na úrovni 1. Riešenie 1) znamená vytvoriť 100 rovnakých inštancií triedy. Riešenie 2) znamená len 1 inštanciu triedy. Mám sa na to vykašľať? Myslím tým na počet vytvorených inštancií. Ja to vidím ako plytvanie systémovými prostriedkami.
Ja jsem ti doporucoval reseni 2) hlavne kvuli klonovani uzlu napr. pri D&D operacich, coz je v Delphi dost zapeklita vec. Kdyby ten strom mel jako uzel  objekt a Delphi podporoval cloneable objekty, tak by vubec nebylo co resit ... 1)


« Poslední změna: 04-05-2014, 13:32:44 od pf1957 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #22 kdy: 05-05-2014, 08:33:12 »
Vďaka za odpovede
Citace
Ja jsem ti doporucoval reseni 2) hlavne kvuli klonovani uzlu napr. pri D&D operacich
To si pamätám. Písal som, že si zistím presúvané uzly a potom
  - vytvorím nové uzly kde ich potrebujem. Väčšinou musím obslúžiť naraz viac stromov
  - vymažem "presúvané" uzly

Preto si myslím, že D&D operácie ma nemusia trápiť. Skúsim na jednoduchom príklade zrealizovať tú 1)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #23 kdy: 05-05-2014, 12:41:10 »
Preto si myslím, že D&D operácie ma nemusia trápiť. Skúsim na jednoduchom príklade zrealizovať tú 1)
Kdyz to budes zkouset, tak nezapomen, ze
- NodeDataSize pro tebe bude sizeof(pointer) -> pointer ma ruznou velikost pro 32/64bit platformu
- ze musis implementovat OnNodeFree, kde budes instanci te tridy uvolnovat
- abys to nemusel stale pretypovavat, tak ze se vyplati udelat nejake metody GetNodeObject ev. SetNodeObject ev. rovnou property NodeObjects[Node:PVirtualNode]: TNodeXXXClass

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #24 kdy: 08-05-2014, 10:42:47 »
Podľad príkladov som urobil nasledovné:
Kód: Delphi [Vybrat]
  1. type
  2. TBasicNodeData = class // v skutočnosti budem používať jeho potomka
  3.  protected
  4.     FTyp: Integer;      
  5.     FName: String;
  6.     FPageList: TJvPageList;      
  7.   public
  8.     constructor Create; overload;
  9.     constructor Create(AName: String; AIIndex: Integer = 0); overload;
  10.     procedure ShowPage;
  11.  
  12.     property Name: String read FName write FName;
  13.     property Typ: Integer read FTyp write FTyp;
  14.   end;
  15.  
  16. PTreeData = ^TTreeData;
  17.  
  18. TTreeData = record
  19.   BasicND: TBasicNodeData;
  20. end;
  21.  
  22. constructor TBasicNodeData.Create;
  23. begin
  24.  FTyp := 0;
  25.  FName := '';
  26. end;
  27.  
  28. constructor TBasicNodeData.Create(AName: String; AIIndex: Integer);
  29. begin
  30.   FTyp := AIIndex;
  31.   FName := AName;
  32. end;
  33.  
  34. procedure TBasicNodeData.ShowPage;
  35. begin
  36.   // Tak si predstavujem riešenie pre 1)
  37.   FPageList.ActivePageIndex := FTyp;
  38. end;
  39.  
  40. unit MainForm;
  41.  
  42. procedure TForm1.FormCreate(Sender: TObject);
  43. var
  44.   Node: PVirtualNode;
  45.   NodeData: PTreeData;
  46. begin
  47.   vstRigth.NodeDataSize := SizeOf(TBasicNodeData);
  48.   Node := vstRigth.AddChild(nil);
  49.   NodeData := vstRigth.GetNodeData(Node);
  50.   NodeData.BasicND := TBasicNodeData.Create('new project');
  51. end;
  52.  
  53. procedure TForm1.vstRigthFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
  54. begin
  55.   PTreeData(Sender.GetNodeData(Node)).BasicND.Free;
  56. end;
  57.  
  58. procedure TForm1.vstRigthGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  59.   Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
  60. var
  61.   NodeData: PTreeData;
  62. begin
  63.   NodeData := Sender.GetNodeData(Node);
  64.   Text := NodeData.BasicND.Name;
  65. end;
  66.  
  67. procedure TForm1.vstRigthNodeClick(Sender: TBaseVirtualTree; const HitInfo: THitInfo);
  68. var
  69.   NodeData: PTreeData;
  70. begin
  71.   NodeData := Sender.GetNodeData(HitInfo.HitNode);
  72.   lstPartFS.ActivePageIndex := NodeData.BasicND.Typ;
  73.  
  74.   // pre 1), avšak bez NodeData.
  75.   NodeData.BasicND.ShowPage;
  76. end;
  77.  

Avšak to je riešenie 2).

Neviem, ani len netuším, ako mám zrealizovať
Citace
1) uplne zapouzdreni, kdy kazdy uzel bude predstavovan instanci vhodne polymorfni tridy
+ ako sa (hocikedy a hockde), v princípe, dostanem k požadovanej inštancii   
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #25 kdy: 09-05-2014, 10:18:03 »
Avšak to je riešenie 2).
Ne, to neni reseni 2). Tam bys mel jen nekolik globalnich instanci (ktere ses drive snazil prepinat do globalni promenne), jejiz odkaz nebo ID bys prirazoval uzlu v NodeData, ktere by obsahovalo dalsi hodnoty jako Name, Typ etc...  Tady ma kazdy uzel vlastni instanci a NodeData nepouziva k nicemu jinemu, nez zapamatovani odkazu na ni, cili si vyrabis property Node.Object.

Priklad sis udelal prilis jednoduchy - mel bych udelat alespon 2 potomky basalni tridy a alespon 2 uzly a alespon jeden pridavany nejakou akci uzivatele tj. mimo konstruktor (tedy pokud to potrebujes v aplikaci).

Citace
1) uplne zapouzdreni, kdy kazdy uzel bude predstavovan instanci vhodne polymorfni tridy
Tak, ze vsechny operace s uzly udelas polymorfni, tj. kdyz budes chtit provest nejakou operaci s jakymkoli typem tveho uzlu, tak zavolas vhodnou metodu basalni tridy a nikde uz nebudes zjistovat typ uzlu. V ucebnicich se to vyklada zpravidla na grafickych tvarech: kdyz potrebujes posunout po obrazovce nejaky objekt, zavolas napr. metodu MoveTo(x,y) a nestaras se o to, jestli presouvas kruznici, obdelnik, text nebo cokoli jineho. V praxi to udelas tak, ze takove metody v basalni tride udelas abstraktni a tim a) znemoznis vytvareni instance basalni tridy - neni k tomu urcena - definuje jen spolecne vlastnosti/rozhrani b) vynutis, ze kazdy potomek musi takovou metodu overridnout.

Citace
+ ako sa (hocikedy a hockde), v princípe, dostanem k požadovanej inštancii
Budes si muset udelat u formulare napr. property FocusedNodeClass formulare, ktera bude typu tve basalni tridy a zajistis, aby vracela hodnotu focusnuteho uzlu ve focusnutem stromu.

--
 
Mit u NodeClass metodu ShowPage neni moc dobre s ohledem na decoupling: uzel by nemel nic vedet o tom, ze existuje nejake FPagelList (!) ani o tom, ze je FPageList indexovany (co kdybys to nahradil jinym widgetem nez page control - to by se praci s uzly nemelo vubec dotknout). To je starost nekoho jineho. Abys to nemel svazane, tak bys mel mit nekde pomocnou mapovaci metodu NodeTypeToPageIndex(NodeClass), nejspis jako metodu formulare, ktery obsahuje stromy a prepinatelne stranky, v horsim pripade property NodeClass.TypeAsPageIndex, kdy bys tu mapovaci metodu udelal soucasti basalni tridy uzlu. Ale prepinat PageList by uzel nemel - on se stejne pri prepnuti uzlu ve stromu ev. pri prepnuti stromu nedostane k lizu, to stejne zajistujes tak, ze nekde odchytis zmenu uzlu a pak volas ShowPage (BTW, sam nazev je matouci - melo by se to jmenovat Select/Choose/Switch/Change/...)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #26 kdy: 09-05-2014, 10:39:20 »
Citace
Priklad sis udelal prilis jednoduchy
Schválne. Na objasnenie princípu to stačí. A bojoval som aj s uvedením príkladu do praxe :)
Citace
Budes si muset udelat u formulare napr. property FocusedNodeClass formulare, ktera bude typu tve basalni tridy a zajistis, aby vracela hodnotu focusnuteho uzlu ve focusnutem stromu.

Vďaka tomuto sa mi to začína konečne trocha vyjasňovať. Nejaký deň mi to potrvá. Ďakujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #27 kdy: 10-05-2014, 11:17:44 »
Trochu úvahy
Citace
Budes si muset udelat u formulare napr. property FocusedNodeClass formulare, ktera bude typu tve basalni tridy a zajistis, aby vracela hodnotu focusnuteho uzlu ve focusnutem stromu.

A toto je momentálne kameň úrazu. Môžme to prirovnať k môjmu MyClass := SomeClass;
Teraz to mám rozhádzané po celom formulári. Viď #13, odsek pred Model riešenia Ak to mám všetko sústrediť na jedno miesto, tak to bude veľmi zložité (kopa if) a určite tam nasekám kopu chýb.

Moja predstava bola, že kliknem na uzol a vložená trieda (potomok základne triedy) sa o všetko postará. Tá trieda si nesie so sebou všetky potrebné informácie a dáta! Ale to mi nerieši napr. problém zobrazenia záložky.

* Teraz to riešim tak, že si pre každú záložku pamätám (momentálne veľmi komplikovane)
  - posledný VST s focusom
  - posledný uzol s focusom
 
Pri zobrazení záložky ju chcem mať tak, ako bola zobrazená naposledy. Niektorým záložkam priraďujem komponenty dynamicky pomocou nastavenia ich Parent. Aj preto to musím obslúžiť vždy!

1) neviem čo použiť z formulára (metóda), aby som to vedel obslúžiť
2) property FocusedNodeClass formulare mi nebude fungovať pri prepnutí záložky
3) ako si v tej metóde za každých okolností zistím ten správny strom a uzol.
  - zmením záložku
  - kliknem na prázdne miesto vo VST
  - VST je prázdny (to urobím, ale opäť to komplikuje metódu)
  - nevolať zbytočne túto metódu pri Insert/Edit záznamu a iných príležitostiach
  - kliknem na ToolButton (za toto dostanem vynadané. Berte to s rezervou)
4) predpokladám, že sa neobídem bez zoznamov. Tak ako to mám teraz *

Ak vyriešim "property FocusedNodeClass formulare", tak som za vodou.

Poznámka: telefonicky by to bolo behom 5 - 10 minút. Tak to bude 5 - 10 dní :(
« Poslední změna: 10-05-2014, 12:01:00 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #28 kdy: 10-05-2014, 15:32:47 »
* Teraz to riešim tak, že si pre každú záložku pamätám (momentálne veľmi komplikovane)
  - posledný VST s focusom
  - posledný uzol s focusom
Na zapamatovani posledniho focusnuteho VTV staci obslouzit metodu OnEnter u vsech VTV spolecnym handlerem, ne? A vlastni VTV ma property FocusedNode...

Citace
Poznámka: telefonicky by to bolo behom 5 - 10 minút. Tak to bude 5 - 10 dní :(
To jsi celkem optimista :-) Podle me je to je zraly na http://www.sscce.org

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #29 kdy: 10-05-2014, 15:52:18 »
Citace
Na zapamatovani posledniho focusnuteho VTV staci obslouzit metodu OnEnter u vsech VTV spolecnym handlerem, ne? A vlastni VTV ma property FocusedNode...
Ja si ho potrebujem pamätať pre každú záložku samostatne. Mám tam dva VST. Preto toľko cirkusu. AHA, s tým uzlom som to prehnal.
Citace
To jsi celkem optimista :-)
Mal som na mysli iba pochopenie ako to urobím. Nie samotnú realizáciu :D
Citace
1) neviem čo použiť z formulára (metóda), aby som to vedel obslúžiť
Momentálne ma trápi toto. Ak to vyriešim, tak sa môžem trocha pohnúť.

Edit: Všetky uzly na jednej záložke budú mať spoločného predka odvodného od Basic triedy. A tam bude strom.
BasicClass -> TabClass -> NodeClass
« Poslední změna: 10-05-2014, 16:05:40 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.