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 : 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;
..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 : Sélectionner tout - Visualiser dans une fenêtre à part
procedure WMNotify(var Msg: TMessage); message WM_NOTIFY;
Mais pas dans le DefaultHandler !
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;
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 : 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
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