Pregunta

Cuando un usuario hace doble clic un DBGrid, muestro una forma no modal.

Cuando se cierran esa forma, quiero actualizar la ventana.

Para lograr eso, he intentado lo siguiente:

1 - Definir una constante mensaje personalizado:

const
  WM_REFRESH_MSG = WM_USER + 1;  //defined in a globally available unit

2 - En el caso de mi OnClose formulario no modal, tengo esto:

procedure TMyNonModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  PostMessage(Self.Handle,WM_REFRESH_MSG,0,0);
end;

3 - En las declaraciones privadas de la forma que tiene el dbGrid, tengo esto:

procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;

...

procedure TMyFormWithADBGrid.OnRefreshRequest(var Msg: TMessage);
begin
  RefreshGrid;
end;

Después de hacer estas cosas, la PostMessage dispara bien, pero el procedimiento OnRefreshRequest nunca se agota. ¿Qué estoy haciendo mal?

¿Fue útil?

Solución

Aparte del nombre del mensaje en la otra respuesta, envías un mensaje a Self.Handle mientras que la auto va a desaparecer. Probablemente destinado a colocar a un mango diferente (la ventana que se puso en marcha el modal uno). Dar a su ventana de acceso no modal a la empuñadura cuando la crea, y publicar el mensaje en su lugar.

Otros consejos

Tenga en cuenta que WM_USER no es la constante correcto basar sus propios mensajes, a menos que usted está escribiendo un control personalizado que desciende directamente de TWinControl. Uso WM_APP lugar.

Además, se considera un buen estilo para usar UM_ de mensaje del usuario en lugar de WM_ debido a que el prefijo se supone que está reservado para los archivos de encabezado de Windows.

El poste del mensaje debe ser enviado a otro identificador de ventana, no el self.handle que usted ha enumerado. Una forma de hacer esto sería la creación de una nueva propiedad en el formulario no modal y asignarle el mango de la otra forma justo antes de mostrar su uno no modal.

Aparte de eso, y la aplicación de la WM_REFRESH_MSG correctamente (CheGueVerra lo tiene correcto) que debería funcionar bien.

Es posible tratar de cambiar el final de la declaración para que coincida con el mensaje que está intentando enviar.

procedure OnRefreshRequest(var Msg: TMessage); message WM_CEA_REFRESH;

En caso de ser esto

procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;

He subido un ejemplo de "¿Cómo sería Kevin hacer?" a embarcadero.public.attachments foro del grupo de noticias de Embarcadero.

Básicamente se trata de un evento personalizado que la forma principal (o cualquier forma / objeto que desea) se suscribe a cuando el formulario no modal se cierra. En la forma principal (o lo que sea) ...

var
  NonModalForm :TfmNonModalForm;
begin
  NonModalForm := TfmNonModalForm.Create(nil); 
  NonModalForm.Execute(NonModalFormClosingListener);

En el método Ejecutar

procedure TfmNonModalForm.Execute(YourListenerMethod: THeyIClosedEvent);
begin
   FHeyIClosedEvent := YourListenerMethod;
   Show();
end;

Si no puede llegar al foro y necesitará el código adicional, deje un comentario y voy a publicar las piezas que faltan.

Buena suerte

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