[Win32] Messages intra-appli
Bonjour
Bon je ne suis pas familier des messages Windows mais je voudrais les utiliser simplement pour mettre à jour toutes les fiches de mon appli lors d'un changement de langage. Auparavant j'utilisais une méthode publique du genre :
Code:
1 2 3 4 5 6
| procedure TfrmMain.ChangeLang;
(...)
if frmList <> nil then
frmList.UpdateCaptions;
if frmAbout <> nil then
frmAbout.UpdateCaptions; |
..mais j'utilise maintenant les "class procedure" pour certaines fenêtres, donc si je fais "TMaFiche.Execute" je n'ai plus de variable "maFiche: TMaFiche" à laquelle accéder pour appeler sa méthode UpdateCaptions. D'où les messages.
D'après un conseil trouvé je ne sais plus où j'utilise WM_NOTIFY avec un WParam perso (pas besoin de se créer un message spécifique alors que l'existant peut convenir. Pas tant que ça finalement, j'y reviendrai).
J'arrive donc à intercepter le WM_NOTIFY ainsi :
Code:
procedure WMNotify(var Msg: TMessage); message WM_NOTIFY;
Mais pas dans le DefaultHandler !
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| procedure TfrmAbout.DefaultHandler(var Message);
begin
//inherited DefaultHandler(Message);
if TMessage(Message).Msg = WM_NOTIFY then begin
if TMessage(Message).WParam = C_MON_PARAM then begin
UpdateCaptions;
TMessage(Message).Result := 1;
end;
end;
inherited DefaultHandler(Message);
end; |
Que le inherited soit placé à la fin ou pas, le message n'est pas "reçu". Quelqu'un saurait-il pourquoi ?
Mais la vraie question n'est pas là : je suis maintenant obligé dans ma fiche principale de tester les fenêtres les unes après les autres pour leur envoyer à chacune le message :
Code:
1 2 3 4
| AHandle := FindWindow(PChar('TfrmAbout'), nil);
if AHandle <> 0 then
PostMessage(AHandle, WM_NOTIFY, C_MON_PARAM, 0);
// A répéter pour les x fenêtres existantes |
Si j'envoie avec un handle HWND_BROADCAST aucune fiche ne reçoit, même si je remplace WM_NOTIFY par un message perso en constante WM_USER + ... et/ou en utilisant RegisterWindowMessage.
Y a t-il un moyen d'éviter les envois multiples et successifs à chaque fiche ?? Merci.
PS: WM_NOTIFY est "délicat" à manipuler ; s'il n'est pas traité dans la fenêtre à qui il est destiné --> Violation d'Accès !! A cause je pense de sa structure particulière (paramètre NMHDR). En tout cas ça surprend au début :aie: