2012-03-18 9 views
4

私のアプリケーションはTButtonGroupコントロールを使用しています。各ボタンにイベントハンドラ:doClickを割り当てます。各ボタン(Pointer (i))に情報を割り当てることによって、どのボタンが呼び出されたかを知ることができます。これはコードです:クリックされたTButtonGroupのボタンを見つける方法はありますか?

doClickが、私はラベルの行で無効な型キャストを得ると呼ばれる
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 // 

「@@@」。型変換は、btnと型キャストでTButtonGroupを使用すると正しいですが、これはデータプロパティーを含んでおらず、それはあまり使用されていませんでした。

テストとして私はTButtonGroupコントロールにOnClickイベントハンドラを割り当てました。ボタンをクリックすると、まずボタンイベントハンドラが呼び出され、次にボタン、イベントハンドラを含むTButtonGroupが呼び出されました。

質問:TButtonGroupのどのボタンがクリックされたかを知る方法はありますか? Windowsの7/64でのDelphi XEを使用して

答えて

7

Senderが実際にTButtonGroupありTGrpButtonItemではありませんので、無効な型キャスト例外を取得します。つまり、TGrpButtonItem.OnClickを使用する場合は、ボタンごとに異なるイベントハンドラを使用する必要があります。

ボタンインデックスを提供するTButtonGroup.OnButtonClickedイベントを使用する必要があることは明らかです。

ここでは潜在的な落とし穴がありますが、回避する必要があることを確認する必要があります。 documentationの状態:

OnClickイベントが存在しない場合、ボタンがクリックされたときに発生します。

ボタングループやボタンの項目のいずれかのためのOnClickイベントハンドラを割り当てていない場合は、他の言葉でOnButtonClickedイベントにのみ発生します。

+0

ああ、私はおそらく 'ButtonGroupButtonClicked'を使っていたはずです。それはインデックスを返します。それを試み始める。 – Arnold

関連する問題