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

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2595
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #30 kdy: 10-05-2014, 16:09:59 »
Ja si ho potrebujem pamätať pre každú záložku samostatne. Preto toľko cirkusu.
A ono nejde ve spolecnem handleru OnEnter pres ActivePage/ActivePageIndex zapamatovat ten Sender pro current page?

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úť.

Jenomze me zase neni jasne, co presne chces resit - kolik a jakych widgetu tam vubec mas, ktery widget je na kterem zavisly apod.  V zasade jsou tri eventy, ktere asi budes muset obsluhovat:
- TPageControl.OnChange
- TBaseVirtualTree.OnEnter (spolecny)
- TBaseVirtualTree.OnFocusedNodeChanged (spolecny)

Nic dalsiho bys nemel potrebovat. Ale kdo vi? Proto ten SSCCE: mel bys udelat minimalistickou aplikaci oprostenou od vseho, co neni pro tvoje navigacni potreby/zamery podstatne a rozchodit to. A presne jak pisou na tom SSCCE: jen tolik uzlu, zalozek aj., kolik je potreba pro predvedeni pozadavku/problemu.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #31 kdy: 10-05-2014, 16:19:36 »
Citace
A ono nejde ve spolecnem handleru OnEnter pres ActivePage/ActivePageIndex zapamatovat ten Sender pro current page?
Ja som bojoval s tým, kde si to uložiť. Do samotného NodeClass to nebolo dobre.
Citace
Nic dalsiho bys nemel potrebovat.
Takto to v základe mám. Lenže ja chápem
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.
ako jedinú metódu, kde získam požadovanú triedu. Asi to chápem zle, ale tak mi to vyplýva z textu.
Citace
Proto ten SSCCE: mel bys udelat minimalistickou aplikaci oprostenou od vseho, co neni pro tvoje navigacni potreby/zamery podstatne a rozchodit to. A presne jak pisou na tom SSCCE: jen tolik uzlu, zalozek aj., kolik je potreba pro predvedeni pozadavku/problemu.
To plánujem, ale ešte tápem v OOP. Potrebujem si vyjasniť ten " FocusedNodeClass ".
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2595
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #32 kdy: 10-05-2014, 16:35:02 »
ako jedinú metódu, kde získam požadovanú triedu. Asi to chápem zle, ale tak mi to vyplýva z textu.
To chapes dobre, ale nejak mi neni jasne, co je za problem: potrebujes napsat getter, ktery vrati instanci NodeClass nebo nil.
To muzes udelat treba pollovanim, kdy budes traverzovat form az najdes VTV, ktery ma property Focused=True. A nebo si udelas OnEnter handler a ulozis si hodnotu Sender do nejake member variable u formu a v getteru tu hodnotu pouzijes.
Jakmile budes mit VTV, pouzijes jeho property FocusedNode a pres jeho NodeData se dostanes k instanci, kterou pretypujes na basalni typ a tu vratis.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #33 kdy: 10-05-2014, 16:49:20 »
Hm, a nenarazím na problém, že:
Zmením Tab. Pôvodný VST stratí focus ale žiaden VST ho na novom Tab ho nezíska? A ja chcem získať ten, čo mal focus pri poslednej návšteve.

Môžem si to uľahčiť tým, že vždy pri prepnutí Tab zobrazím prázdnu Page a užívateľ bude musieť kliknúť na uzol/strom. To by som nerád. Ale za tejto podmienky môžem začať na tom pracovať.
« Poslední změna: 10-05-2014, 17:04:26 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2595
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #34 kdy: 10-05-2014, 17:59:15 »
Hm, a nenarazím na problém, že:
Zmením Tab. Pôvodný VST stratí focus ale žiaden VST ho na novom Tab ho nezíska? A ja chcem získať ten, čo mal focus pri poslednej návšteve.

Môžem si to uľahčiť tým, že vždy pri prepnutí Tab zobrazím prázdnu Page a užívateľ bude musieť kliknúť na uzol/strom. To by som nerád. Ale za tejto podmienky môžem začať na tom pracovať.
Jestli si to spravne pamatuju, tak VCL focusne prvni focusable widget v containeru. Takze ano, muze se ti stat, ze po prepnuti containeru (nevim, jaky je u tebe rozdil bezi TAB, zalozkou, page apod) se ti zadny VTV nefocusne resp. se ti focusne jiny. Ale to je prece obecny problem, ktery nema zadny vztah k property FocusedNodeClass: kdyz nebude zadny VTV resp. jeho uzel focusnuty, bude to vracet nil.

A pokud nechces, aby uzivatel musel kliknout tj. potrebujes udelat nejaky widget focused by default, tak si to musis zajistit sam pri prepinani containeru popr. pri nejake interni inicializace pameti stavu...

Ale takhle diskutovat fakt nema cenu...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #35 kdy: 11-05-2014, 09:49:09 »
Citace
Ale takhle diskutovat fakt nema cenu...
Súhlasím. Už som sa cítil aj trochu trápne. Idem si urobiť príklad a budem tu prípadne dávať len konkrétne veci. Teórie tu bolo dosť.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #36 kdy: 16-05-2014, 10:24:06 »
Citace
abys to nemusel stale pretypovavat, tak se vyplati udelat nejake metody GetNodeObject
 ev. SetNodeObject ev. rovnou property NodeObjects[Node: PVirtualNode]: TNodeXXXClass
a už tu som sa zasekol
Kód: Delphi [Vybrat]
  1.   TNodeBasic = class
  2.   strict private
  3.     procedure SetNodeObject(const Value: cokolvek);  
  4.  strict protected
  5.  
  6.   public
  7.     property NodeObject[Node: PVirtualNode]: cokolvek write SetNodeObject;
  8.   end;
  9.  
1)
nech tam dám čokoľvek, tak vždy dostanem oznam
[DCC Error] MainForm.pas(97): E2008 Incompatible types
[Node: PVirtualNode] je array. PVirtualNode je pointer. Mne to nejde do kopy  :-[

2)
Podľa mojich predstáv je TNodeXXXClass = class(TNodeBasic). A to sa nedá zrealizovať. Mám zmeniť predstavu?
 
« Poslední změna: 16-05-2014, 10:28:48 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2595
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #37 kdy: 16-05-2014, 17:31:56 »
Kód: Delphi [Vybrat]
  1.     property NodeObject[Node: PVirtualNode]: cokolvek write SetNodeObject;
  2.  
Protoze kdyz mas indexovanou property, musi  signatura getteru/setteru obsahovat hodnotu(y) index(u), napr.
Kód: Delphi [Vybrat]
  1.   function GetP(x,y,z:integer): string;
  2.   procedure SetP(x,y,z:integer; const value:string);
  3.   property P[x,y,z:integer]: string read GetP write SetP;
« Poslední změna: 16-05-2014, 17:37:41 od pf1957 »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2595
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #38 kdy: 17-05-2014, 07:34:02 »
Podľa mojich predstáv je TNodeXXXClass = class(TNodeBasic). A to sa nedá zrealizovať. Mám zmeniť predstavu?
Nevim, jestli ti rozumim, ale pokud jdes cestou polymorfnich trid, pak za cokolvek musis dat abstraktni tridu (spolecneho predka)
Kód: Delphi [Vybrat]
  1. TTree1BasalNodeClass  = class(TAbstractNodeClass);
  2. TTree1Node1Class  = class(TTree1BasalNodeClass);
  3. TTree1Node2Class  = class(TTree1BasalNodeClass);
  4.  
  5. TTree2BasalNodeClass  = class(TAbstractNodeClass);
  6. TTree2Node1Class  = class(TTree2BasalNodeClass);
  7. ...
  8.  
  9. property NodeObject[Node: PVirtualNode]: TAbstractNodeClass read GetNodeObject write SetNodeObject;
  10.  

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 462
  • Karma: 20
    • Verze Delphi: D2007, XE3
Re:Ako na to?
« Odpověď #39 kdy: 17-05-2014, 09:12:58 »
Stando, je pekne vidiet ako sa snazis a zlepsujes, ale mal by som pre teba jedno odporucanie. Vidno to a aj sam niekde v tomto alebo inom vlakne (uz presne neviem) uvadzas ze ti OOP este nie je dost jasne a ze s nim dost bojujes. Pre tvoje dobro by som ti odporucal si nastudovat niekde nejaky 10 az 20 dielny tutorial o OOP, aby si pri kazdom druhom probleme nebadal ze kde ti to koliduje. Podla mojho nazoru takyto serial nastudujes za 2x2hodiny a budes uplne niekde inde. Ked som sa ja zacinal ucit programovat, internet sme nemali a ked som na nom dakedy aj bol, tak google este neexistoval. O slovenskych, alebo ceskych strankach nebolo ani chyru. Anglicke studium ma unavovalo, takze ja som sa ucil programovat z knih. Proste som si zohnal knihu o delphi ale taku tu polopatisticku, proste pre zaciatocnika kde venovali 30 az 40 stran OOP a viedli ma krok za krokom. Treba si to prejst, vyskusat aj uvadzane priklady, nech clovek prakticky pochopi o com sa tam pise. Da sa to zvladnut za niekolko hodin a clovek ma v tom potom aspon jasno. Aj ked je pravda ze vyznam polimorfizmu som nikdy zo ziadnej knihy, clanku alebo serialu nepochopil. Pochopil som ho az v praxi pri praci na jednom projekte na sourceforge.net.  :D  Ale zakonitosti som ovladal, len mi nebolo jasne na co to pre vsetkych svatych moze byt dobre  :o  ;D Tak hodne zdaru a sil do programovania  ;)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #40 kdy: 17-05-2014, 09:54:10 »
to pf1957 AHA
to Daniel - literatúry mám dosť. A kvalitnú. Len na ňu pre programovanie nemám čas  ;D :(
« Poslední změna: 17-05-2014, 09:56:51 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 462
  • Karma: 20
    • Verze Delphi: D2007, XE3
Re:Ako na to?
« Odpověď #41 kdy: 17-05-2014, 11:39:24 »
 :D

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4461
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako na to?
« Odpověď #42 kdy: 21-05-2014, 15:44:21 »
Pokúšam sa vytvoriť abstraktnú triedu, ale bojujem s tým, čo tam má byť.
Citace
Odpověď #4 Prvni co bys mel udelat, ze bys mel vyhazet skutecny kodu z handleru udalosti a presunout ho nekam do samostatnych metod.

Nerozumiem, čo presne znamená "skutecny kodu z handleru udalosti". Sú to udalosti komponentov? Napr. VST.onFreeNode.

Ak áno a tie udalosti sú totožné, mal by som ich už "preddefinovať" v abstraktnej triede? A v inštancii to potom priradiť za behu programu? VST.onFreeNode := UvolniObjekt;

Poznámka: nevšímajte si čas medzi príspevkami. Venujem sa tomu len občas.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2595
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako na to?
« Odpověď #43 kdy: 21-05-2014, 16:42:46 »
Nerozumiem, čo presne znamená "skutecny kodu z handleru udalosti". Sú to udalosti komponentov? Napr. VST.onFreeNode.
No tim jsem myslel nasledujici (na reakci, ze jsi psal, ze mas rozesetou obsluhu zmen stavu po vsech certech)
Kód: Delphi [Vybrat]
  1. procedure TAnyForm.PageControlChange(Sender: TObject);
  2. begin
  3.   // Tady jenom volani metod(y), zadny primy kod
  4. end
  5.  
V kazdem pripade by ses nemel opakovat tj. kazda vec se pise prave jednou.

Abstraktni tridu ma smysl delat jen v pripade polymorfismu, kdyz ji definujes spolecne rozhrani a neresis, jak bude implementovano. Implementaci rozhrani vynutis tim abstract.
A nutne to nemusis davat do predka, muzes to obycejne delegovat na nejakou metodu formu. A nemusis to prirazovat za behu, klidne v design time. To je jedno.

Offline Ján Masaryk

  • Mladík
  • **
  • Příspěvků: 82
  • Karma: 5
    • Verze Delphi: 2010
Re:Ako na to?
« Odpověď #44 kdy: 21-05-2014, 23:54:26 »
Ad Daniel_Andrascik

Keď vieš ako na to, prečo mu nepomôžeš ??? Odkazy na nejaké internetové vzdelávania sú alibizmus, iba ho zavádzaš.

Ad. Stanislav Hruška

Poznáš riešenie tzv. "cesty najľahšieho odporu" - jednoducho zatnem zuby a naprogramujem to tak, ako viem.
To, čo chceš je pekné, ale do tohoto levelu si ešte nedospel - ani ja.

Preto to nerieš - uprav, čo ti funguje, a makaj na ďaľších projektoch.

Tam získaš skúsenosti a ľavou zadnou poupravuješ staré projekty :)