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 :
..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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 procedure TfrmMain.ChangeLang; (...) if frmList <> nil then frmList.UpdateCaptions; if frmAbout <> nil then frmAbout.UpdateCaptions;
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 :
Mais pas dans le DefaultHandler !
Code : Sélectionner tout - Visualiser dans une fenêtre à part procedure WMNotify(var Msg: TMessage); message WM_NOTIFY;
Que le inherited soit placé à la fin ou pas, le message n'est pas "reçu". Quelqu'un saurait-il pourquoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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![]()
Partager