Измените состояние CheckBox без вызова события OnClick

Мне интересно, когда я меняю состояние CheckBox

CheckBox->Checked=false;

Он вызывает событие CheckBoxOnClick, как его избежать?

Ответ 1

Вы можете окружить код события onClick чем-то вроде

if myFlag then
  begin
    ...event code...
  end;

Если вы не хотите, чтобы он был выполнен, установите myFlag в false и после изменения состояния флажка установите его значение true.

Ответ 2

Другой вариант - изменить защищенное свойство 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;

Ответ 3

Надеюсь, что есть решение кнопки, но вы можете сохранить текущее событие в TNotifyEvent var, а затем установить Checkbox.OnChecked на nil и впоследствии восстановить его.

Ответ 4

В новых версиях 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 за оригинальную идею. Имейте в виду обычные подсказки относительно помощников классов.

Ответ 5

попробуйте следующим образом:

Checkbox.OnClick := nil;
try
  Checkbox.Checked := yourFlag;
finally
  Checkbox.OnClick := CheckboxClick;
end;

Ответ 6

CheckBox.State := cbUnchecked; работает в Delphi, это не срабатывает onClickEvent AFAIK

Ответ 7

Простое решение состоит в том, чтобы поместить ваш код onclick в событие onmouseup;