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;
Était-ce utile?

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 ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top