2010-11-26 4 views
2

나는 동적으로 actionitems를 추가하려고 나는이 할 때이 항목을 추가 할 수 있으며 작동 : 그러나나는 프로그래밍 방식으로 델파이에서 작업 관리자에 작업을 추가하려면 어떻게 2010

HostActionItem := ActionManager.ActionBars[0].Items[0].Items[2]; 
    NewItem := HostAction.Items.Add; 
    NewItem.Action := MyActionToPerform; 
    NewItem.Caption := Description; 
    NewItem.ImageIndex := 1; 
    NewItem.Tag := 13; 

을 작업이 실행되면, 메서드 화재 Sender 개체에서 다음과 같이 ActionComponent를 가져 오려고 시도합니다.

if (Sender is TAction) then 
    tag := (Sender As TAction).ActionComponent.Tag; 

그러나 ActionComponent는 항상 nil입니다. ActionComponent가 초기화되지 않는 이유는 무엇입니까?

+1

_ "ActionComponent가 초기화되지 않는 이유는 무엇입니까?"액션 관리자에 작업을 추가하는 대신에 _이 여기 실제 질문 인 것 같습니다. 그건 그렇고,'Tag' 액션을 사용해보십시오. 동일한 액션에 다른 태그가 필요한 경우, 아마도 "신"이벤트 핸들러 (http : //en.wikipedia.)를 만드는 대신에 다른 액션이 필요할 수도 있습니다. org/wiki/God_object). – Trinidad

+0

질문을 혼동하게해서 죄송합니다. 근본적으로 당신은 정확합니다. 동적 인 동작을하는 방식을 쫓고 있기 때문에 상당히 유연한 이벤트 핸들러가 필요합니다. 기본 동작을 동적으로 만들 것을 제안 하시겠습니까? 아니면 이렇게하는 더 좋은 방법이 있습니까? –

답변

5

짧은 대답 :

당신은 TActionActionComponent으로 표시하는 TActionClientItem를 기대하고 있습니다. TActionClientItemTComponent에서 나옵니다.

이상 답 :

나는 당신이 메뉴 표시 줄에 항목을 추가하고 생각합니다. 디자인에 따라 메뉴 항목에 연결된 TActionActionComponent을 지원하지 않습니다. 메뉴 표시 줄의 항목은 TActionClientItem입니다. 이것은 '수집 항목'이지 '구성 요소'가 아닙니다. 따라서 메뉴는 선택한 항목의 조치 링크 Execute 메소드를 호출 할 때 메뉴 항목으로 ActionComponent 매개 변수를 채울 수 없습니다. 이 혼란 들린다면, 나는 VCL 소스에서 아래에 따옴표를 분명히 할 것 같아요

TBasicActionLink.Execute 방법이 실행되기 전에

function Execute(AComponent: TComponent = nil): Boolean; virtual; 

가 전달 된 구성 요소가 FAction.ActionComponent에 할당됩니다. 이 TCustomActionMenuBar.ExecAction에서라고 어떻게

:

제목에 질문에 대한
FSelectedItem.ActionLink.Execute; 

, 나는 당신이 TActionClientItemCaptionImageIndex 설정에서 떨어져, 뭔가 잘못을하고 있다고 생각하지 않는다 같이, 불필요 그것은 TAction의 제목과 이미지입니다.

+0

답변 해 주셔서 감사합니다. 캡션, imageindex 및 태그는 여러 작업 링크에 동일한 작업을 다시 사용하기 때문에 설정했습니다. 이 일을 힘든 방법으로하고 있습니까? 동적 액션 항목을 얻는 더 좋은 방법이 있습니까? –

+0

@Leigh - 더 쉬운 방법은 없습니다. 클라이언트 항목을 추가하고 작업과 연관 시키십시오. 동작을 재사용하면 내장 된 사용자 정의 기능을 제공 할 수 없습니다. OnExecute에서 소스를 차별화해야하는 경우 유일한 방법은 항목 당 액션을 사용하는 것입니다. –

+0

고마워요. 이제 동적으로 생성 된 항목에 대해 별도의 작업 만 수행하면됩니다. –