您不应该在 UI 组件的标题中保留状态。如果它被翻译了怎么办?或者,如果您改变主意并在对象检查器中延长标题?那么你的逻辑就会失败。
最好做这样的事情:
- 将状态从
Caption
移到一个单独的表单字段(我更喜欢枚举类型而不是布尔值,所以 statefield 是FAtivarState
并且类型是TAtivarState
)
- 为了确保您可以翻译您的应用程序,将您的初始值
Ativar
从Object Inspector 移动到resourcestring,并将一个用于状态(注意我保留了两者的键盘快捷键)
,如果您不需要翻译,那么您可以替换为Caption
Ativar1
desactivar
A
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;