2009-09-15 18 views
5

나는 생성 된 각 MDI 자식에 대해 탭을 할당하는 MDI 어플리케이션을 개발 중입니다. 기본 (부모) 양식 코드에서 자식 폼의 OnActivate, OnCreate 및 OnDestroy 이벤트를 "catch"해야합니다. MDI 자식으로 사용되는 많은 폼의 클래스가 있기 때문에 단순히 자식 폼의 코드를 호출하는 것은 불가능합니다. 또한 플러그인은 자신의 폼을로드 할 수 있습니다.Delphi MDI - 열기/닫기/활성화 자식 폼 처리

그래서, 내 질문은 : MDI 자식 폼이 자식 폼의 이벤트를 사용하지 않고 으로 활성화/비활성화되었습니다.?

답변

3

몇 년 전에 작업 표시 줄 유형의 구성 요소를 작성했는데 이런 유형의 작업 만 수행합니다. TrmMDITaskbar라고합니다. Torrys에 사본이 있으며 rmControls 라이브러리 패키지의 일부입니다. 활성화, 최소화, 최대화 등을 처리합니다.

어떻게 작동하는지에 대한 요약은 MDIChild 이벤트를 찾기 위해 MDIParents 창 핸들을 연결하고 해당 이벤트를 기반으로하는 작업을 수행한다는 것입니다.

내가 직접 작성하기를 원한다면 시작하는 것이 좋습니다.

Ryan.

P. Torrys의 버전은 조금 오래되었지만 여전히 작동해야합니다. 지원 웹 사이트에서 최신 버전을 사용할 수 있습니다. (Mills Enterprise)

+0

감사합니다. 마지막으로 나는 WH_CBT 플래그를 사용하여 후크 SpTBXLib에서 코드를 사용하여 그것을 해결 ... :) – migajek

+0

안녕 ryan, 그 구성 요소를 시도하고 싶지만 지원 웹 사이트는 나에게 오류 403 - 금단의 (당신은 당신은 특권이 없습니다.) –

+0

@Alin Sfetcu, 최근 호스팅 서비스를 변경했으며 아직 모든 링크와 포럼을 다시 설치하지 않았습니다. 진실을 말하면 나는 이미 지원 포럼이 운영되고 있다고 생각했습니다. 최대한 빨리 살펴 보겠습니다. 미안하다. 내가 말했듯이 Torry 사이트 사본은 여전히 ​​작동해야합니다. –

1

런타임시 코드에서 "사실 이후"이벤트를 항상 연결할 수 있습니다. (양식을 작성한 후 가장 가능성이 권리를) 다음

type 
    TEventHolder = class 
    private 
    FSFActivate: TNotifyEvent; 
    published 
    property SavedFormActivate : TNotifyEvent 
     read FSFActivate write fSFActivate; 
    end; 

type 
    TMainForm = class(Tform) 
    : 
    SavedEvents : tStringList; 
    procedure ChildFormActivate(Sender: TObject); 
    procedure InitChildForm(MdiForm:TForm); 
    end; 

procedure TMainForm.ChildFormActivate(Sender: TObject); 
var 
    i : integer; 
begin 
    // your special processing here this is called for the child form. 
    i := SavedEvents.IndexOf(ClassName); 
    if i <> -1 then 
    tEventHolder(SavedEvents.Objects[i]).SavedFormActivate(Sender); 
end; 

procedure TMainForm.InitChildForm(MdiForm:TForm); 
var 
    OrigEvents : TEventHolder; 
begin 
    if not Assigned(SavedEvents) then 
    SavedEvents := tSTringlist.create; 
    if Assigned(MdiForm.OnActivate) then 
    begin 
     OrigEvents := tEventHolder.create; 
     OrigEvents.SavedFormActivate := MdiForm.OnActivate; 
     SavedEvents.AddObject(MdiForm.ClassName,OrigEvents); 
    end; 
    MdiForm.OnActivate := ChildFormActivate; 
end; 

를 프로그램의 일부 지점에서 제네릭에 이벤트 핸들러를 설정 InitChildForm 전화 : 기본적으로 다음과 같은 형태 일반적인 OnActivate를 만듭니다. 물론 메인 폼 클로저에서 SavedEvents (및 링크 된 객체)를 해제해야 할 것입니다.

관련 문제