6
votes

Comment permettre des formes secondaires Delphes derrière la forme principale

Si dans Delphi 2010 ou Xe Application.MainformontaskBar est défini sur True, toutes les formes secondaires sont toujours devant la fenêtre principale. Peu importe ce que les propriétés popupmode ou popupparent sont réglées. Cependant, j'ai des fenêtres secondaires que je veux pouvoir montrer derrière la forme principale.

Si je définis MainformontaskBar sur False, cela fonctionne, mais les fonctionnalités Windows 7 sont cassées (ALT-TAB, Icône de bar Windows, etc.).

Comment puis-je garder les fonctionnalités Windows 7 fonctionnant tout en permettant toujours aux formes secondaires de se cacher derrière la forme principale?


0 commentaires

3 Réponses :


4
votes

Fondamentalement, vous ne pouvez pas. Tout le point de mainformontaskbar doit avoir une compatibilité Vista. Si vous ne le définissez pas, la compatibilité est partie .. si vous le définissez, la commande Z est terminée. L'extrait suivant vient de D2007's Readme:

La propriété contrôle comment les boutons de la barre des tâches de la fenêtre sont gérées par VCL. Cette propriété peut être appliquée aux applications plus anciennes, mais elle affecte l'ordre Z de votre formal de mainform. Vous devez donc vous assurer que vous n'avez aucune dépendance sur l'ancien comportement.


Mais voir cette Signaler QC , qui décrit le même problème (et fermé que asdesigned ). Le rapport indique une solution de contournement impliquant le remplacement créatures d'un formulaire pour définir le wndparent sur '0'. Il décrit également quelques problèmes que cette solution de contournement provoque également une solution de contournement possible pour ces problèmes. Méfiez-vous, il ne serait pas facile de trouver et de contourner toutes les complications. Voir Steve Trefethen's Article pour avoir un sentiment de ce qui pourrait être impliqué.


1 commentaires

L'article mentionné est maintenant ici .



0
votes

J'aurais pensé qu'une approche serait d'avoir une forme principale "dans la scène" qui ne sert que des fins suivantes:

  1. Pour sélectionner et afficher l'un des autres formulaires en tant que formulaire principal, puis se cacher perpétuellement (visible: = FALSE) comme les bons écrans "flash" à l'ancienne. p> li>

  2. d'agir en tant que terminateur d'applications lorsque la forme qu'elle est sélectionnée sous forme de formulaire principal est fermée (juste câbler les événements surclose appropriés). P> li>

  3. ouvrir d'autres formulaires au nom de la forme pseudo-principale désignée telle que la forme principale réelle cachée est le "propriétaire" des autres formes, pas la "forme pseudoise". Il semble que cela se produise de toute façon si toutes vos autres formes ont un style pop-up "non" et sont visibles via des appels de spectacles plutôt que sur ShowModal. P> Li> OL>

    Cette petite restructuration du comportement de l'application peut alors vous obtenir l'interaction de l'utilisateur aimable que vous recherchez. P>

    unit FlashForm;
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
    
    type
      TFlash = class(TForm)
        lblTitle: TLabel;
        lblCopyright: TLabel;
        Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      public
        procedure CloseApp;
      end;
    
    var
      Flash: TFlash;
    
    implementation
    
    {$R *.dfm}
    
    uses Main;
    
    procedure TFlash.CloseApp;  // Call this from the Main.Form1.OnClose or CanClose (OnFormCloseQuery) event handlers
    begin
       close
    end;
    
    procedure TFlash.FormCreate(Sender: TObject);  // You can get rid of the standard border icons if you want to
    begin
       lblCopyright.Caption := 'Copyright (c) 2016  AT Software Engineering Ltd';
       Refresh;
       Show;
       BringToFront;
    end;
    
    
    procedure TFlash.Timer1Timer(Sender: TObject);
    begin
       Application.MainFormOnTaskBar := FALSE;  // This keeps the taskbar icon alive
       if assigned(Main.MainForm) then
       begin
           visible := FALSE;
           Main.MainForm.Show;
           Timer1.Enabled := FALSE;
       end else Timer1.Interval := 10;  // The initial time is longer than this (flash showing time)
    end;
    
    end.
    
    // Finally, make this the FIRST form created by the application in the project file.
    


0 commentaires

0
votes

J'ai trouvé un moyen de résoudre ce problème.

sur *. DPR

changer application.mainformontaskbar: = true; pour Application.MainformontaskBar: = FALSE;

Cela vous permettra de vous former enfant derrière vous forme principale.


1 commentaires

De la question: "Si je définissais Mainformontaskbar sur False ça marche, mais ..." .