2010-02-15 30 views

回答

7

你可以围绕onClick事件代码的东西,如

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

如果你不希望它被执行,设置myFlag假后的复选框状态的改变将其设置回真正的做。

+0

是的...... -S很简单。不知道为什么我自己没有做到> _ < – Cynede

6

我希望有一个按钮解决方案,但您可以将当前事件存储在TNotifyEvent var中,然后将Checkbox.OnChecked设置为零,然后将其恢复。

+0

CheckBox-> Checked = false在按钮上,但它甚至调用onClick事件。所以我会尝试一下。谢谢。 – Cynede

9

另一种选择是使用中介类这样的改变保护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; 
+0

+1对于ClicksDisabled – yonojoy

0

CheckBox.State := cbUnchecked;作品在Delphi中,这不火onClickEvent AFAIK

+0

没有为我工作。 – Noumenon

6

在您可以使用新版本的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了原来的想法。注意班级助手的常见提示。

+0

这正是我正在寻找的!谢谢 – KryNaC

2

试试这个方法:

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

简单的办法就是把你的onclick代码onmouseup事件;