Мне интересно, когда я меняю состояние CheckBox
CheckBox->Checked=false;
Он вызывает событие CheckBoxOnClick, как его избежать?
Мне интересно, когда я меняю состояние CheckBox
CheckBox->Checked=false;
Он вызывает событие CheckBoxOnClick, как его избежать?
Вы можете окружить код события onClick чем-то вроде
if myFlag then
begin
...event code...
end;
Если вы не хотите, чтобы он был выполнен, установите myFlag в false и после изменения состояния флажка установите его значение true.
Другой вариант - изменить защищенное свойство 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;
Надеюсь, что есть решение кнопки, но вы можете сохранить текущее событие в TNotifyEvent var, а затем установить Checkbox.OnChecked на nil и впоследствии восстановить его.
В новых версиях Delphi вы можете использовать помощники классов для добавления этой функции:
CheckBox.SetCheckedWithoutClick(False);
используя следующий класс-помощник для 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;
Только для полноты: 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;
Отказ от ответственности: Спасибо, dummzeuch за оригинальную идею. Имейте в виду обычные подсказки относительно помощников классов.
попробуйте следующим образом:
Checkbox.OnClick := nil;
try
Checkbox.Checked := yourFlag;
finally
Checkbox.OnClick := CheckboxClick;
end;
CheckBox.State := cbUnchecked;
работает в Delphi, это не срабатывает onClickEvent
AFAIK
Простое решение состоит в том, чтобы поместить ваш код onclick в событие onmouseup;