我有一个名为“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;
我想编写代码应该验证对象的标题属性,如果它等于启用显示消息并将标题属性更改为“禁用”,则当标题属性等于“禁用”时显示消息并再次将属性更改为“启用”。有什么问题?
答案 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
的初始Caption
值Ativar1
从对象检查器移至resourcestring,并将desactivar
的{{1}}值A
移至{{3}}。 1}}状态(注意我保留了两个的resourcestring
键盘快捷键)const
替换为SetAtivarCaption
HandleAtivarChange
和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;
事件方法像上面这样的结构化方法看起来很多额外的工作,但它并不是:它可以节省你很多时间来解决问题中的问题。
示例代码:
{{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;