有条件的弹出菜单项的标题属性

时间:2013-06-09 03:33:38

标签: delphi delphi-2010

我有一个名为“Ativar”的项目的popupmenu,但我无法理解为什么这段代码不起作用:

procedure TForm6.Ativar1Click(Sender: TObject);
begin
  if ativar1.Caption='Ativar' then
  begin
    showmessage('Initialize procedure');
    ativar1.Caption:='Desativar';
  end else
  if ativar1.Caption='Desativar' then
  begin
    showmessage('Initialize procedure');
    ativar1.Caption:='Ativar';
  end;
end;

我想编写代码应该验证对象的标题属性,如果它等于启用显示消息并将标题属性更改为“禁用”,则当标题属性等于“禁用”时显示消息并再次将属性更改为“启用”。有什么问题?

4 个答案:

答案 0 :(得分:2)

使用StripHotKey com菜单替换加速器。

begin
  if StripHotKey(TMenuItem(Sender).Caption) = 'Ativar' then
  begin
    ShowMessage('Initialize procedure');
    TMenuItem(Sender).Caption := 'Desativar';
  end
  else if StripHotKey(TMenuItem(Sender).Caption) = 'Desativar' then
  begin
    ShowMessage('Initialize procedure');
    TMenuItem(Sender).Caption := 'Ativar';
  end;
end;

答案 1 :(得分:2)

您不应该将状态保留在UI组件的标题中。如果它被翻译了怎么办?或者,如果您改变主意并在对象检查器中使标题更长?那你的逻辑就会失败。

最好这样做:

  • 将状态从Caption移到单独的表单字段中(我更喜欢枚举类型而不是布尔值,因此状态字段为FAtivarState且类型为TAtivarState
  • 要确保您可以翻译您的应用,请将Ativar的初始CaptionAtivar1从对象检查器移至resourcestring,并将desactivar的{​​{1}}值A移至{{3}}。 1}}状态(注意我保留了两个的resourcestring键盘快捷键)
    如果您不需要翻译,则可以将const替换为SetAtivarCaption
  • 将标题和业务逻辑的分配分为两种方法(HandleAtivarChangeFormCreate
  • OnCreate事件方法调用这些方法(将其绑定到TForm6事件Ativar1Click)和// unit name, interface clause, uses list, etc ... type TAtivarState = (asAtivar, asDesativar); TForm6 = class(TForm); procedure Ativar1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private FAtivarState: TAtivarState; procedure SetAtivarCaption(); virtual; procedure HandleAtivarChange(); virtual; // implementation clause, uses list, etc ... resourcestring AtivarCaption = '&Ativar'; DestivarCaption = 'Des&ativar'; procedure TForm6.Ativar1Click(Sender: TObject); begin HandleAtivarChange(); end; procedure TForm6.FormCreate(Sender: TObject); begin SetActivar1Caption(); end; procedure TForm6.SetAtivarCaption(); begin if FAtivarState = asAtivar then Ativar1.Caption := AtivarCaption else Ativar1.Caption := DesativarCaption; end; procedure TForm6.HandleAtivarChange(); begin if FAtivarState = asAtivar then begin ShowMessage('Initialize procedure'); FAtivarState := asDesativar; end else begin ShowMessage('Initialize procedure'); FAtivarState := asAtivar; end; SetActivar1Caption(); end; 事件方法

像上面这样的结构化方法看起来很多额外的工作,但它并不是:它可以节省你很多时间来解决问题中的问题。

示例代码:

{{1}}

答案 2 :(得分:1)

那就是因为如果你显示消息,你会看到而不是'Ativar'的'& Ativar'字符串,所以你的两个测试都失败了,

你可以添加'&'对你的测试,但我强烈建议你使用其他属性,如标签,或检查属性取决于你做什么

答案 3 :(得分:0)

我测试了你的代码,这个代码完美无缺。 Jut添加'&'你的条件检查:

procedure TForm6.Ativar1Click(Sender: TObject);
begin
if ativar1.Caption='&Ativar' then
begin
  showmessage('Initialize procedure');
  ativar1.Caption:='Desativar';
end else
if ativar1.Caption='&Desativar' then
begin
  showmessage('Initialize procedure');
  ativar1.Caption:='Ativar';
end;

end;