cnd*_*cnd 13 delphi c++builder tcheckbox
当我改变CheckBox的状态时,我很想知道
CheckBox->Checked=false;
Run Code Online (Sandbox Code Playgroud)
它调用CheckBoxOnClick事件,如何避免它?
dum*_*uch 10
另一种选择是使用这样的插入器类来更改受保护的ClicksDisable属性:
type
THackCheckBox = class(TCustomCheckBox)
end;
procedure TCheckBox_SetCheckedNoOnClick(_Chk: TCustomCheckBox; _Checked: boolean);
var
Chk: THackCheckBox;
begin
Chk := THackCheckBox(_Chk);
Chk.ClicksDisabled := true;
try
Chk.Checked := _Checked;
finally
Chk.ClicksDisabled := false;
end;
end;
Run Code Online (Sandbox Code Playgroud)
您可以使用类似的方式包围onClick事件代码
if myFlag then
begin
...event code...
end;
Run Code Online (Sandbox Code Playgroud)
如果您不希望它被执行,请将myFlag设置为false,并在复选框状态的更改后将其设置为true.
在较新的Delphi版本中,您可以使用类助手来添加此功能:
CheckBox.SetCheckedWithoutClick(False);
Run Code Online (Sandbox Code Playgroud)
通过为VCL使用以下类助手TCheckBox:
TCheckBoxHelper = class helper for TCheckBox
procedure SetCheckedWithoutClick(AChecked: Boolean);
end;
procedure TCheckBoxHelper.SetCheckedWithoutClick(AChecked: Boolean);
begin
ClicksDisabled := True;
try
Checked := AChecked;
finally
ClicksDisabled := False;
end;
end;
Run Code Online (Sandbox Code Playgroud)
只是为了完整性:FMX的TCheckBox行为类似(触发OnChange).您可以使用以下类助手来解决此问题:
TCheckBoxHelper = class helper for TCheckBox
procedure SetCheckedWithoutClick(AChecked: Boolean);
end;
procedure TCheckBoxHelper.SetCheckedWithoutClick(AChecked: Boolean);
var
BckEvent: TNotifyEvent;
begin
BckEvent := OnChange;
OnChange := nil;
try
IsChecked := AChecked;
finally
OnChange := BckEvent;
end;
end;
Run Code Online (Sandbox Code Playgroud)
免责声明:谢谢,dummzeuch最初的想法.请注意有关课堂助手的常见提示.