Domanda

ho creato due MainApps applicativi e SubApps, i SubApps ha un tipo di dialogbox modale come login / logout formare ecc ed il suo funzionamento benissimo.

Dopo che ho fissarlo al MainApps, i modale finestra di dialogo mostra come forma di dialogo normale. Si comporta come "DIALOG.SHOW" invece di "DIALOG.SHOWMODAL";

Sto usando Delphi compilatore

SubApps ButtonClick;

  begin
    with TfrmDialog.Create(Self, dtLogout) do
    try
      iMsgResult := ShowModal;
    finally
      Free;
    end;
    if iMsgResult = mrOk then
    begin
      dmVoca.FHomeworkXMLDoc.Active := False;
      //Disabled Double Login
      dmVoca.tmrDoubleLogin.Enabled := False;
      ................
    end;  
  end;

MainApps ButtonClick

begin
setparent(findwindow(nil,'SubApps'),TabSheet1.Handle);
.........
end;
È stato utile?

Soluzione

Non stupitevi, ciò che si sta cercando è insolito nella migliore delle ipotesi. ShowModal ottiene l'effetto modale disabilitando tutte le finestre del thread chiamante ma la forma modale. Dal momento che il form padre non appartengono allo stesso thread, nemmeno per lo stesso processo, non ottiene disattivato. Vedere DisableTaskWindows in forms.pas per capire come le forme sono disattivate quando si chiama 'ShowModal'.

Si deve elaborare la propria procedura modale; test se l'applicazione è imparentato in una finestra di livello superiore che non è il desktop, disabilitare quella finestra, se questo è il caso.

Ma se fossi in te potrebbe pensare sulla progettazione prima, che cosa succede se, F.I., si chiude il form padre, come si fa a finire il processo del modulo parented?


Modifica per il 3 ° commento qui sotto - si potrebbe provare avente la forma modale "di proprietà" della forma del MainApps. Simile a forme di essere di proprietà del modulo principale applicazione mentre MainFormOnTaskbar è vero. Vedi finestre di proprietà su finestra Caratteristiche argomento di MSDN.

var
  frmDialog: TfrmDialog;
begin
  [...]
  frmDialog := TfrmDialog.Create(Self, dtLogout);
  try
    SetWindowLong(frmDialog.Handle, GWL_HWNDPARENT, GetAncestor(Handle, GA_ROOT));
    iMsgResult := frmDialog.ShowModal;
    [...]


Vorrei umilmente suggerisco di porre una domanda su un suggerimento di un disegno di ciò che si vuole raggiungere, per esempio, se si tratta di riutilizzo del codice è possibile ospitare i vostri SubApps forme in una dll ... Questo disegno è fragile, è possibile continuare a correre in problemi con esso ...

Altri suggerimenti

Prova a fare le finestre "sistema modale" invece di "modal applicazione". A dire il vero, non ho idea se si può anche farlo. Potrebbe essere impossibile, o una cattiva idea. In realtà, tutta la questione mi dà l'odore "cattiva idea".

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