有没有办法禁用父窗口按钮?我有一个“工作”形式,由许多形式调用,我想禁用父窗体按钮,直到它完成它的事情。然后重新打开它们。
我想做一些附加到OnShow事件和onClose事件的东西。
由于
-Brad
答案 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事件。