Question

Quand un double-clique sur un DBGrid utilisateur, je montre une forme non modale.

Quand ils ferment cette forme, je veux rafraîchir la grille.

Pour cela, je l'ai essayé ce qui suit:

1 - Définir un message personnalisé constante:

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

2 - En cas OnClose de ma forme non modale, j'ai ceci:

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

3 - Dans les déclarations privées de la forme qui détient le dbGrid, j'ai ceci:

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

...

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

Après avoir fait ces choses, le PostMessage tire bien, mais la procédure OnRefreshRequest ne fonctionne jamais. Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Mis à part le nom du message dans l'autre réponse, vous affichez un message à Self.Handle alors que l'auto va loin. Vous avez probablement voulu dire pour poster une autre poignée (la fenêtre qui a lancé le modeless un). Donnez votre accès à cette fenêtre modales poignée lors de sa création, et postez le message il y a lieu.

Autres conseils

Notez que WM_USER n'est pas la constante correcte à la base de vos propres messages, à moins que vous écrivez un contrôle personnalisé directement descendant de TWinControl. Utilisez WM_APP à la place.

, il est également considéré comme un bon style à utiliser UM_ Message de l'utilisateur au lieu de WM_ parce que ce préfixe est censé être réservé aux fichiers d'en-tête Windows.

Le message de message doit être envoyé à l'autre poignée de fenêtre, pas self.handle que vous avez énumérés. Une façon de le faire serait de créer une nouvelle propriété sur votre formulaire non modal et lui attribuer la poignée de l'autre forme juste avant que vous montrer votre un non modal.

Autre que cela, et la mise en œuvre du WM_REFRESH_MSG correctement (CheGueVerra a-il correct) il devrait fonctionner correctement.

Vous pouvez essayer de changer la fin de la déclaration pour correspondre au message que vous essayez d'envoyer.

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

Devrait être ce

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

Je l'ai téléchargé un exemple de « Qu'est-ce que Kevin faire? » aux embarcadero.public.attachments forum de forum de Embarcadero.

Fondamentalement, il est un événement personnalisé que la principale forme (ou quelque forme / objet que vous voulez) est abonnée au moment où la forme non modale ferme. Sous la forme principale (ou autre) ...

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

Dans la méthode Execute

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

Si vous ne pouvez pas aller au forum et ont besoin du code supplémentaire, laisser un commentaire et je posterai les pièces manquantes.

Bonne chance

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