Probleme in ShowModal nach der SetParent Zuordnung (..)
-
27-09-2019 - |
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;
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.