Les problèmes de ShowModal après affectation à SetParent (..)
-
27-09-2019 - |
Question
Je créé deux MainApps d'application et SubApps, les SubApps a une boite de dialogue de type modal tels que la connexion / déconnexion, etc., et former son beau travail.
Après le joindre à la MainApps, la boîte de dialogue Modal montre comme forme de boîte normale. Il se comporte comme "DIALOG.SHOW" au lieu de "DIALOG.SHOWMODAL";
J'utilise le compilateur delphi
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;
La solution
Ne soyez pas surpris, ce que vous essayez est inhabituel au mieux. ShowModal
atteint l'effet modal en désactivant toutes les fenêtres du fil d'appel, mais la forme modale. Étant donné que votre formulaire parent ne appartiennent pas au même fil, même pas au même processus, il ne reçoit pas désactivé. Voir DisableTaskWindows
en Forms.pas pour comprendre comment les formes sont désactivées lorsque « ShowModal » est appelée.
Vous devez concevoir votre propre procédure modale; test si l'application est apparenté dans une fenêtre de niveau supérieur qui n'est pas le bureau, désactivez cette fenêtre si tel est le cas.
Mais si je vous je pense à la conception d'abord, si, f.i., vous fermez le formulaire parent, comment finissez-vous le processus de la forme parented?
modifier pour le 3ème commentaire ci-dessous - vous pouvez essayer d'avoir la forme modale « possédée » par la forme du MainApps. Aux formes étant similaire appartenant à l'application principale forme tout
MainFormOnTaskbar
est vrai. Voir sur Caractéristiques de la fenêtre de sujet msdn.
var
frmDialog: TfrmDialog;
begin
[...]
frmDialog := TfrmDialog.Create(Self, dtLogout);
try
SetWindowLong(frmDialog.Handle, GWL_HWNDPARENT, GetAncestor(Handle, GA_ROOT));
iMsgResult := frmDialog.ShowModal;
[...]
Je vous suggère humblement de poser une question sur une suggestion d'une conception de ce que vous voulez atteindre, par exemple, si elle est sur le code de réutilisation, vous pouvez héberger vos SubApps formes dans une dll ... Cette conception est fragile, vous pouvez continuer à rencontrer des problèmes avec elle ...
Autres conseils
Essayez de faire vos fenêtres « système modal » au lieu de « modal application ». En fait, je ne sais pas si vous pouvez même le faire. Il pourrait être impossible, ou une mauvaise idée. En fait, toute la question me donne l'odeur « mauvaise idée ».