Newsgroup: it.comp.lang.delphi
Titolo: Intercettare un messaggio ed Ereditarietà

Ciao,
Apro un nuovo post anche se vi sono delle correlazioni con il
precedente.
Parlando qualche giorno fa con Antonio, ho deciso di portare un
vecchio progetto su Lazarus.
Nel vecchio progetto avevo usato ApplicationEvents. So che questo
componente è molto criticato, ma avevo necessità di intercettare due
comportamenti del mouse in una determinata sezione del programma. Il
componente se non si trova in tale sezione è soggetto a un controllo
iniziale IF EXIT.
Un componente questo di Delphi che credo si dovrebbe evitare.
Mi stavo quindi chiedendo se sia possibile intercettare il messaggio
del mouse ereditando la classe del componente. Vorrei evitare come
detto nel post precedente che il doppio click del mouse espanda
l'albero.
Forzando un FullExpand l'albero rimbalza su un eventuale doppio click,
situazione che vorrei evitare, oltre al fatto che per altri componenti
la cosa pare irrisolvibile.
Vi chiedo inoltre se l'impostazione da me seguita è coerente con le
logiche Delphi.
Saluti e grazie per i vostri contributi.
Ale

 
Credo sia possibile ed � coerente con la logica dell'ereditariet�. Ho
scritto questo codice tutto dentro la unit di una form ereditando da
TTreeView. Il fullexpand l'ho messo da codice senza avere per� contenuto
nell'albero, quindi occorre verificare che funzioni. Nel codice facendo
doppio click sull'albero non viene eseguito l'evento OnDblClick anche se
assegnato correttamente. Ovviamente, il codice � scritto con la
direttiva mode objfpc.
Ecco il codice:
http://pastebin.com/fbeacb49
Antonio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - 
http://enigmail.mozdev.org
iEYEARECAAYFAkof3gkACgkQYSsm1R1/E7x91wCfXS1FL2AzCq7iVtVC2Ygx/Bxx
grQAoK2cT0FslGC9V3GNosfGg6HlhAuF
=YWNO
-----END PGP SIGNATURE-----

 l'albero.
a parte la realizzabilita', sei consapevole che vai "contro" un
qualcosa che orami è di fatto uno standard di funzionamento delle gui?
detta in altri termini, oggi ll'utOntO medio si aspetta che il doppio
click faccia l'expand...
Grosso modo come tu ti aspetti che girando un miscelatore verso destra
esca acqua fredda...
Sei prp sicuro che sia una buona idea?
A.

Ciao,
Grazie Antonio :-)
Ho iniziato a testare il codice da Delphi. Anche ridefinendo il metodo
come dici il comportamento del doppio click rimane. Diverso potrebbe
essere in Lazarus.
Sono d'accordo con Alberto sul rispetto del comportamento standard di
alcuni componenti. Devo dire che il caso del TreeView lo utilizzavo
come esempio per cercare di capire come ridefinire i metodi variando i
comportamenti.
Un'alternativa sarebbe di intercettare il messaggio.
Es. per il doppio click:
Nella dichiarazione della form metto:
    private
    procedure MyMSG(var Msg: TWMLButtonDblclk); message
WM_LBUTTONDBLCLK;
    procedure TForm1.MyMSG(var Msg: TWMLButtonDblclk);
    Var DefMsg: TMessage;
    Begin
    // DefaultHandler(Msg);
    showmessage('pippo');
    DefMsg := TMessage(Msg);
    DefWindowProc(handle, Msg.Msg, DefMsg.wParam, DefMsg.lParam);
    end;
Azione che però funziona solo sulla form principale. Mi chiedevo se
potesse funzionare in un componente derivato da una classe come
TTreeView.
Non mi viene in mente come estendere il comportamento all'oggetto
TreeView1 della form.
Anche dichiarando la procedura in public il messaggio non viene
catturato nell'ambito del TreevIew1.

 
Non ricordo esattamente il ciclo dei messaggi in Delphi. Bisognerebbe
vederne il funzionamento corretto.
Antonio