공통 TCategoryButtons 동적 생성하고, TButtonItem 클릭 이벤트 연결하기
2016.03.23 09:40
아래와 같이 버튼 클릭 시 10개 카테고리(TButtonCategory)에 5개의 버튼(TButtonItem)을 추가하고, 버튼 클릭시 버튼의 캡션을 얻어오는 예제입니다.
주의 할 점은 TButtonItem Click 시 발생하는 이벤트의 Sender가 TButtonItem이 아닌 모체인 TCategoryButtons가 넘어옵니다.
클릭한 TButtonItem은 TCategoryButtons.SelectedItem을 통해 접근할 수 있습니다.
참고로 TButtonItem은 Caption, Hint, Data(Pointer) 속성을 제공하므로 원하는 데이터를 알맞은 속성에 넣고
클릭시 필요한 데이터를 꺼내서 구현할 수 있습니다.
(정정: 3/23)
TCategoryButtons.OnButtonClicked 이벤트를 이용하면 각 TButtonItem에 이벤트를 걸지 않아도 됩니다.
자세한 내용은 아래 코드를 참고하세요.
(첨부파일에서 다운로드 받을 수 있습니다.)
[코드]
type
TForm1 = class(TForm)
catMenuItems: TCategoryButtons;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
// 정정: TCategoryButtons.OnButtonClicked
procedure catMenuItemsButtonClicked(Sender: TObject;
private
{ Private declarations }
procedure ButtonItemClick(Sender: TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i, j: Integer;
Cate: TButtonCategory;
Item: TButtonItem;
begin
catMenuItems.Categories.Clear;
for i := 0 to 10 do
begin
Cate := catMenuItems.Categories.Add;
Cate.Caption := 'Category ' + I.toString;
end;
//Menu Item
for i := 0 to 10 do
begin
for j := 0 to 5 do
begin
Item := catMenuItems.Categories[i].Items.Add;
Item.Caption := Format('Menu %d %d', [i,j]);
Item.Hint := Format('Menu %d %d', [i,j]);
Item.OnClick := ButtonItemClick;
end;
end;
end;
procedure TForm1.ButtonItemClick(Sender: TObject);
begin
Memo1.Lines.Add(Sender.ClassName);
Memo1.Lines.Add(catMenuItems.SelectedItem.ClassName);
Memo1.Lines.Add(catMenuItems.SelectedItem.Caption);
end;
// 정정: TCategoryButtons.OnButtonClicked
procedure TForm1.catMenuItemsButtonClicked(Sender: TObject;
const Button: TButtonItem);
begin
Memo1.Lines.Add(Button.Caption);
end;