2009-09-10 31 views
2

如何找到TGridPanel中控件的位置(行列索引)?我想使用常見的OnClick事件來獲取按鈕的數量,並且需要知道按鈕的X,Y位置。查找TGridPanel中控件的位置

我使用德爾福2007年

回答

4

不幸的是,由於TGridPanel的魔力,它比剛開上和左屬性更復雜一點......

這應該這樣做的任何操作,使其適應您的需求:

procedure GetRowColumn(const AControl: TControl; var ARow, AColumn: Integer); 
var 
    I: Integer; 
begin 
    if AControl.Parent is TGridPanel then 
    begin 
    I := TGridPanel(AControl.Parent).ControlCollection.IndexOf(AControl); 
    if I > -1 then 
    begin 
     ARow := TGridPanel(AControl.Parent).ControlCollection[I].Row; 
     AColumn := TGridPanel(AControl.Parent).ControlCollection[I].Column; 
    end; 
    end; 
end; 

procedure TForm1.ButtonClick(Sender: TObject); 
var 
    Row, Column : Integer; 
begin 
    GetRowColumn(Sender as TControl, Row, Column); 
    // do something with Row and Column 
    ShowMessage(Format('row=%d - col=%d',[Row, Column])); 
end; 
0

您可以使用發件人投作爲一個TButton,然後請它替其頂部和左側例如:

Procedure TForm1.OnClick(Sender:tObject); 
var 
    X,Y : Integer; 
begin 
    if Sender is TButton then 
    begin 
     X := TButton(Sender).Top; 
     Y := TButton(Sender).Left; 
     // do something with X & Y 
    end; 
end; 

或者,如果你只是想知道是什麼按鈕,您也可以使用TAG屬性在每個按鈕中插入一個數字,然後在onclick事件中檢索標籤值。只要記住首先將Tag屬性設置爲某個東西。如果您只是將按鈕放入網格面板或用於創建並插入按鈕的例程中,您可以在表單設計器中執行此操作。

Procedure TForm1.OnClick(Sender:tObject); 
var 
    iButton : integer; 
begin 
    if Sender is TComponent then 
    begin 
     iButton := TComponent(Sender).Tag; 
     // do something with iButton 
    end; 
end; 

您還可以使用標籤屬性來存儲不僅僅是一個整數更多,因爲一個指針目前使用相同的內存大小爲整數,你可以投一個指向整數,將該值插入標籤屬性。請注意,您在此字段中放置的任何指針仍被視爲整數。你對它指向的內存負責,它不會被組件管理。

+0

對於普通的TPanel來說不錯,但是沒有解決TGridPanel的具體問題,在這裏嵌入式控件有一個Row和Column屬性來代替Top和Left。 (如在對象檢查器中) – 2009-09-10 17:40:24