3

我有一个弹出菜单,其中包含一个名为“Ativar”的项目,但我不明白为什么这段代码不起作用:

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

4 回答 4

2

使用StripHotKeyvom Menues 替换加速器。

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;
于 2013-06-09T07:36:28.567 回答
2

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

最好做这样的事情:

  • 将状态从Caption移到一个单独的表单字段(我更喜欢枚举类型而不是布尔值,所以 statefield 是FAtivarState并且类型是TAtivarState
  • 为了确保您可以翻译您的应用程序,将您的初始值Ativar从Object Inspector 移动到resourcestring,并将一个用于状态(注意我保留了两者的键盘快捷键) ,如果您不需要翻译,那么您可以替换为CaptionAtivar1desactivarA
    resourcestringconst
  • 将标题的分配和业务逻辑分成两个方法(SetAtivarCaptionHandleAtivarChange
  • FormCreate事件方法(将其绑定到的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;
于 2013-06-09T07:36:48.067 回答
1

那是因为如果您向消息显示您将看到的标题而不是 'Ativar' '&Ativar' 字符串,那么您的两个测试都失败了,

好吧,您可以将“&”添加到您的测试中,但我强烈建议您使用其他属性,例如标签,或者根据您的操作使用选中的属性

于 2013-06-09T03:59:09.563 回答
0

我测试了你的代码,这个代码运行良好。只需在您的条件检查中添加一个“&”:

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;
于 2013-06-09T05:52:51.547 回答