有没有办法禁用父窗口按钮?我有一个被许多表单调用的“工作”表单,我想禁用父表单按钮,直到它完成它的事情。然后重新打开它们。
我想做一些附加到 OnShow 事件和 onClose 事件的事情。
谢谢
-布拉德
创建您要调用的表单,如下所示:
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_
(基本上显示了该主题)。
我会使用动作而不是按钮。
对于像这样的东西,您只需要 1 行代码和一个 TActionList 组件。
创建一个带有动作的动作列表并将动作链接到按钮。动作有一个 OnUpdate 事件,可让您确定是否应启用该动作(以及链接的按钮)。每次操作应该知道是否必须启用它时都会触发 OnUpdate 事件。
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;