Pregunta

En mi Delphi del formulario de OnShow método, puedo determinar que un cuadro de diálogo se debe abrir automáticamente una vez que el formulario se abre - y yo debería ser capaz de hacer esto mediante la simulación de un clic en un menuitem.

Sin embargo, llamar menuitem.Haga clic en aparece el cuadro de diálogo antes de que el formulario principal se ha abierto - que no es lo que quiero.

Espero que debería hacer lo que quiero, pero no puedo encontrar lo que los parámetros a pasar por "wparam" para enviar el clic para mi menuitem.

PostMessage(handle, WM_COMMAND, wparam, 0)

El MSDN WM_COMMAND docs hablar de IDM_* identificadores, pero ¿cómo que aparecen en Delphi?

¿Fue útil?

Solución

Tal vez usted puede tratar de abrir el diálogo en caso AlActivar? No estoy realmente seguro de si el AlActivar es despedido de nuevo que no sea cuando se muestra la forma, pero si lo hace puede usar:

procedure TForm1.FormActivate(Sender: TObject);
begin
  Form2.ShowModal;
  Self.OnActivate := nil;
end;

Otros consejos

(Sé que esto es muy antiguo y se pregunta, pero a pesar de ser resuelto de alguna manera la pregunta real realmente ha quedado sin respuesta.)
--

El comando elemento identificador de un 'TMenuItem' es en el Command de la propiedad.De acuerdo a WM_COMMAND del documentación la palabra alta de 'wParam' sería '0' y la palabra baja sería el menú identificador;

PostMessage(Handle, WM_COMMAND, MakeWParam(MyMenuItem.Command, 0), 0);

o simplemente;

PostMessage(Handle, WM_COMMAND, MyMenuItem.Command, 0);


Con una opción del menú emergente habría una ligera diferencia:la VCL maneja los menús emergentes' mensajes con diferentes ventana de la utilidad.El mundial PopupList variable tiene el mango en su Window de la propiedad;

PostMessage(PopupList.Window, WM_COMMAND, MyPopupMenuItem.Command, 0);

¿No tienes que hacer esto con un temporizador de una sola vez, si desea que aparezca el formulario según una normal de Mostrar / ShowModal, se ven inmersos (etc) totalmente, y después inmediatamente hacer otra cosa?

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;

con perdón para el estilo, la forma y cualquier error-atrapamiento: -)

Por otra parte, controlar el evento Application.OnIdle con algo en la línea de ...

if not DialogDone then
begin
    MyDialogForm.ShowModal; // or menuItem.Click ....
    DialogDone := true;
end;

OnIdle no se disparará (por primera vez) hasta que se muestre la forma y la cola de mensajes está vacía.

No creo que se puede enviar un mensaje directamente a su elemento de menú, pero se puede simplemente publicarla en la ventana principal y mostrar su diálogo desde allí. Lo hago y funciona muy bien para que el cuadro de diálogo (en mi caso, un indicador de inicio de sesión) aparece en la parte superior de la ventana principal para evitar confusiones.

-Mark

procedure WMPostStartup(var Message: TMessage); message WM_POSTSTARTUP;

procedure TMainForm.WMPostStartup(var Message: TMessage);
begin
  Self.Refresh;
  // Now show the dialog box.
end;

Uno de los métodos que he utilizado, que es muy simular a la solución de MarkF, es crear un nuevo definido por el usuario tipo de mensaje y enviar un mensaje con ese tipo de sí mismo cuando se determina que necesita para llevar a cabo este otro proceso después de su formulario principal muestra:

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;

El bueno de este método es que usted está en control de la generación de mensajes, por lo que puede rellenar CUALQUIER lparam o wparam desea utilizar más tarde por su controlador. Envié el mensaje directamente a través de la application.mainform pero también se podría decir simplemente mango de la forma actual.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top