2009-09-15 33 views
5

Tôi đang phát triển ứng dụng MDI gán một tab cho mỗi MDI đã tạo. Tôi cần phải "bắt" các sự kiện OnActivate, OnCreate và OnDestroy của biểu mẫu con trong mã biểu mẫu chính (cha). Đơn giản chỉ cần gọi mã ở dạng trẻ em là không thể đối với tôi, vì có nhiều lớp của biểu mẫu được sử dụng như trẻ em MDI, cũng plugin có thể tải biểu mẫu riêng ...Delphi MDI - xử lý mở/đóng/kích hoạt biểu mẫu con

Vì vậy, câu hỏi của tôi là: cách bắt Biểu mẫu con MDI đã được kích hoạt/hủy kích hoạt mà không sử dụng các sự kiện của biểu mẫu con?

Trả lời

3

Tôi đã viết một loại Taskbar của thành phần một loạt các năm trước đây chỉ làm loại điều này. Nó được gọi là TrmMDITaskbar. Bạn có thể tìm thấy một bản sao của nó trên Torrys, nó là một phần của gói thư viện rmControls. Nó xử lý kích hoạt, giảm thiểu, tối đa hóa, vv ..

Ý chính về cách nó hoạt động là nó móc cửa sổ MDIParents xử lý tìm kiếm các sự kiện MDIChild và thực hiện các công cụ dựa trên những sự kiện đó.

Nếu bạn đang tìm cách tự viết của riêng mình, tôi cho rằng đây là một nơi tốt để bắt đầu.

Ryan.

P.S. Phiên bản trên Torrys lớn hơn một chút nhưng vẫn hoạt động. Tôi có một phiên bản mới hơn có sẵn trên trang web hỗ trợ của mình. (Mills Enterprise)

+0

cảm ơn. cuối cùng tôi đã giải quyết nó bằng cách sử dụng mã từ SpTBXLib mà móc sử dụng cờ WH_CBT ... :) – migajek

+0

hi ryan, tôi muốn thử thành phần đó nhưng trang web hỗ trợ cho tôi Lỗi 403 - Bị cấm (Bạn đã cố gắng truy cập tài liệu mà bạn không có đặc quyền.) –

+0

@Alin Sfetcu, gần đây tôi đã thay đổi dịch vụ lưu trữ của mình và chưa nhận được tất cả các liên kết và diễn đàn được cài đặt lại của tôi. Để nói sự thật tôi nghĩ rằng tôi đã có các diễn đàn hỗ trợ hoạt động rồi. Tôi sẽ xem xét ASAP đó. Xin lỗi vì goof. Như tôi đã nói, bản sao trang Torry vẫn hoạt động. –

1

Bạn luôn có thể móc các sự kiện "sau khi thực tế" từ mã của bạn khi chạy. Về cơ bản tạo ra một OnActivate chung mà trông giống như sau:

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; 

Sau đó gọi InitChildForm để thiết lập xử lý sự kiện cho phiên bản generic của bạn tại một số điểm trong chương trình của bạn (rất có thể ngay sau khi bạn tạo ra các mẫu). Tất nhiên khi đóng biểu mẫu chính, bạn sẽ muốn giải phóng SavedEvents (và các đối tượng liên kết).

Các vấn đề liên quan