2012-03-18 4 views
4

내 응용 프로그램은 TButtonGroup 컨트롤을 사용합니다. 각 버튼에 이벤트 핸들러 인 doClick을 할당합니다. 각 버튼 (Pointer (i))에 정보를 지정하면 어떤 버튼이 호출되었는지 알 수 있습니다. 이 코드는 다음과 같습니다.클릭 한 TButtonGroup의 버튼을 확인하는 방법이 있습니까?

procedure TVector_Menu.Synchronize (rows, cols: Int32); 
var btn: TGrpButtonItem; 
    i: Int32; 
begin 
    ButtonGroup.Items.Clear; 
    Self.Rows := rows; 
    Self.Cols := cols; 
    for i := 0 to rows * cols - 1 do 
    begin 
     btn := Buttongroup.Items.Add; 
     btn.Data  := Pointer (i); 
     btn.ImageIndex := i; 
     btn.OnClick := doClick; 
    end; // for 
    Self.ClientHeight := 4 + rows * ButtonGroup.ButtonHeight; 
    Self.ClientWidth := 22 + cols * ButtonGroup.ButtonWidth; 
end; // Synchronize // 

procedure TVector_Menu.doClick (Sender: TObject); 
var btn: TGrpButtonItem; 
    i, r, c: Int32; 
begin 
    btn := (Sender as TGrpButtonItem); // @@@ TButtonGroup 
    i := Int32 (btn.Data); 
    get_rc (i, r, c); 
    if Assigned (FOnClick) 
     then FOnClick (Sender, @FButton_Matrix [r, c]); 
end; // doClick // 

doClick을 호출하면 '@@@'이라는 줄에 잘못된 형식 변환이 나타납니다. 타입 변환은 btn뿐만 아니라 타입 변환에서도 TButtonGroup을 사용할 때 올바르지 만,이 타입은 데이터 프로퍼티를 포함하지 않으며 어쨌든 많은 용도로 사용되지 않았을 것입니다.

테스트로서 나는 TButtonGroup 컨트롤에 OnClick 이벤트 핸들러를 할당했고 버튼을 클릭하면 먼저 버튼 이벤트 핸들러가 호출되고 그 다음에 버튼, 이벤트 핸들러가 포함 된 TButtonGroup이 호출됩니다.

질문 : TButtonGroup의 어떤 버튼을 클릭했는지 확인할 수있는 방법이 있습니까? Sender 사실 TButtonGroup에 있고 TGrpButtonItem이 아니기 때문에

답변

7

윈도우 7/64에 델파이 XE를 사용

은 잘못된 배역 예외를 얻을. 이것이 의미하는 바는 TGrpButtonItem.OnClick을 사용할 경우 각 버튼에 다른 이벤트 처리기를 사용해야한다는 것입니다.

상황에 따라 단추 인덱스를 제공하는 TButtonGroup.OnButtonClicked 이벤트를 사용해야합니다.

그러나 여기에는 잠재적 인 함정이 있습니다. 그러나 피할 수 있어야합니다. documentation 상태 :

OnClick 이벤트가 없으면 단추를 클릭 할 때 발생합니다. 즉

OnButtonClicked 이벤트 것입니다 버튼 그룹 또는 버튼 항목 중 하나에 대한 OnClick 이벤트 핸들러를 지정하지 않은 경우에만 화재.

+0

아, 아마도 'ButtonGroupButtonClicked'를 사용해야했을 것입니다. 그것은 색인을 반환합니다. 시도를 시작하십시오. – Arnold

관련 문제