2013-08-21 54 views
0

在我的Delphi XE2項目中,我有Form1,Label1CheckBox1如何使用Delphi中的「標籤點擊」事件觸發複選框的「單擊」事件?

我的要求是設置CheckBox1.Font.Color := clGreen;

思想我已經寫

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    CheckBox1.Font.Color := clGreen; 
end; 

Font Color是默認Black

  1. 我已刪除從CheckBox1Caption,改變了Width17:所以我在其他的方式如下定義它。
  2. 然後我已經放置Label1旁邊的CheckBox1CleckBox1 Caption
  3. 後,我寫了:

procedure TForm1.Label1Click(Sender: TObject); 
begin 
    CheckBox1.Click; 
end; 

ToggleCheckBox1狀態。

但我得到[DCC Error] Unit1.pas(37): E2362 Cannot access protected symbol TCustomCheckBox.Click

而另一個問題是,CheckBox1OnMouseDown Event是否可以被觸發,如下圖: Form1

+2

請提出一個問題,每個主題,不要更多的問題原來的問題添加... – aleroot

+0

第一個問題:「點擊」的方法進行保護,因此錯誤。 –

+0

你見過我的回答嗎? –

回答

5

Click()方法只是觸發CONTRO的OnClick事件,沒有別的。它實際上並不會導致控件執行與點擊相關的邏輯,如更新其內部狀態。

您可以切換CheckBox的狀態是這樣的:

CheckBox1.Checked := not CheckBox1.Checked; 

另外,使用訪問器類,以達到保護成員:

type 
    TCheckBoxAccess = class(TCheckBox) 
    end; 

TCheckBoxAccess(CheckBox1).Toggle; 
+0

你已經告訴過它只是觸發'CheckBox1'' OnClick'事件,如何避免它?我必須根據'點擊邏輯'執行一些計算(即一些編輯將根據'CheckBox1點擊'啓用和禁用,他們將執行我的計算的主要部分。 – user2612109

+0

@user - 切換複選框將觸發其OnClick事件處理函數,你可以保留你的代碼 –

+0

@User你在做錯誤改變你的OnClick事件只是調用一個名爲'DoSomething'的函數,現在調用'DoSomething',除了稱之爲有意義的東西。你以後會因爲這樣做愚蠢的事情而憎恨自己。 –

1

您可以使用它像:

procedure TForm1.Label1Click(Sender: TObject); 
begin 
//either 
CheckBox1.Checked := not CheckBox1.Checked; // this trigger onClick event!! 
// or 
// if you absolutely need it.. 
CheckBox1Click(Sender); // NOTE this will not check or uncheck CheckBox1 
end; 

但是請注意,在這裏使用TLabel對象(發件人)。如果你不使用Sender你可以做到沒有進一步的關注。

但是最好是將啓用代碼和禁用其他控件的代碼放在事件之外。只有一行例如doenable()。

procedure TForm1.doEnable(enable: Boolean); 
begin 
    Edit1.Enabled := enable; 
    Edit2.Enabled := enable; 
    Edit3.Enabled := NOT enable; 
    if enable then Label1.Font.Color := clGreen else Label1.Font.Color := clWindowText; 
    ... 
end; 


procedure TForm1.Label1Click(Sender: TObject); 
begin 
    // NOTE This trigger also CheckBox1 Click event. 
    CheckBox1.Checked := not CheckBox1.Checked; 
    // NOT needed. 
    //if CheckBox1.Checked then doEnable(true) else doEnable(false); 
end; 

procedure TForm1.CheckBox1Click(Sender: TObject); 
begin 
    if CheckBox1.Checked then doEnable(true) else doEnable(false); 
end;