2014-12-16 22 views
5

Tôi đang làm việc trên delphi XE2.
Những gì tôi cần:
Tôi cần lớp MyFrame có khung mà không có bất kỳ thành phần hiển thị nào, nhưng với sự kiện mới hiển thị trong Trình kiểm tra đối tượng. Sự kiện này sẽ thông báo cho biểu mẫu của tôi (trên đó sẽ được đặt đối tượng MyFrame), đó là f.e. tất cả các dữ liệu trên khung hình đều được điền đầy đủ.delphi - Tạo khung tùy chỉnh với sự kiện mới

Những gì tôi có:
Dựa trên this post và câu trả lời của TOndrej, và that hint, nơi Ba cho thấy, rằng cho XE2 chúng ta cần phải thay thế

delphivclide := GetModuleHandle('delphivclide160.bpl'); 

với điều này:

delphivclide := GetModuleHandle('vcldesigner160.bpl'); 

Tôi có mã đó cho khung hình mới:

unit MyFrame; 
interface 
uses 
    System.Classes, Vcl.Forms; 
type 
    TMyFrame = class(TFrame) 
    private 
    protected 
    FOnFilledData : TNotifyEvent; 
    public 
    published 
    property OnFilledData : TNotifyEvent read FOnFilledData write FOnFilledData; 
    end; 
implementation 
end. 

Và đó mã cho các đơn vị đăng ký:

unit MyFrameReg; 
interface 
procedure Register; 

implementation 
uses Windows, DesignIntf, Dialogs, wFrame; 

procedure Register; 
var 
    delphivclide: THandle; 
    TFrameModule: TCustomModuleClass; 
begin 
    delphivclide := GetModuleHandle('vcldesigner160.bpl'); 
    if delphivclide <> 0 then 
    begin 
    TFrameModule := GetProcAddress(delphivclide, '@[email protected]@'); 
    if Assigned(TFrameModule) then 
    begin 
     ShowMessage('I''m here'); 
     RegisterCustomModule(TMyFrame, TFrameModule); 
    end; 
    end; 
end; 
end. 

Khi tôi sẽ xây dựng gói của tôi, tôi có nhắn Tôi ở đây, vì vậy tôi supossed, rằng MyFrame được đăng ký.

Vấn đề của tôi là gì:
Vấn đề là nó không hoạt động đến cùng.
Khi tôi chọn Ứng dụng VCL mới và muốn tạo MyFrame bằng cách chọn Tệp -> Mới -> Khác -> Dự án Delphi -> MyFrame thì sẽ hiển thị cửa sổ lạ bên dưới.
Khi tôi chọn một số thư mục ở đó và nhấp vào nút OK, dự án Delphi mới được đóng và dự án gói của tôi được mở.

the window

Sẽ rất vui mừng, nếu ai đó có thể tư vấn cho tôi, những gì tôi đã làm sai.

+3

Bạn đang sử dụng không có giấy tờ xe cho thuê không được hỗ trợ. Có lẽ việc thực hiện đã thay đổi. Sau khi tất cả, IDE bây giờ có thiết kế FMX mới. Không có gì ngạc nhiên khi mọi thứ có thể khác. –

+0

@DavidHeffernan Tài liệu chính thức chỉ hút khi bạn cần làm những việc như thế này ... –

Trả lời

1

đăng ký A. Khung lớp

Không cần phải làm điều đó trong một "cách hacky"

uses 
... 
    DMForm, 
    VCLFormContainer, 
... 

procedure Register; 
begin 
... 
    RegisterCustomModule(TYourFrameClass, TFrameModule); // for frames 
    RegisterCustomModule(TYourModuleClass, TDataModuleCustomModule); // for data modules 
... 
end; 

Có một cách khác xung quanh để thêm khung hình quá

type 
    TNestableWinControlCustomModule = class (TWinControlCustomModule) 
    public 
    function Nestable: Boolean; override; 
    end; 

function TNestableWinControlCustomModule.Nestable: Boolean; 
begin 
    Result := True; 
end; 

+

RegisterCustomModule(TYourFrameClass, TNestableWinControlCustomModule); 

Tên đơn vị (thử nghiệm trong XE7):

TCustomModule =>DesignEditors

TDataModuleCustomModule =>DMForm (designide.DCP)

TWinControlCustomModule =>WCtlForm (designide.dcp)

TFrameModule =>VCLFormContainer (vcldesigner.dcp)

Tôi giả sử rằng cho FireMonkey nó nên có thể trong tương tự cách (tìm fmxdesigner.dcp & kiểm tra nội dung bên trong trong Notepad ++)

B. Để sử dụng trong trình hướng dẫn "Mới ...", bạn cần đăng ký lớp thuật sĩ. Nếu bạn không có thời gian để viết lớp thuật sĩ chỉ cần tạo khung mới và sau đó thay thế tên lớp cha theo cách thủ công và thêm đơn vị thích hợp vào danh sách "sử dụng". Đó là tất cả

PS. Trong các phiên bản Delphi cũ đã có TDataModuleDesignerCustomModule metaclass thay vì TDataModuleCustomModule trong đơn vị DMDesigner

PPS. tên metaclass hiện khác:

TCustomFormCustomModule

TIDESourceModuleCustomModule

+1

Tôi đang thử nghiệm trên Delphi XE7 nhưng nó nói "tập tin không tìm thấy VCLFormContainer.dcu". ('DesignIDE' nằm trong mệnh đề' require'). Cái gì còn thiếu? – ExDev

+0

@ExDev Bạn đã đúng - Tôi đã sửa bài đăng của tôi ** Thêm _vcldesigner_ vào các mô-đun bắt buộc cho khung ** –

+0

Tôi đã kiểm tra và ** designide.dcp **/** fmxdesigner.dcp **/** vcldesigner.dcp ** vẫn tồn tại trong ** Delphi 10.2 Tokio **;) –

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