線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1846
推到 Plurk!
推到 Facebook!

關于動態使用package

答題得分者是:alice
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-08 14:38:49 IP:219.235.xxx.xxx 未訂閱
請問各位一下程式碼有錯嗎?為何在delphi5可以,但是在delphi7不可以呢?    
unit PkgUtils;    interface    uses
  Windows, SysUtils, Classes, Forms, Controls, DB;    { Package }
function GetAddinPackages: TStrings;
function LoadAddinPackage(const PackageID, FileName: string): HMODULE;
procedure UnloadAddinPackage(ModuleInstance: HMODULE); overload;
procedure UnloadAddinPackage(const PackageID: string); overload;
procedure UnloadAddins;    { Form }
function CreateFormByClassName(const ClassName: string): TCustomForm;
function ShowModalFormByClassName(const ClassName: string): integer;    implementation    var
  AddinPackages: TStrings;    resourcestring
  sErrorCreateForm = 'Error ! ';    function GetAddinPackages: TStrings;
begin
  Result := AddinPackages;
end;    function LoadAddinPackage(const PackageID, FileName: string): HMODULE;
var
  ModuleInstance: HMODULE;
begin
  ModuleInstance := GetModuleHandle(PChar(ExtractFileName(FileName)));
  if ModuleInstance = 0 then
  begin
    ModuleInstance := LoadPackage(FileName);
     if AddinPackages.IndexOfObject(Pointer(ModuleInstance)) < 0 then
      AddinPackages.AddObject(UpperCase(PackageID), Pointer(ModuleInstance));
  end;
  Result := ModuleInstance;
end;    procedure UnloadAddInPackage(ModuleInstance: HMODULE);
var
  i: Integer;
  M: TMemoryBasicInformation;
begin
  { Make sure there aren't any instances of any of the classes from Module
    instantiated, if so then free them.  (this assumes that the classes are
    owned by the application) }
  for i := Application.ComponentCount - 1 downto 0 do
  begin
    VirtualQuery(GetClass(Application.Components[i].ClassName), M, SizeOf(M));
    if (ModuleInstance = 0) or (HMODULE(M.AllocationBase) = ModuleInstance) then
      Application.Components[i].Free;
  end;
  UnRegisterModuleClasses(ModuleInstance);
  UnloadPackage(ModuleInstance);
end;    procedure UnloadAddinPackage(const PackageID: string);
var
  i: integer;
begin
  i := AddinPackages.IndexOf(UpperCase(PackageID));
  if i < 0 then
    Exit;      UnloadAddinPackage(HMODULE(AddinPackages.Objects[i]));      { Maintain loaded package list }
   AddinPackages.Delete(i);
end;    procedure UnloadAddins;
var
  i: integer;
begin
  for i := 0 to AddinPackages.Count-1 do
    UnloadAddinPackage(HMODULE(AddinPackages.Objects[i]));
  AddinPackages.Clear;
end;    function CreateFormByClassName(const ClassName: string): TCustomForm;
var
  AClass: TPersistentClass;
begin
  { Note that TApplication "owns" this form and thus it must be freed prior
    to unloading the package }
  AClass := GetClass(ClassName);
  if AClass <> nil then
    Result := TComponentClass(AClass).Create(Application) as TCustomForm
  else
    raise Exception.CreateFmt(sErrorCreateForm, [ClassName]);
end;    function ShowModalFormByClassName(const ClassName: string): integer;
var
  frm: TCustomForm;
begin
  frm := CreateFormByClassName(ClassName);
  try
    Result := frm.ShowModal;
  finally
    frm.Release;
  end;
end;    //-----------------------------------------------------------------------------
initialization
  AddinPackages := TStringList.Create;    finalization
  AddinPackages.Free;    end.
發表人 - donlly 於 2005/01/08 15:03:11
alice
初階會員


發表:41
回覆:49
積分:28
註冊:2002-04-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-09 08:16:48 IP:61.229.xxx.xxx 未訂閱
DELPHI7 不可以, 是有出現何種錯誤訊息嗎? 因為我也有使用動態使用package在delphi7,並沒有問題, 除了要載入的form的formstyle 是 fsMDIChild時,會無法載入, 有 Exception class EInvalidOperation with message 'Cannot make a visible window modal'.  所以,我有另加    
 function ShowFormByClassName(const ClassName: string): integer;
var
  frm: TCustomForm;
begin
  //這裡creat form, 在form close 時要記得加上 Action := caFree 來 Release form
  frm := CreateFormByClassName(ClassName);
  frm.Show;
  Result:=0;
end;
 
不知道你所遇到的狀況是如何, 我的經驗供你參考
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-09 12:00:54 IP:219.235.xxx.xxx 未訂閱
明白!
系統時間:2024-05-21 23:42:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!