2011-11-09 3 views
2

다음 메소드를 사용하여 런타임에 Action이있는 ActionClient를 만듭니다.런타임에 Action Item에 드롭 다운 메뉴를 추가하는 방법

procedure TMainForm.AddToProjectHistory(Path: string); 
var 
    NewOption: TAction; 
    ActionClient: TActionClientItem; 
begin 
    NewOption := TAction.Create(self); 
    NewOption.ActionList := ActionManager1; 
    NewOption.Caption := Path; 
    NewOption.OnExecute := ProjectHistoryExecute; 
    ActionClient := TActionClientItem(aToolBarFile.ActionClient.Items[0].Items.Add); 
    ActionClient.Action := NewOption; 
    ActionClient.Caption := Path; 
end; 

이 목록의 항목이 이미 존재하는 경우 잘 작동하지만

예를 들어, 존재하지 않는 경우 전혀 작동하지 않습니다 내가 디자인 타임에 항목을 추가하는 경우 다음 나는 런타임

enter image description here enter image description here

더 많은 항목을 추가 할 수 있습니다하지만 디자인 타임에 아무것도 추가하지 않는 경우, 항목의 목록을 표시 할 드롭 다운을 프로그래머 없다, 항목을 추가하면 드롭 다운이 표시되지 않습니다.

enter image description here

이없는이 작업으로 수행하지만, 메뉴 시스템의 나머지 작업을 사용하고 난 아래 작업 드롭에 표준 메뉴 아이템을 추가 할 수 있다고 생각하지 않습니다합니다.

델파이 2005

+0

약간의 설명 : 'ActionClient.Caption' 설정은 작업과 동일한 값으로 설정하면 불필요합니다. – NGLN

답변

2

VCL은 자동으로 항목이 하위 요소가 있는지 여부에 따라 달라집니다 형태의 버튼 컨트롤을 생성합니다. 기본적으로 ActionManager의 스타일 설정에 따라 자식 항목이있는 ActionClientItem의 경우 TXPStyleDropDownBtn 버튼이 만들어지고 자식이없는 ActionClientItem의 경우 TXPStyleButton이 만들어집니다.

따라서 첫 번째 하위 항목을 런타임에 추가하면 단추의 유형이 잘못됩니다. 버튼의 유형을 변경하려면 현재 버튼을 파괴하고 새 버튼을 완전하고 수동으로 인스턴스화해야합니다. 이 가능해야하지만 시도하지 않은, 때문에 :

진짜로 가장 쉬운 해결책은 디자인 타임에 자식 항목을 추가하여 VCL을 바보이며, 양식 작성에 해당 항목을 삭제 :

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    aToolBarFile.ActionClient.Items[0].Items[0].Free; 
end; 
+1

나쁘지 않은 생각입니다. 프로덕션 코드에 주석을 달고 "placeholder 001"또는 이와 비슷한 것을 designtime 항목이라고 부릅니다. –

+0

@Warren 네, 실제로 어떤 종류의 설명이 필요합니다. – NGLN

0

"context"유형의 actionclient를 만들면 버튼 유형을 변경할 필요가 없습니다. 버튼을 마우스 오른쪽 버튼으로 클릭하면 메뉴가 드롭 다운됩니다.

+0

좋은 해결책 인 것 같습니다. 이 작업을 정확하게 수행하는 방법을 상세히 설명하십시오. 그리고 델파이 버전이 VCL에서 가능하기 때문에? – NGLN

관련 문제