Newsgroup: it.comp.lang.c++
Titolo: Problemi con TDockableControlBar


--
Posted from 
korovev.stm.it
 [195.62.33.1]
via Mailgate.ORG Server - 
http://www.mailgate.org

...

Ciao,
devi derivare dalla TDecoratedMDIFrame e ridefinire il metodo EvCommand.
Questo estratto ti spiega come fare:
class myDecoratedMDIFrame : public TDecoratedMDIFrame
{
  public:
  myDecoratedMDIFrame(const char far* title, TResId menuResId, TMDIClient
&clientWnd =
*new TMDIClient, bool trackMenuSelection = false, TModule* module = 0):
     TDecoratedMDIFrame(title, menuResId, clientWnd, trackMenuSelection,
module)
  { }
...................................
  LRESULT EvCommand(uint Id, HWND hWndCtl, uint notifyCode);
};
supponendo che l'id del controllo sia CBN_ID
LRESULT myDecoratedMDIFrame::EvCommand(uint Id, HWND hWndCtl, uint
notifyCode)
{
  if(Id == CBN_ID && notifyCode == CBN_SELCHANGE)
     fai quello che ti serve
  return TDecoratedMDIFrame::EvCommand(Id, hWndCtl, notifyCode);
}
Ciao
Nazzareno
--
Posted from [195.223.93.3]


 Questo estratto ti spiega come fare:
Non solo non risolve nulla, ma dai un'indicazione del tutto fuorviante su
come risolvere il problema.
Il problema e' invece che la classe TControlGadget "forza" il controllo ad
avere come parent window non il parent window correttamente definito (in
questo caso puo' essere la finestra principale dell'applicazione) ma la
toolbar (in questo caso una TDockableControlBar, classe che poggia su
TGadgetWindow). Quindi ogni messaggio della combobox viene inviato non alla
finestra parent del controllo, ma alla toolbar. In questo caso si possono
avere due alternative:
1) crearsi un hook in una classe derivata da TComboBox per gestire i
messaggi della combobox (leggerli prima che vengano inviati alla finestra
parent) e quindi inviarli alla window voluta (in questo caso alla finestra
principale dell'applicazione, pertanto e' inutile gestire i messaggi nella
classe TDecoratedMDIFrame, basterebbe usare la response table della classe
derivata da TApplication). Questo e' veramente difficile da creare, poiche'
va creata una procedura statica, per evitare che ogni combobox si vada a
creare una propria hook procedure. Io, tempo fa, provai a farlo ma con
scarsi risultati (se volete vi posto il codice in privato).
2) derivare invece la classe TDockableControlBar per intercettare, usando
la sua Response Table (o derivando il metodo PreProcessMsg), tutti i
messaggi della combobox. Questa e' la soluzione migliore e piu' semplice.
Inoltre con questo metodo si intercettano i messaggi di tutti i controlli
inseriti nella toolbar grazie alla classe TControlGadget.
Bye.
-- 
Jo Parrello - OWL/C++ Programmer (
jopa...@tin.it
)
http://space.tin.it/computer/giparrel

avere due alternative: [.....]
Il primo caso non lo commento nemmeno :-)
Per il secondo caso, aggiungo che e' altrettando valido derivare il metodo EvCommand(),
che ha la possibilita' (cosi' come la PreProcessMsg(), rispetto alla Response Table), di
gestire tutti i controlli in un'unica funzione.
La critica di essere fuorviante andrebbe vista sotto un'altra luce (ammetto che avrei
potuto sprecare qualche parola in piu').
In genere, in una applicazione, di rado si ha la necessita' di derivare da una control bar
per modificarne i comportamenti. Piu' spesso, accade che la T???Frame??? sia da derivare,
se non altro, almeno per cambiare il nome della windowclass.
A questo devono aver pensato i progettisti della OWL. Infatti, se dai un'occhiata al
codice sorgente della TGadgetWindow, troverai, nel metodo EvCommand(), la ricerca di una
TFrameWindow parent a cui passare il controllo.
Commentato c'e' anche scritto che si e' fatto cio' per evitare di derivare dalla control
bar quando non sia strettamente necessario.
Ciao
Nazzareno









Ciao
Nazzareno
--


...
Ho seguito la "disputa" tra Nazzareno Paolini e Jo Parrello sul problema
da me posto sul tappeto.
Debbo dire di non essere in grado di seguire la discussione nei dettagli
perche' io sono un ingegnere civile strutturista e, come programmatore,
sono solo un dilettante. Ho scritto programmi di analisi strutturale in
C
sotto DOS ed adesso sto cercando di portarli sotto Windows con C++/OWL.
Comunque ho provato la soluzione proposta da Nazzareno e debbo dire che
funziona.
Non so dire se sia la migliore o se sia elegante: e' molto al di sopra
delle
mie possibilita' (per lo piu' scrivo 'spaghetti code' ! ). Ringazio sia
Nazzareno
che Jo per i consigli e la disponibilita'. Noto comunque che, mentre
sino ad anni
fa un programmatore dilettante che scriveva software tecnico in FORTRAN
se la
cavava benissimo, adesso la programmazione e' diventata cosi sofisticata
che i dilettanti come me annaspano. Evidentemente e' ormai una
disciplina matura.
Grazie ancora.
Benedetto
--
Posted from 
korovev.stm.it
 [195.62.33.1]
