Domanda

Quando un utente fa doppio clic un DBGrid, mostro un modulo obbligatorio.

Quando si chiudono quella forma, voglio aggiornare la griglia.

Per fare questo, ho provato quanto segue:

1 - Definire un costante messaggio personalizzato:

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

2 - In caso OnClose della mia forma non modale, ho questo:

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

3 - Nelle dichiarazioni private della forma che contiene il dbGrid, ho questo:

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

...

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

Dopo aver fatto queste cose, il PostMessage spara bene, ma la procedura di OnRefreshRequest mai eseguito. Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Oltre al nome del messaggio in altra risposta, stai scrivendo un messaggio a Self.Handle mentre Sé sta andando via. Probabilmente dire di inviare ad un manico diverso (la finestra che ha lanciato il modale uno). Lascia la tua accesso finestra non modale a quella maniglia quando lo si crea, e pubblicare il messaggio là invece.

Altri suggerimenti

Si noti che WM_USER non è la costante corretto basare il proprio messaggi, a meno che non si sta scrivendo un controllo personalizzato scendendo direttamente da TWinControl. Usa WM_APP invece.

Inoltre, è considerato buono stile da utilizzare per UM_ messaggio User invece di WM_ perché tale prefisso dovrebbe essere riservata per i file di intestazione di Windows.

Il messaggio postale deve essere inviato all'altra handle della finestra, non il self.handle che hai elencato. Un modo per farlo sarebbe quello di creare una nuova proprietà sul modulo non modale e assegnare la maniglia della altra forma appena prima di mostrare il vostro un non-modale.

Oltre a questo, e l'attuazione della WM_REFRESH_MSG correttamente (CheGueVerra ha corretto) dovrebbe funzionare bene.

Si potrebbe provare a cambiare la fine della dichiarazione per abbinare il messaggio che si sta tentando di inviare.

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

Dovrebbe essere questo

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

Ho caricato un esempio di "Cosa farebbe Kevin fare?" a embarcadero.public.attachments di Embarcadero newsgroup forum.

In sostanza si tratta di un evento personalizzato che la forma principale (o qualsiasi forma / oggetto che si desidera) sottoscrive quando il modulo non modale si chiude. Nella forma principale (o qualsiasi altra cosa) ...

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

Nel metodo Execute

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

Se non è possibile raggiungere il forum e hanno bisogno il codice addizionale, lasciare un commento e vi posterò i pezzi mancanti.

In bocca al lupo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top