Envoi WM_COMMAND à un TMenuItem
-
12-09-2019 - |
Question
Dans ma méthode de Delphi forme OnShow, je conclus que la boîte de dialogue doit être ouvert automatiquement lorsque le formulaire est ouvert -. Et je devrais être en mesure de le faire en simulant un clic sur un élément de menu
Toutefois, l'appel menuitem.Click fait apparaître la boîte de dialogue avant la principale forme a ouvert -. Ce qui est pas ce que je veux
Je pense que devrait faire ce que je veux, mais je ne peux pas trouver ce que les paramètres de passer pour « wparam » pour envoyer le clic à mon menuitem.
PostMessage(handle, WM_COMMAND, wparam, 0)
La solution
Peut-être que vous pouvez essayer d'ouvrir la boîte de dialogue en cas OnActivate? Je ne suis pas vraiment sûr si le OnActivate est congédié à nouveau autre que lorsque le formulaire est affiché, mais si elle ne vous pouvez utiliser:
procedure TForm1.FormActivate(Sender: TObject);
begin
Form2.ShowModal;
Self.OnActivate := nil;
end;
Autres conseils
(je sais que c'est une question très ancienne, mais en dépit d'être résolu d'une certaine façon la vraie question est vraiment restée sans réponse.)
-
L'identificateur de l'élément de commande d'un 'TMenuItem' est dans le Command
propriété . Selon le le grand mot de ' wParam » serait « 0 » et le mot de poids faible serait l'identificateur de menu;
PostMessage(Handle, WM_COMMAND, MakeWParam(MyMenuItem.Command, 0), 0);
ou simplement;
PostMessage(Handle, WM_COMMAND, MyMenuItem.Command, 0);
Avec un menu contextuel élément il y aurait une légère différence: les poignées VCL messages des menus pop-up avec une fenêtre de l'utilitaire différent. Le href="http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/delphivclwin32/Menus_PopupList.html" global PopupList variable a la poignée dans son Window
propriété;
PostMessage(PopupList.Window, WM_COMMAND, MyPopupMenuItem.Command, 0);
Souhaitez-vous pas le faire avec une horloge unique, si vous voulez que la forme apparaisse comme par un spectacle normal / ShowModal, se tirer (etc) complètement, et puis immédiatement faire autre chose?
tmrKickOff : a TTimer, 100 ms interval, disabled at design time, fires off a 'tmrKickOffTimer' event. in form create, tmrKickOff.Enabled:=false; //just in case something happened in IDE in form show, at end of all other stuff; tmrKickOff.Enabled:=true; in tmrKickOffTimer begin tmrKickOffTimer.Enabled:=false; menuItemClick(nil); end;
avec des excuses pour le style, la forme et tout piégeage d'erreur: -)
Vous pouvez également gérer l'événement Application.OnIdle avec quelque chose le long des lignes de ...
if not DialogDone then
begin
MyDialogForm.ShowModal; // or menuItem.Click ....
DialogDone := true;
end;
OnIdle ne se déclenche pas (pour la première fois) jusqu'à ce que le formulaire est affiché et la file d'attente de messages est vide.
Je ne pense pas que vous pouvez envoyer un message directement à votre élément de menu, mais vous pouvez simplement l'afficher à la fenêtre principale et afficher votre boîte de dialogue à partir de là. Je le fais et il fonctionne très bien pour que la boîte de dialogue (dans mon cas, une invite de connexion) apparaît en haut de la fenêtre principale pour éviter toute confusion.
-Mark
procedure WMPostStartup(var Message: TMessage); message WM_POSTSTARTUP;
procedure TMainForm.WMPostStartup(var Message: TMessage);
begin
Self.Refresh;
// Now show the dialog box.
end;
Une méthode que je l'ai utilisé, ce qui est très simular à la solution de markf, est de créer un nouveau type de message défini par l'utilisateur et envoyer un message en utilisant ce type à vous-même lorsque vous déterminez que vous devez effectuer cette autre processus après votre principale forme affiche:
const
wm_SpecialProc = wm_User + 1;
procedure TForm1.WMSpecialProc(var Message:tMessage); message wm_SpecialProc;
begin
Form2.ShowModal;
end;
procedure TForm1.OnShow(Sender:tObject);
begin
if true then
PostMessage(Application.MainForm.Handle,wm_SpecialProc,0,0);
end;
La bonne chose au sujet de cette méthode est que vous êtes dans le contrôle de la génération de messages, peut ainsi remplir TOUT lparam ou wparam que vous souhaitez utiliser plus tard par votre gestionnaire. J'ai envoyé le message directement à travers le application.mainform mais vous pouvez aussi dire que la poignée de la forme actuelle.