Frage

Ich habe zwei Anwendungs ??MainApps und SubApps, die SubApps hat eine modale Art dialogbox wie Login / Logout bilden usw. und seine adaequat.

Nachdem ich es den MainApps befestigen, das modale Dialogfeld zeigt wie normale Kastenform. Es verhält sich wie "DIALOG.SHOW" anstelle von "DIALOG.SHOWMODAL";

Ich bin mit delphi Compiler

SubApps Button;

  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 Button

begin
setparent(findwindow(nil,'SubApps'),TabSheet1.Handle);
.........
end;
War es hilfreich?

Lösung

Seien Sie nicht überrascht sein, was Sie versuchen, bestenfalls ungewöhnlich ist. ShowModal erreicht die modale Wirkung durch alle Fenster des aufrufenden Threads zu deaktivieren, aber der modalen Form. Da Ihre Eltern Form nicht gehört in den gleichen Thread, nicht einmal auf den gleichen Prozess, ist es nicht deaktiviert zu bekommen. Siehe DisableTaskWindows in forms.pas zu verstehen, wie die Formen sind deaktiviert, wenn ‚ShowModal‘ genannt wird.

Sie haben Ihre eigenen modalen Verfahren zu entwickeln; Test, wenn die Anwendung in einem Top-Level-Fenster parented, die nicht auf dem Desktop ist, deaktivieren Sie das Fenster, wenn das der Fall ist.

Aber wenn ich Sie wäre, würde ich auf die Gestaltung zuerst denken, was passiert, wenn, F. I., Sie das übergeordnete Formular zu schließen, wie Sie die parented Form des Prozesses beenden?


Bearbeiten für die 3. Kommentar unten - Sie könnte versuchen, das modale Formular „im Besitz“, die durch die Form des MainApps. Similiar zu Formen durch die Anwendung Hauptform gehört, während MainFormOnTaskbar ist wahr. Siehe Besitz Fenster auf Fenster Eigenschaften Thema Msdn.

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


ich demütig würde vorschlagen, dass Sie auf einem Vorschlag eines Entwurfs eine Frage zu stellen, was Sie erreichen wollen, zum Beispiel, wenn es um Code Wiederverwendung Sie Ihre SubApps hosten könnte Formen in einem dLL ... Dieser Entwurf ist zerbrechlich, können Sie sich weiter Probleme mit ihm laufen ...

Andere Tipps

Versuchen Sie Ihr Windows-System "modal" anstelle von "Anwendung modal" zu machen. Eigentlich habe ich keine Ahnung, ob du das auch tun können. Es könnte sein, unmöglich, oder eine schlechte Idee. In der Tat gibt die ganze Frage mir den „schlechte Idee“ Geruch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top