2017-09-05 2 views
-1

Le problème est: comment masquer un formulaire supplémentaire lorsque l'application est réduite car, une fois l'application restaurée, le formulaire supplémentaire ne peut pas être fermé. Le code joint montre le comportement. D'abord, j'ouvre un formulaire supplémentaire en appuyant sur le bouton. Il a défini le style de formulaire défini sur fsStayOnTop. Puis j'appuie sur le bouton de la minuterie et minimise la forme principale. Une fois la minuterie rétablie, la clé supplémentaire ne peut pas être fermée.Delphi XE2: restauration d'application réduite en ouvrant un fichier dans Windows

program MINIBUG; 

uses 
    Vcl.Forms, 
    MainForm in 'MainForm.pas' {Form7}, 
    AddForm in 'AddForm.pas' {Form8}; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm7, Form7); 
    Application.CreateForm(TForm8, Form8); 
    Application.Run; 
end. 

unit AddForm; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs; 

type 
    TForm8 = class(TForm) 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form8: TForm8; 

implementation 

{$R *.dfm} 

end. 

unit MainForm; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, AddForm, Vcl.ExtCtrls; 

type 
    TForm7 = class(TForm) 
    btnAddForm: TButton; 
    tmr1: TTimer; 
    Button1: TButton; 
    procedure btnAddFormClick(Sender: TObject); 
    procedure tmr1Timer(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form7: TForm7; 


implementation 

{$R *.dfm} 

procedure TForm7.btnAddFormClick(Sender: TObject); 
begin 
    Form8.Show; 
end; 

procedure TForm7.Button1Click(Sender: TObject); 
begin 
    tmr1.Enabled := True; 
end; 

procedure TForm7.tmr1Timer(Sender: TObject); 
begin 
    tmr1.Enabled := False; 
    form8.Close; 
    Application.Restore; 
end; 

end. 
+1

Je crains que vous ne nous fournissiez pas suffisamment d'informations pour vous aider à résoudre votre problème. L'information la plus importante que vous avez laissée de côté est le code qui s'exécute après que vous ayez double-cliqué sur le fichier que vous avez ouvert. Je devine que le problème pourrait se situer dans ce code. – SilverWarior

+2

Fournir un [mcve] –

+0

Je peux maintenant reproduire le problème que vous décrivez avec le code présenté. Je comprends que c'est juste imiter la situation réelle. Donc s'il vous plaît expliquer quelle action du monde réel le 'form8.Close;' dans l'événement 'OnTimer' est en cours de réplication. Si cette ligne est sortie, il n'y a pas de problème. –

Répondre

0

Erreur de test?

Je ne suis pas sûr que votre cas de test est correct. Si l'événement timer simule l'action de double-clic sur un fichier associé, pourquoi cela entraînerait-il une action Form8.Close? Vous avez dit, une partie du problème était que le formulaire supplémentaire est devenu visible (avec le formulaire principal) lorsque le fichier associé a été ouvert, donc le masquage (Form.Hide) devrait avoir lieu lorsque vous démarrez le minuteur, et au OnTimer le formulaire devrait être montré (`Form.Show).

Réponse

Quoi qu'il en soit, la réponse à votre question réelle, Comment cacher forme supplémentaire lorsque l'application minimise est que vous ne devez pas faire quelque chose de spécial. Le formulaire supplémentaire sera caché aussi, sans aucune action.

Si vous voulez pour une raison ou devez activement masquer le formulaire supplémentaire, faire en ajoutant un composant TApplicationEvents à votre formulaire principal et utiliser son événement OnMinimize pour appeler Form8.Hide et OnRestore événement pour appeler Form8.Show.

Voir également

BTW, il y a une différence si vous choisissez Form.Close ou Form.Hide. Close passe par une procédure pour appeler le CloseQuery() tandis que Masquer définit simplement la propriété Visible sur False.