Pergunta

Quando um usuário clica duas vezes um dbgrid, eu mostro uma forma não-modal.

Quando eles perto essa forma, quero atualizar a grade.

Para conseguir isso, eu tentei o seguinte:

1 - Defina uma constante mensagem personalizada:

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

2 - No caso OnClose da minha forma não-modal, eu tenho este:

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

3 - Nas declarações privadas de forma que mantém o dbGrid, eu tenho este:

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

...

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

Depois de fazer essas coisas, o PostMessage dispara bem, mas o procedimento OnRefreshRequest nunca fica. O que estou fazendo de errado?

Foi útil?

Solução

Além do nome da mensagem na outra resposta, você está postando uma mensagem para Self.Handle enquanto Auto está indo embora. Você provavelmente significava para postar a um cabo diferente (a janela que lançou o modal um). Dê seu acesso janela modal para que pega quando você criá-lo e postar a mensagem lá em vez disso.

Outras dicas

Note que WM_USER não é a constante correta para basear as suas próprias mensagens em diante, a menos que você está escrevendo um controle personalizado diretamente descendente da TWinControl. Use WM_APP vez.

Além disso, é considerado um bom estilo de usar UM_ para Mensagem em vez de WM_ porque esse prefixo deve ser reservada para os arquivos de cabeçalho do Windows.

A mensagem de correio precisa ser enviada para o outro identificador de janela, não o self.handle que você listou. Uma maneira de fazer isso seria a criação de uma nova propriedade em sua forma não-modal e atribuí-lo a maçaneta da outra forma, pouco antes de mostrar seu um não-modal.

Além disso, e implementar a WM_REFRESH_MSG adequadamente (CheGueVerra tem que corrigir) ele deve funcionar bem.

Você pode tentar mudar o fim da declaração para coincidir com a mensagem que você está tentando enviar.

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

Deve ser este

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

Fiz upload de um exemplo de "O que Kevin fazer?" para embarcadero.public.attachments fórum newsgroup da Embarcadero.

Basicamente é um evento personalizado que a forma principal (ou qualquer forma / objeto desejado) subscreve quando o fecha formulário não-modal. No formulário principal (ou qualquer outro) ...

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

No método Execute

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

Se você não pode chegar ao fórum e precisa do código adicional, deixe um comentário e eu vou postar as peças que faltam.

Boa sorte

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top