2016-05-12 39 views
1

今天我對包中的幀有個疑問。 我已經包含一個簡單的框架包:Delphi創建包中的幀

unit fraMain; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
    Vcl.StdCtrls; 

type 

    TFrame1 = class(TFrame) 
    Label1: TLabel; 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

implementation 

{$R *.dfm} 

initialization 
    RegisterClass(TFrame1); 

finalization 
    UnRegisterClass(TFrame1); 

end. 

我已經創建了包,並使用它的一個新的projexct。該項目有一個簡單的形式,它的代碼是這樣的:

unit main; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, 
    System.Actions, Vcl.ActnList, Vcl.PlatformDefaultStyleActnCtrls, Vcl.ActnMan, 
    Vcl.StdCtrls; 

type 
    TfrmMain = class(TForm) 
    mnuMain: TMainMenu; 
    mnuFile: TMenuItem; 
    mnuModuli: TMenuItem; 
    mFilCloseModules: TMenuItem; 
    mModModulo1: TMenuItem; 
    mModModulo2: TMenuItem; 
    N1: TMenuItem; 
    mFilExit: TMenuItem; 
    actManager: TActionManager; 
    actExit: TAction; 
    actModulo1: TAction; 
    actModulo2: TAction; 
    procedure actExitExecute(Sender: TObject); 
    procedure actModulo1Execute(Sender: TObject); 
    private 
    FPackageHandle: Integer; 
    public 
    { Public declarations } 
    end; 

const 
    DIRPACK1 = 'C:\Users...'; 

var 
    frmMain: TfrmMain; 

implementation 

{$R *.dfm} 


{ Chiusura applicazione } 
procedure TfrmMain.actExitExecute(Sender: TObject); 
begin 
    Application.Terminate; 
end; 

procedure TfrmMain.actModulo1Execute(Sender: TObject); 
var 
    AClass: TClass; 
    AFrame: TFrame; 
begin 
    if FPackageHandle = 0 then begin 
    FPackageHandle := LoadPackage(DIRPACK1 + 'Pack_01.bpl'); 
    AClass := GetClass('TFrame1'); 
    if AClass <> nil then begin 

    end; 
    end; 
end; 

end. 

凡DIRPACK1是在BPL是路徑。 在「actModulo1Execute」操作中,我想創建框架。正如你所看到的,我得到了這個類,但在我不知道如何實例化框架之後。 哪個是創建框架的方式?

+1

你爲什麼要這樣加載軟件包?這是你的根本問題。動態加載它並且您無權訪問這些類型。你爲什麼不靜態加載它?然後你所有的問題都消失了。你爲什麼不停止使用軟件包,讓你的生活更輕鬆?請注意'GetClass('TFrame1')'將查找調用的可執行文件,而不是您的包。 –

+0

嗨大衛,我的意圖是實現一個模塊化應用程序,所以一些功能可以爲一組用戶和其他組提供一些用戶和其他人。爲此,我認爲創建每個包含所需功能的sone包。 – Eros

+0

這是一個非常艱鉅的方式來做到這一點。我不會把動態加載的軟件包視爲適合的目的。 –

回答

1

例如:

AClass := GetClass('TFrame1'); 
    if Assigned(AClass) and AClass.InheritsFrom(TCustomFrame) then 
    begin 
    AFrame := TCustomFrameClass(AClass).Create(Self); 
    AFrame.Parent := Self; 
    AFrame.Align := alClient; 
    AFrame.Show; 
    end; 

如果你不想使用RegisterClass然後另一種可能的方式是這樣的:

AClass := GetProcAddress(FPackageHandle, '@[email protected]@'); 

(慣例是<at><unit_name><at><class_name><at>)。

+1

在啓用運行時軟件包的情況下編譯主機可執行文件也至關重要,並且至少包含'rtl'和'vcl'包。否則'RegisterClass'和'GetClass'將在不同的上下文中被調用(使用運行時的'.dcp'包和使用RTL源的主機)並且找到類將失敗。 –