德尔福父母表格按钮

时间:2010-01-16 07:31:29

标签: delphi events parent

有没有办法禁用父窗口按钮?我有一个“工作”形式,由许多形式调用,我想禁用父窗体按钮,直到它完成它的事情。然后重新打开它们。

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

由于

-Brad

3 个答案:

答案 0 :(得分:1)

创建您要调用的表单,如:

  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.

然后在要调用此模态窗体的按钮之后:

  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.

如果你只想禁用所有按钮,你可以迭代它们而不是禁用CallingForm只禁用CallingForm上的按钮。请参阅Stack Overflow主题(以及我的回答):Cast a form dynamically EDITED:或查看_J_的答案(主要显示主题)。

我会使用动作代替按钮。

答案 1 :(得分: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;

答案 2 :(得分:0)

对于这样的stuf,你只需要1行代码和TActionList组件。

使用操作创建一个操作列表,并将操作链接到该按钮。操作具有OnUpdate事件,该事件允许您确定是否应启用操作(以及链接按钮)。每当操作应该知道是否必须启用时,就会触发OnUpdate事件。