启用按钮的好方法

时间:2014-06-11 16:24:46

标签: delphi button delphi-5

我的应用程序在表单上有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);

当我添加或删除按钮时,这会变得很麻烦且容易出错。我尝试使用布尔而不是

中的aStr
const
  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工作。

3 个答案:

答案 0 :(得分:2)

通过行动很容易解决这个问题。对于每个按钮,创建关联的操作。将该操作分配给按钮的Action属性。

在操作的OnExecute事件处理程序中,执行响应所单击按钮所需的操作。

在操作的OnUpdate事件处理程序中,设置操作属性,例如CaptionVisibleEnabled等。在您的情况下,您需要设置{{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)

我在某些应用中遇到了同样的问题。

使用稍微不同的代码设计,您可以实现它 我在这里展示了一个可以轻松扩展的简单代码。

  • 1)为所有启用automtic的按钮指定相同的名称,并在末尾添加一个数字。
  • 2)如果你想要按钮的状态,那么将它的数字设置为'3'。

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。

  • 将AEV myButtAEV1归为myButtAEV99
  • 将DEL myButtDEL1分组为myButtDEL99
  • 将CRE myButtCRE1分组为myButtCRE99

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;

致电

  • SetEnaBt(controlStrAEV, 'AEV',88);
  • SetEnaBt(controlStrDEL, 'DEL',99);
  • SetEnaBt(controlStrCRE, 'CRE',101);

如果您希望每个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'
相关问题