2013-01-20 428 views
1

我在表格上有一個按鈕。
的按鈕名稱爲bmod2,而表格名稱是fLayOut1獲取當前表格的名稱

當用戶點擊該按鈕,我想保存當前表單和按鈕名稱的名稱

procedure TFLayout1.bMod2Click(Sender: TObject); 
var 
azone : string; 
adept : string; 
begin 
azone := //forum name here 
adept := //button name here 
end; 

回答

5

要獲取的名稱事件方法所屬的當前表單,您可以直接訪問Name屬性,也可以通過隱藏的Self對象訪問屬性,如下面代碼的註釋行中所示。

要獲取已觸發某個事件的組件的名稱(在本例中爲OnClick事件),可以使用常用的Sender參數(通常爲引用該對象的引用)導致該事件觸發。由於通過的Sender參數的基類爲TObject類類型,它尚未具有Name屬性,因此您需要將此對象轉換爲類型,即Name屬性。它可能直接是綁定事件的對象的一種類型,或者如果您不確定該事件,或者綁定到事件的組件類型可能更多,則可以使用例如共同TComponent祖先類,其中Name屬性定義(因爲它顯示在註釋行下面的代碼):

procedure TFLayout1.bMod2Click(Sender: TObject); 
var 
    azone: string; 
    adept: string; 
begin 
    azone := Name; 
    // azone := Self.Name; 
    adept := TButton(Sender).Name; 
    // adept := TComponent(Sender).Name; 
    ShowMessage('Form name: ' + azone + sLineBreak + 
    'Sender name: ' + adept); 
end; 
+1

完美而快速! –

+1

'Sender as TButton'在這裏會比較好,因爲如果'Sender'不是'TButton',它會引發運行時錯誤。 –

+0

@David:發件人作爲TButton也會引發一個運行時異常,但是可以預見,並且每次發件人都不會是TButton。即使類型不對應於沒有RTE的TButton,類型轉換也可能通過。爲避免RTE,應使用is運算符 – pf1957

1

如果你想按鈕的父母的名字,上面的代碼爲你做,但如果你真想包含按鈕形式的名稱(也許該按鈕上的GroupBox或面板或等),你可以做這樣的:

var 
    ParentClass: TWinControl; 
begin 
    ParentClass:= Button1.Parent; 
    while not (ParentClass is TForm) do 
    ParentClass := ParentClass.Parent; 
    ShowMessage(Button1.Name); 
    ShowMessage(ParentClass.Name); 
end; 
+3

爲什麼上面的代碼會給出按鈕的父級名稱?它會給出你正在運行其類的代碼的任何對象的名稱。無論如何,當你需要獲取父表單時,你可以調用'GetParentForm'。 –

0

既然你不建設的複合材料部件,你可以使用t的所有者他TButton。

procedure TFLayout1.bMod2Click(Sender: TObject); 
var 
    azone: string; 
    adept: string; 
    btn: TButton; 
begin 
    btn := (Sender as TButton); 
    adept := btn.Name; 
    // adept := TComponent(Sender).Name; 
    // adept := (Sender as TButton).Name; 
    azone := btn.Owner.Name; 


    ShowMessage('Form name: ' + azone + sLineBreak + 
    'Sender name: ' + adept); 
end; 

IDE始終將窗體設置爲所有控件的所有者,而不是它們的直接容器(它是它們的父級)。

+0

@SertacAkyuz:確實...代碼已更正。 –