0

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

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

谢谢

-布拉德

4

3 回答 3

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 dynamic EDITED: 或查看答案_J_(基本上显示了该主题)。

我会使用动作而不是按钮。

于 2010-01-16T08:54:19.780 回答
0

对于像这样的东西,您只需要 1 行代码和一个 TActionList 组件。

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

于 2010-01-16T15:51:20.433 回答
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;
于 2010-01-16T09:14:34.980 回答