2010-01-16 67 views
0

有没有办法来禁用父窗口按钮?我有一个被称为许多表单的“工作”表单,我想禁用父表单按钮,直到它完成它的事情。然后再打开它们。德尔福父窗体按钮

我想做一些附加到OnShow事件和onClose事件。

感谢

-Brad

+0

我正在想方设法确定发件人是谁,称为要打开的窗体,然后告诉该窗体禁用所有按钮。 – Brad 2010-01-16 10:07:20

回答

1

创建要打电话,因为形式:

unit fMain; 

    interface 

    uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, 
    fMyModalForm; 

    type 
    TfrmMain = class(TForm) 
     btnCall: TButton; 
     btn1: TButton; 
     btn2: TButton; 
     procedure btnCallClick(Sender: TObject); 
    private 
     { Private declarations } 
     f : TfrmMyModalForm; 
    public 
     { Public declarations } 
    end; 

    var 
    frmMain: TfrmMain; 

    implementation 


    {$R *.dfm} 

    procedure TfrmMain.btnCallClick(Sender: TObject); 
    begin 
    if not Assigned(f) 
    then begin 
     f := TfrmMyModalForm.Create(Self); 
     f.CallingForm := Self; 
    end; 
    f.Show(); 
    end; 

    end. 

unit fMyModalForm; 
    interface 
    uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs; 
    type 
    TfrmMyModalForm = class(TForm) 
     procedure FormShow(Sender: TObject); 
     procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    private 
     fCallingForm: TForm; 
     { Private declarations } 
    public 
     { Public declarations } 
     property CallingForm: TForm read fCallingForm write fCallingForm; 
    end; 
    (* 
    var 
    frmMyModalForm: TfrmMyModalForm; 
    *) 
    implementation 

    {$R *.dfm} 

    procedure TfrmMyModalForm.FormShow(Sender: TObject); 
    begin 
    fCallingForm.Enabled := False; 
    end; 

    procedure TfrmMyModalForm.FormClose(Sender: TObject; 
    var Action: TCloseAction); 
    begin 
    fCallingForm.Enabled := True; 
    end; 

    end. 

然后要调用这个模式窗体按钮后

如果你只是想禁用所有的按钮,你可以遍历它们,而不是disablin g CallingForm只会禁用CallingForm上的按钮。请参阅堆栈溢出主题(和我的答案):Cast a form dynamically已编辑:或查看_J_(主要显示主题)的答案。

我会用行动代替按钮。

0

如果辅助窗口打开,执行某些操作并关闭,则可以使用ShowModal而不是Show来打开它,这样用户在第二个窗体关闭之前不能使用主窗体。

如果你想要遍历虽然所有的按钮和禁用或启用它们,代码会是这个样子:

var 
    i: Integer; 
begin 
    for i := 0 to MainForm.ComponentCount - 1 do 
    if (MainForm.Components[i] is TButton) then 
     TButton(MainForm.Components[i]).Enabled := False; 
end; 
+1

我不希望它作为ShowModal打开,因为其他进程在后台以其他形式进行,并且ShowModal根据我的意识停止这些进程(充其量,我是一名初学Delphi程序员) – Brad 2010-01-16 10:00:28

+0

是,你是对的,我不知道这个事实。 – 2010-01-17 09:52:33

0

对于这样塞入你将只需要1行代码和TActionList组件。

使用操作创建操作列表并将操作链接到按钮。一个动作有一个OnUpdate事件,它可以让你确定是否应该启用动作(以及链接的按钮)。每次操作应该知道是否必须启用OnUpdate事件时,都会触发OnUpdate事件。