Newsgroup: it.comp.lang.delphi
Titolo: Dubbio su PostMessage e Dispatch

Salve a tutti,
In una mia applicazione ho un componente visuale che in alcune circostanze
deve poter intercettare
dei messaggi che vengono inviati da un Form (da esso creato).
Nel controllo visuale ho una cosa del genere:
private
...
...
        procedure WMNeurodeGfxAskDump(var Message:TMsg); message
WM_NeurodeGfx_AskDump;
Ovviamente, WM_NeurodeGfx_AskDump è un valore definito come WM_APP + $001.
Questo è quello che fa il metodo di cui sopra:
procedure TCMNeurodeGfx.WMNeurodeGfxAskDump(var Message:TMsg);
begin
    if Assigned(fFormNeurode) then
        if Message.message=WM_NeurodeGfx_AskDump then
        begin
            fFormNeurode.MDump.Clear;
            fFormNeurode.MDump.Lines.AddStrings(fNeurodeOwner.DumpNeurode);
        end;
end;
L'oggetto fFormNeurode viene creato dal controllo visuale come:
fFormNeurode:=TFNeurode.Create(Self);
Nel fFormNeurode ho un metodo associato all'evento OnClick di un bottone che
fa:
procedure TFNeurode.BAggiornaClick(Sender: TObject);
var
    Messaggio   : TMsg;
begin
    Messaggio.message:=WM_NeurodeGfx_AskDump;
// (A)   Owner.Dispatch(Messaggio);
// (B)    PostMessage((Owner as
TCMNeurodeGfx).Handle,WM_NeurodeGfx_AskDump,0,0);
end;
Rimuovendo il commento a // (A) il gestore del messaggio
WM_NeurodeGfx_AskDump definito
nel controllo visuale, NON viene in alcun modo richiamato :(
Lasciando, invece, la riga commentata con // (B) detto gestore viene
richiamato _ma_ cosa strana (credo)
è che il parametro Message:TMsg del metodo è "malformato" nel senso che:
    hwnd: HWND --> viene impostato a WM_NeurodeGfx_AskDump !!!?!?!?
    message: UINT --> viene impostato a 0
    wParam: WPARAM --> viene impostato a 0
    lParam: LPARAM  --> viene impostato a 0
Qualcuno sa darmi una spiegazione?
Potrei risolvere tutto utilizzando RegisterWindowMessage, almeno spero :),
ma dato che non mi
necessita di comunicare tra 2 applicazioni credo sia uno spreco.
Come mai con Owner.Dispatch(...) non funziona?
Saluti,
Carmine

 nel controllo visuale, NON viene in alcun modo richiamato :(
senza addentrarci troppo nei meandri del Win32 credo che il tuo problema sia
che il lato ricevente e quello destinatario usano tecniche di messaging
diverse. Infatti tu provi ad accodare un messaggio ad un Thread
(PostMessage()) e lato ricevente cerchi di beccare il messaggio sulla Window
Procedure (che notoriamente riceve i messaggi inviati con una
SendMessage()). Converti le PostMessage() del chiamante in SendMessage(), se
funziona allora puoi:
1 - Far diventare tutte le PostMessage() delle SendMessageTimeOut()
(preferibili rispetto alla SendMessage() pura)
2 - Intercettare il messaggio direttamente dalla coda usando il metodo
OnMessage di TApplication ed abbandonare la via della Window Procedure.
Se hai bisogno di ulteriori chiarimenti chiedi pure
--
- Carlo -

 OnMessage di TApplication ed abbandonare la via della Window Procedure.
Allora, ho risolto in parte il problema della "malformazione" del messaggio.
Era dovuto al fatto che TMsg ha una struttura diversa rispetto a TMessage ed
alla serie TWMxxxxx.
Il problema del Dispatch, invece non sono ancora riuscito a comprenderlo
bene.
Infatti, ho utilizzato il metodo PostMessage (che magari sostituirò con
SendMessageTimOut(..)) e
mi funziona benone. PostMessage prevede tra i parametri anche l'handle della
Window a cui
inviare il messaggio. Quindi, non penso ci sia qualche "problema" di
metodologie differenti
di invio e ricezione.
Il mio dubbio era principalmente sul perchè Dispatch(...) non funziona.
L'ho utilizzato altre volte e non mi ha dato alcun segno di "pazzia" :)
L'unica particolarità di questo caso e che il form che chiama Dispatch
risiede in un'altra unit.
Non posso utilizzare OnMessage di TApplication, perchè probabilmente verrà
utilizzata da qualche
altra parte del codice.
Mi starebbe anche bene con Post/SendMessage, però vorrei capire il perchè
del Dispatch.
Aggiungo che il controllo visuale discende da TCustomControl, non penso che
Dispatch sia
"non definito" in quanto gli eventi OnClik ed OnDblClick li intercetto alla
stessa maniera senza
problemi...
Grazie per il tuo interessamento,
Carmine

 problemi...
il metodo Dispatch è definito da TObject, per cui lo hai in ogni oggetto.
Il problema forse può risiedere nella "malformazione" del messaggio in
quanto Dispatch prova a determinare in base al messaggio stesso se l'oggetto
ha un gestore di questo messaggio e in caso affermativo lo richiama
altrimenti chiama DefaultHandler.
Ciao
Antonio

 altrimenti chiama DefaultHandler.
Non sono sicuro di aver riprovato con Dsipatch dopo la modifica al tipo di
messaggio
passato.
Adesso, la struttura del messaggio passato rispecchia lo stile dei TWMxxxxx,
quindi
Dispatch _non_ dovrebbe avere difficoltà a gestirlo.
Non appena potrò farò una prova.
Grazie per l'interessamento.
Saluti,
Carmine

Fatto! :)
Ho controllato dinuovo il comportamento di Dispatch, questa volta
rispettando il format TWMxxxx per
i messaggi, e tutto funziona alla perfezione.
Per il momento, perň, ho lasciato PostMessage perchč la forma mi risulta piů
compatta del definire
una variabile del tipo TWMxxxxx, impostarla e chiamare Dispatch:
var
    Messaggio: TWMpippo;
begin
    with Messaggio do
    begin
        bla...bla...bla
    end;
    Dispatch(Messaggio);
end;
contro:
begin
    PostMessage(Owner.Handle,WM_xxxxx,0,0);
end;
E' stato tutto un "Errore di Sbaglio". :)
Saluti,
Carmine