Delphi - zrušenie nastavení z "odchádzajúceho" TabSheet pri prepnutí na nový TabSheet
Na formulári mám PageControl. Ten obsahuje niekoľko TabSheet a na každom TabSheet je jeden DBGrid. V rámci aplikácie mám jeden DataSource, ktorý chcem podľa potreby priraďovať DBGridom a 2 Query. Jeden je pracovný a druhý pre zobrazenie v DBGrid. Mám takýto problém:
Pri prepnutí TabSheet potrebujem zrušiť prepojenie DBGridu, ktorý bol doteraz zobrazený, urobiť zmeny a priradiť nový DBGrid. Tejto postupnosti odpovedá TabSheet.OnExit, PageControl.OnChange a TabSheet.OnEnter. Zistil som však, že OnExit sa nikidy nevyvolá a miesto toho sa mi 2x zavolá OnChange a potom sa 1x zavolá OnEnter. Ako mám teda dosiahnuť zrušenie prepojenia DBGridu s DataSource, keď sa pri prepnutí nevyvolá OnExit?
TabSheet.OnShow ?
Tým tvojím OnShow si mi dodal myšlienku a ja som ju zrealizoval.
Samozrejme, že OnShow je blobosť, ale napadlo ma, že možno OnHide a je to tak. Poradie je takéto:
1. PageControl.OnChange / Sender = Form, na ktorom je PageControl, ktorý obsahuje TabSheety, ktoré sa menia
2. TabSheet.OnHide / Sender = TAbSheet, ktorý sa opúšťa
3. PageControl.OnChange / Sender = PageControl, na ktorom sú TabSheet, ktoré sa menia
4. TabSheet.OnShow / Sender = TAbSheet, ktorý sa zobrazí
Ďakujem za pomoc.
Edit: Pri PageControl.OnChange musím testovať hodnotu Sender, aby som nevymenil databázu skôr, ako bude vyvolané OnHide.
To je to delphi bastlenie/lepenie
A modlit sa aby ina verzia Win neposlala messages v inom poradi
Chceš povedať, že C++ to urobí lepšie? Momentálne mi to funguje.
V čom teda programuješ ty?
//Neber ako provokáciu, len by toho bolo už na mňa priveľa, keby to nešlo. Už som sa stretol s nefukčným tlačením formulára cez TForm.Print. Na mojom počítači tlačilo celý formulár na druhom len polovicu.
Edit: Kúpil som si knihu Microsoft Visual C# krok za krokom (sú aj dobré internetové výuky, ale kniha je kniha) a chcem sa ho naučiť tiež. Láka ma viac akko C++. O C# si čo myslíš?
Preco do toho pleties C++? C++ je jazyk. Tvoje problemy su spojene s lepenim nejakych komponentov nejakej kniznice, tak ak sa chces bavit tak o nejakych knizniciach.
nie, C++ neurobi nic. Urobi to lepsie programator ktory nelepi nejake "zahadne" komponenty. Dialog s tab-mi je trivialna vec ktoru ide urobit aj s cistym WinAPI (to je aspon detailne popisane v MSDN)...
P.S. ak uz to chces robit tak ako si to robil, tak bezpecne je urobit to v jednej fcii (nieco odpajas ak bolo predtym pripojene - precitas si nejaky stav(pripojene/odpojene) a odpojis ak bolo pripojene, predtym ako to pripojis inde, vsetko moze byt v jednom evente - v tom ktory zobrazuje nove veci). Ide aj trochu o datovy model atd. Delphi zvadza k lepeniu bez rozmyslu.
Použij událost TPageControl.OnChange - vypukne při vlezení do ucha, TPageControl.ActivePage ukazuje na ucho, do kterého se právě vlezlo. Pro opuštění ucha použij TPageControl.OnChanging - vypukne při odchodu z ucha, TPageControl.ActivePage ukazuje na právě opouštěné ucho. Já osobně bych s mřížema nic nedělal extra. Na každém uchu bych si je nastavil podle potřeby a když uživatel překlikne na jiné ucho, nechal bych ty mříže v pozadí osudu, ať si žijou jak chtějí - obvykle nic špatného neprovedou.
Lenže, ak nastavím nový SQL príkaz, tak ak budem mať v DBGride definované názvy stĺpcov a nebude sedieť počet, tak pri zmene SQL príkazu dojde k výnimke. Teda ak sa nemýlim.
Na každý list (TTabSheet) objektu TPageControl můžeš přece nacpat mříž, jakou potřebuješ - klidně na každý list jinou a klidně svázanou s jinou tabulkou nebo jiným SQL. Tedy co list, to jiná mříž. Tím se nebudou ovlivňovat. Záleží co děláš. Někdy je žádoucí, aby se mříž na jiném listě (spojená se stejnou tabulkou/SQL) ale s jinými sloupci pohybovala stejně.
Vidíš, to nie je zlý nápad. Vzájomné posúvanie by nebolo na zahodenie.