Изменить состояние CheckBox без вызова события OnClick - PullRequest
12 голосов
/ 15 февраля 2010

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

CheckBox->Checked=false;

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

Ответы [ 7 ]

10 голосов
/ 15 февраля 2010

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

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

9 голосов
/ 15 февраля 2010

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

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

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

6 голосов
/ 15 февраля 2010

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

3 голосов
/ 28 марта 2016

попробуйте так:

Checkbox.OnClick := nil;
try
  Checkbox.Checked := yourFlag;
finally
  Checkbox.OnClick := CheckboxClick;
end;
0 голосов
/ 18 мая 2017

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

0 голосов
/ 11 октября 2011

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

...