我的应用程序在表单上有15个按钮。每个按钮都可以根据需要启用,并且没有设置配置,因此可以有几十种组合。
设置Btnxxx.Enabled,我目前正在使用
procedure TForm1.SetButtons(aStr : String);
// aStr can be '123456789ABC' for all Enabled
// or '123_567__ABC' for all-but 4, 8 and 9 Enabled
begin
btnInsert.Enabled:=Pos('1',aStr);
btnVariety.Enabled:=Pos('2',aStr);
当我添加或删除按钮时,这会变得很麻烦且容易出错。我尝试使用布尔而不是
中的aStrconst
aInsOn = True;
aInsOff = False;
aVarOn = True;
aVarOff = False;
procedure TForm1.SetButtons(InsOnOf, VarOnOff ... for 15 buttons : Boolean);
begin
btnInsert.Enabled:=InsOnOff;
btnVariety.Enabled:=VarOnOff;
调用SetButtons将是
SetButtons(aInsOff, aVarOn, .......);
但是对于庞大的布尔设置字符串来说,这也不太理想。
我也尝试以类似于aStr示例的方式使用Tag,但它也容易出错。
有没有人有这样做的宠物主意?由于在任何给定时间按钮的启用状态的未知组合,我无法使Actions工作。
答案 0 :(得分:2)
通过行动很容易解决这个问题。对于每个按钮,创建关联的操作。将该操作分配给按钮的Action
属性。
在操作的OnExecute
事件处理程序中,执行响应所单击按钮所需的操作。
在操作的OnUpdate
事件处理程序中,设置操作属性,例如Caption
,Visible
,Enabled
等。在您的情况下,您需要设置{{1} }:
Enabled
其中(Sender as TAction).Enabled := ...
表示确定关联按钮的启用状态的表达式。
对所有其他按钮重复此过程。
作为此更新策略的替代方法,您可以在操作列表的...
处理程序中设置所有操作的动态属性。
答案 1 :(得分:1)
您可以定义set
以控制最多256个按钮。
type
TButtonId = (BI_INSERT, BI_VARIETY, { ... } BI_FOOBAR);
TButtonIds = set of TButtonId;
procedure TForm1.SetButtons(EnabledButtons: TButtonIds);
begin
btnInsert.Enabled := BI_INSERT in EnabledButtons;
btnVariety.Enabled := BI_VARIETY in EnabledButtons;
{ ... }
btnFooBar.Enabled := BI_FOOBAR in EnabledButtons;
end;
procedure TForm1.SetToCombination1;
begin
SetButtons([BI_INSERT, BI_FOOBAR]);
end;
procedure TForm1.SetToCombination2;
begin
SetButtons([]);
end;
您可以根据需要定义按钮状态组合。现在您可以轻松更改按钮状态。
答案 2 :(得分:0)
我在某些应用中遇到了同样的问题。
使用稍微不同的代码设计,您可以实现它 我在这里展示了一个可以轻松扩展的简单代码。
procedure TForm1.SetEnaBt(ctrlstr:Ansistring;Count:integer);
var
i:integer;
begin
for i:=1 to Count do begin
if ctrlstr[i]='3' then continue;
with TButton(FindComponent('MyButt'+intToStr(i))) do begin
if ctrlstr[i]='1' then enabled := true else enabled := false;
end;
end;
end;
呼叫
SetEnaBt(controlStr,255); //='1030312101010101010101....'
或
不同结尾的不同按钮组
e.g。
procedure TForm1.SetEnaBt(ctrlstr,nameE:Ansistring;GroupCount:integer);
var
i:integer;
begin
for i:=1 to GroupCount do begin // set as many Buttons Group has
if ctrlstr[i]='3' then continue;
with TButton(FindComponent('MyButt'+nameE+intToStr(i))) do begin
if ctrlstr[i]='1' then enabled := true else enabled := false;
end;
end;
end;
致电
如果您希望每个Button都有自己的名称,请创建一个包含所有自动按钮名称的数组
伪代码
string array
'btnInsert','btnVariety','...'
procedure TForm1.SetEnaBt(ctrlstr);
var
i:integer;
begin
for i:=1 to ArrayStrCount do begin // set as many Buttons Group has
with TButton(FindComponent(arrayStr[i-1])) do begin
if ctrlstr[i]='1' then enabled := true else enabled := false;
end;
end;
end;
易于维护
如果删除按钮,则设置他的
根据{{1}}至ctrlstr[number]
和相应的'2'
。
测试就像
arraystr[number]='del'
如果您只想设置前10个按钮而忽略其他200个按钮
根据{{1}}设置为string array
'btnInsert','del','btndoSome','....'
[...]
for i:=1 to ArrayStrCount do begin
if (ctrlstr[i]='2') OR (ctrlstr[i]='3') OR (arraystr[i-1]='del') then continue;
[...]
controlStr[number]
'4'