请教:如何利用“包”来分割庞大的应用程序???分多用不完了,再送100分 rt:请教:如何利用“包”来分割庞大的应用程序???分多用不完了,再送100分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在利用installshield打包时,在disk builder时选择disk的大小,然后在打包时他会把你的程序打成(你的打包程序总大小/你选择的disk的大小)个包 如 何 使 用 Delphi 開 發 大 型 主 從 架 構 系 統 - Package 的 秘 密 和 威 力 (續)到 這 裡 為 止 我 們 只 是 證 明 了 使 用 資 料 模 組 Package可 以 讓 應 用 程 式正 確 的 執 行 , 但 是 主 程式 啟 動 的 時 間 和 一 般 獨 立 的 EXE 沒 有 什 麼 不 同 。 但 是 接 下 來 的 情 形 就 比 較 有 趣 了 。 因 為 我 們 要 藉 由 接 下 來 的 程 式 碼 來 證 明 使 用 Package 可 以 大 幅 加 快 子 系 統 的 載 入 速 度 。在 主 表 格 中 有 一 個 按 鈕 『載 入 第 二 個 UI Package』 。 這 個 按 鈕 的 功 能 就 是 模 擬 載 入 子 系 統 的 功 能 。 當 使 用 者 點 選 這 個 按 鈕 之 後 , 範 例 程 式 會 載 入 另 外 一 個 只 有 使 用 者 介 面 的Package , 而 且 這 個 Package 必 須 再 使 用 剛 才 載 入 的 資 料 模 組Package 來 顯 示 資 料 。 藉 由 這 個 模 擬 的 子 系 統 功 能 , 我 們 要 證 明 資 料 模 組 Package 可 以 在 不 同 的 模 組 中 共 用 而 且 可 以 加 快 模 組 啟 動 的 時 間 。這 個 按 鈕 的 OnClick 事 件 處 理 函 數 和 主 表 格 的 FormActvate 事 件 處 理 函 數 非 常 的 類 似 , 它 也 是 呼 叫 LoadUIPackage 程 序 以 便 載 入 一 個 使 用 者 介 面 Package 。procedure TMainForm.Button1Click(Sender: TObject);begin LoadUIPackage;end; LoadUIPackage 和 LoaddbPackage 幾 乎 一 模 一 樣 , 它 也 是 呼 叫Delphi 的 LoadPackage 和 GetClass 載 入 Package , 取 得 使 用 者 介 面 表 格 的 Meta-Class , 建 立 使 用 者 介 面 表 格 物件 , 搜 尋 資 料 模 組 中 的 Query 元 件 , 然 後 顯 示 資 料 庫 的 資 料 。procedure TMainForm.LoadUIPackage;begin //我們必須載入使用者介面Package以便連結到資料庫tryUIConnect := LoadPackage(UIPackages);LoadUIModule;excepton E : Exception dobeginMessageBeep(Word(-1));ShowMessage(E.Message);Application.Terminate;end;end;end;procedure TMainForm.LoadUIModule;variCounter : Integer;aDS : TDataSource;begin{ Note that TApplication "owns" this form and thus it must be freed priorto unloading the package }pkgModuleClass := GetClass('TUIPackageForm');if pkgModuleClass <> nil thenbeginaPkgForm := TCustomForm(TComponentClass(pkgModuleClass).Create (Application));for iCounter := 0 to aPkgForm.ComponentCount - 1 dobeginif UpperCase(aPkgForm.Components[iCounter].ClassName) = 'TDATASOURCE' thenbeginaDS := TDataSource(aPkgForm.Components[iCounter]);aDS.DataSet := aQuery;break;end;end;aPkgForm.Visible := True;end;end; 當 我 們 完 成 載 入 使 用 者 介 面 Package 的 功 能 , 再 執 行 範 例 程 式 並 且 按 下 『載 入 第 二 個 UI Package』 按 鈕 之 後 , 可 以 看 到 類 似 圖 九 的 畫 面 。圖 九 第 二 個 使 用 者 介 面 Package 啟 動 的 畫 面令 人 驚 訝 的 是 , 使 用 者 介 面 Package 之 中 的 表 格 會 立 刻 的 顯 示 出 來 , 幾 乎 完 全 不 需 要 等 待 。 表 格 一 是 我 使 用 這 個 範 例 程 式 和 使 用 二 個 獨 立 的 EXE 應 用 程 式 比 較 的 結 果 。 從 表 格 中 你 可 以 看 到 使 用Package 載 入 子 系 統 比 使 用 EXE 載 入 子 系 統 整 整 快 了 十 倍 。 使 用 獨 立 的EXE 應 用 程 式 使 用EXE 加Package 的 功 能 主 程 式 啟 動 時 間 20 20 其 餘 模 組 啟 動 時 間 20 2 表 格 一 獨 立 的 EXE 和 使 用 Package 的 EXE 執 行 的 效 率 比 較圖十 使 用Package 的 應 用 程 式 和 一 般 應 用 程 式 執 行 效 率 的 比 較從 上 面 的 結 果 我 們 就 可 以 知 道 使 用 Package 的 好 處 , 它 不 但 可 以 讓 我 們 共 用 資 源 , 也 能 夠 改 善 子系 統 啟 動 的 時 間 。當 然 應 用 程 式 在 使 用 完 畢 之 後 , 它 必 須 釋 放 動 態 載 入 的 Package 以 便 釋 放 系 統 資 源 。 在 主 表 格 的 FormClose 事 件 處 理 函 數 中 它 呼 叫 了 UnLoadAddInPackage 程 序 並 且 傳 遞 Package 的 handle 值 做 為 參 數 以 便 釋 放 Package 。procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);begin UnLoadAddInPackage(dbConnect);UnLoadAddInPackage(UIConnect);end; UnLoadAddInPackage 先 從 全 域 物 件 Application 中 找 到 載 入 的 資 料 模 組 和 使 用 者 介 面 表 格 , 先 釋 放 這 些 動態 載 入 , 建 立 的 物 件 , 切 斷 它 們 和Application 和 關 係 , 再 利 用 Package 的 handle 值 解 除 Package 對 Windows 的 註冊 , 最 後 再 呼 叫 UnLoadPackage 釋 放 載 入 到 記 憶 體 之 中 的 Package 。procedure UnLoadAddInPackage(Module: THandle);var i: Integer;M: TMemoryBasicInformation;beginfor i := Application.ComponentCount - 1 downto 0 dobeginVirtualQuery(GetClass(Application.Components[i].ClassName), M, SizeOf(M));if (Module = 0) or (HMODULE(M.AllocationBase) = Module) thenbeginShowMessage(Application.Components[i].ClassName);Application.Components[i].Free;end;end;UnRegisterModuleClasses(Module);UnLoadPackage(Module);end; 當 你 結 束 主 程 式 時 , 你 應 該 會 看 到 類 似 圖 十 一 和圖 十 二 的 畫 面 。 這 些 畫 面 證 明 了 當 主 程 式 結 束 時 , 它 能 夠 正 確 的 釋 放 所 有 載 入 的 Package 以 釋 放 系 統 資 源 。圖 十 一 範 例 程 式 結 束 時 顯 示 它 正 確 的 釋 放 了 所 有 使 用 的 Package圖 十 二 範 例 程 式 正 確 的 釋 放 了 公 用 的 資 料 模 組 Package上 面 的 範 例 程 式 證 明 了 使 用 Package 的 確 能 夠 公 用 Package 以 及 Package 之 中 的 全 域 資 料 , 此 外 也 能 夠 幫 助 子 系 統 加 快 載 入 和 啟 動 的 時 間 。 但 是 主 程 式 在 啟 動 時 仍 然 需 要 載 入 資 料 模 組 Package , 連 結 資 料 庫 。 但 是 對 於 許 多 的 使 用 者 而 言 , 他 們 仍 然 會 希 望 讓 主 程 式 也 能 夠 很 快 的 出 現 。 要 達 成 這 個 目 標 , 你 還 需 要 藉 助 Delphi 執 行 緒 的 能 力 。 用INSTALLER设置安装包的大小就可以了 fast report for d2009安装 delphi7的grid fastreport显示图片。急急。。解决马上结贴。散分。 产生内联号 CSDN还是没有承认错误,继续播放日问广告 有段串口取地磅数据的代码提示出错,哪位大侠指点一下! 怎么样在TComboBox的里面四周画上线条 怎么搞这个数据库。 请教各位高人,在dbgrid中如何把焦点移到前一单元格.详情请进!! 如何控制ListBox的Scroll的颜色? 一个奇怪的问题 我用了一条这样的语句 j:=table1.recordcount; 为什么j得不到值????
begin
LoadUIPackage;end;
LoadUIPackage 和 LoaddbPackage 幾 乎 一 模 一 樣 , 它 也 是 呼 叫Delphi 的 LoadPackage 和 GetClass 載 入 Package , 取 得 使 用 者 介 面 表 格 的 Meta-Class , 建 立 使 用 者 介 面 表 格 物件 , 搜 尋 資 料 模 組 中 的 Query 元 件 , 然 後 顯 示 資 料 庫 的 資 料 。procedure TMainForm.LoadUIPackage;
begin
//我們必須載入使用者介面Package以便連結到資料庫
tryUIConnect := LoadPackage(UIPackages);
LoadUIModule;excepton E : Exception do
beginMessageBeep(Word(-1));
ShowMessage(E.Message);
Application.Terminate;end;end;end;procedure TMainForm.LoadUIModule;
variCounter : Integer;
aDS : TDataSource;begin{ Note that TApplication "owns" this form and thus it must be freed prior
to unloading the package }
pkgModuleClass := GetClass('TUIPackageForm');
if pkgModuleClass <> nil then
beginaPkgForm := TCustomForm(TComponentClass(pkgModuleClass).Create (Application));
for iCounter := 0 to aPkgForm.ComponentCount - 1 do
beginif UpperCase(aPkgForm.Components[iCounter].ClassName) = 'TDATASOURCE' then
beginaDS := TDataSource(aPkgForm.Components[iCounter]);
aDS.DataSet := aQuery;
break;end;end;
aPkgForm.Visible := True;end;end;
當 我 們 完 成 載 入 使 用 者 介 面 Package 的 功 能 , 再 執 行 範 例 程 式 並 且 按 下 『載 入 第 二 個 UI Package』 按 鈕 之 後 , 可 以 看 到 類 似 圖 九 的 畫 面 。
圖 九 第 二 個 使 用 者 介 面 Package 啟 動 的 畫 面令 人 驚 訝 的 是 , 使 用 者 介 面 Package 之 中 的 表 格 會 立 刻 的 顯 示 出 來 , 幾 乎 完 全 不 需 要 等 待 。 表 格 一 是 我 使 用 這 個 範 例 程 式 和 使 用 二 個 獨 立 的 EXE 應 用 程 式 比 較 的 結 果 。 從 表 格 中 你 可 以 看 到 使 用Package 載 入 子 系 統 比 使 用 EXE 載 入 子 系 統 整 整 快 了 十 倍 。 使 用 獨 立 的EXE 應 用 程 式 使 用EXE 加Package 的 功 能
主 程 式 啟 動 時 間 20 20
其 餘 模 組 啟 動 時 間 20 2 表 格 一 獨 立 的 EXE 和 使 用 Package 的 EXE 執 行 的 效 率 比 較
圖十 使 用Package 的 應 用 程 式 和 一 般 應 用 程 式 執 行 效 率 的 比 較從 上 面 的 結 果 我 們 就 可 以 知 道 使 用 Package 的 好 處 , 它 不 但 可 以 讓 我 們 共 用 資 源 , 也 能 夠 改 善 子系 統 啟 動 的 時 間 。當 然 應 用 程 式 在 使 用 完 畢 之 後 , 它 必 須 釋 放 動 態 載 入 的 Package 以 便 釋 放 系 統 資 源 。 在 主 表 格 的 FormClose 事 件 處 理 函 數 中 它 呼 叫 了 UnLoadAddInPackage 程 序 並 且 傳 遞 Package 的 handle 值 做 為 參 數 以 便 釋 放 Package 。procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnLoadAddInPackage(dbConnect);
UnLoadAddInPackage(UIConnect);end;
UnLoadAddInPackage 先 從 全 域 物 件 Application 中 找 到 載 入 的 資 料 模 組 和 使 用 者 介 面 表 格 , 先 釋 放 這 些 動態 載 入 , 建 立 的 物 件 , 切 斷 它 們 和Application 和 關 係 , 再 利 用 Package 的 handle 值 解 除 Package 對 Windows 的 註冊 , 最 後 再 呼 叫 UnLoadPackage 釋 放 載 入 到 記 憶 體 之 中 的 Package 。procedure UnLoadAddInPackage(Module: THandle);
var
i: Integer;
M: TMemoryBasicInformation;beginfor i := Application.ComponentCount - 1 downto 0 do
beginVirtualQuery(GetClass(Application.Components[i].ClassName), M, SizeOf(M));
if (Module = 0) or (HMODULE(M.AllocationBase) = Module) then
beginShowMessage(Application.Components[i].ClassName);
Application.Components[i].Free;end;end;
UnRegisterModuleClasses(Module);
UnLoadPackage(Module);end;
當 你 結 束 主 程 式 時 , 你 應 該 會 看 到 類 似 圖 十 一 和圖 十 二 的 畫 面 。 這 些 畫 面 證 明 了 當 主 程 式 結 束 時 , 它 能 夠 正 確 的 釋 放 所 有 載 入 的 Package 以 釋 放 系 統 資 源 。
圖 十 一 範 例 程 式 結 束 時 顯 示 它 正 確 的 釋 放 了 所 有 使 用 的 Package
圖 十 二 範 例 程 式 正 確 的 釋 放 了 公 用 的 資 料 模 組 Package上 面 的 範 例 程 式 證 明 了 使 用 Package 的 確 能 夠 公 用 Package 以 及 Package 之 中 的 全 域 資 料 , 此 外 也 能 夠 幫 助 子 系 統 加 快 載 入 和 啟 動 的 時 間 。 但 是 主 程 式 在 啟 動 時 仍 然 需 要 載 入 資 料 模 組 Package , 連 結 資 料 庫 。 但 是 對 於 許 多 的 使 用 者 而 言 , 他 們 仍 然 會 希 望 讓 主 程 式 也 能 夠 很 快 的 出 現 。 要 達 成 這 個 目 標 , 你 還 需 要 藉 助 Delphi 執 行 緒 的 能 力 。