關于動態使用package |
答題得分者是:alice
|
donlly
一般會員 發表:45 回覆:73 積分:23 註冊:2004-11-30 發送簡訊給我 |
請問各位一下程式碼有錯嗎?為何在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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |