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)

Le discours de docs MSDN WM_COMMAND environ IDM_ * identifiants, mais comment qui apparaissent dans Delphi?

Était-ce utile?

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

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top