2009-09-10 3 views
2

TGridPanel에서 컨트롤의 위치 (행 및 열 인덱스)를 어떻게 찾을 수 있습니까? 많은 버튼에 대해 일반적인 OnClick 이벤트를 사용하고 버튼의 X, Y 위치를 알아야합니다.TGridPanel 안에서 컨트롤의 위치 찾기

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; 

아니면 그냥 무엇을 알고 싶은 경우 :

난 당신이이 TButton으로 보낸 캐스트를 사용하고 상단을 위해 그것을 물어 예를 들어 왼쪽 수

답변

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

델파이 2007을 사용하고 있습니다 버튼을 누른 경우 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의 특정 질문은 다루지 않습니다. (Object Inspector에서와 같이) –