2011-04-29 28 views
7

我爲與無線電基的對話作爲偏好形式的一部分創建的代碼。我們的代碼部分是打開的喜好的格式,無線電集團被點擊,它配置了一堆東西(也就是說,如果單選按鈕是「關閉」,然後一堆配置的東西是隱藏的)。如何在Delphi中識別發件人的Tobject類型?

我想是要知道當用戶實際點擊,而不是它打開Preferences對話框時被解僱無線電集團。

因此,代碼如下所示:

(open preferences)... 
rgMyGroupClick(nil) 

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject) 

if sender <> nil then 
begin 
//do something useful 
end; 

但打開Preferences對話框時,也執行該代碼。我應該怎樣才能在用戶實際點擊按鈕上的鼠標時執行?

感謝

回答

16

測試您發送

您可以通過兩種方式測試發件人:

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject) 
begin 
    if sender = RadioButton1 then //do action 
    else if sender = RadioButton2 then .... 

或者你可以測試發信人的類型。

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject) 
begin 
    if sender is TRadioButton then //do action 
    else if sender is TForm then .... 

is關鍵字測試以查看對象是否屬於某種類型。
請注意,測試if AObject is TObject始終爲真,因爲每個對象都來自TObject。類型轉換

更多樂趣

is測試對象類型和所有的祖先可用於其他目的的事實:

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject) 
begin 
    //TObject does not have a 'tag' property, but all TControls do... 
    if (sender is TControl) and (TControl(Sender).Tag = 10) then .... 

由於short-circuit boolean evaluation德爾福將首先檢查(sender is TControl)如果這是真的,則只有繼續。使後續測試(TControl(Sender).Tag = 10)安全使用。

如果你不明白的結構TControl(Sender)你可以在類型轉換讀了。
這裏:http://delphi.about.com/od/delphitips2007/qt/is_as_cast.htm
和這裏:http://delphi.about.com/od/oopindelphi/a/delphi_oop11.htm

9

如果我理解你正確地你點擊你的RadioGroup中編程設置形式的初始狀態,但你必須在你不想跑單擊處理額外的代碼?

如果是這種情況,您可能需要考慮刪除將表單狀態設置爲其自己的方法的代碼,然後從單選按鈕事件和表單的initialze/show/create中調用它。

這樣,你可以使用相同的代碼的形式從用戶點擊設置爲您需要的狀態和編程設置它沒有做,當用戶與對話框交互所需的任何額外的邏輯。或者,也許我已經完全誤解了你的問題......

是這樣的:

// (open preferences)... 
SetStateOfFormForSelectedGroup(); 

procedure TdlgPreferences.SetStateOfFormForSelectedGroup() 
begin 
    //do all setting of form for selected group here. 
end; 

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject) 
begin 
    SetStateOfFormForSelectedGroup(); 
    //do something useful 
end; 
+0

Yu p,一個經典的重構案例。 – 2011-04-29 14:30:50

+0

+1這是正確的解決方案 – 2011-04-29 16:52:52

3

嘗試一些功能或特性,:

Sender.classtype 
InheritedFrom() 

注意:使用ButtonClick(sender:TObject)(例如) 發件人的OBJ SENDER時=類按鈕的點擊=> TButton

所以,TButton(Sender).properties或方法等...