Delphi傳統模式開發模式修改程式時需要重新編譯整個專案。用DLL模式只需要修改相關的DLL。網上的大部份都是傳統模式開發的資料,好像很少DLL模式開發的參考資料。
用DLL模式按下列設計方案,做一個簡單的顯示資料庫內容
1、Data Module放ADOConnection、ADOQuery
2、主表單MainForm放DBGrid、DataSource顯示資料
3、DLL中寫個函式實作資料庫連接以及獲取資料。
要怎么實作?這方面的資料好像真的很少,就按我上面的方案誰能給個實體學習一下?
有人建議用mybean、tangram框架來實作,還有建議用三層、連接池、執行緒來實作,tangram看了幫助檔案還是不太清楚怎么做,mybean感覺給新手學的資料還有待完善。至于三層架構,做單機版的應用三層是不是還得搭個服務器?這些技術我當然也想學,只是我的水平還太低,這些技術對我來說有些深奧。網上很多資料太老,能否介紹一些實用的資料或書籍學習一下?
uj5u.com熱心網友回復:
貌似你自己說的兩個插件框架,都有完整的例子和檔案吧,如果你要別人現場給你寫的,可能還不如他們的完備吧,如果要別人完全手把手的給你寫好教程,這個估計不太可能。所謂引路人,別人只會給你指一個方向,不會帶著你走路啊uj5u.com熱心網友回復:
兩個框架檔案都看了怎么弄還不知道呢,里面的demo找來找去好像也沒找到我想要的例子,再加上例子里都不是單一功能的模塊。代碼看得也頭疼。我要的這個實體會寫的人應該兩分鐘就寫完了。不過我自已也在寫,用共享全域變數的方法,找到一點頭緒,就是寫不出來,還是因為我水平太菜。我要是寫得出來我一定把代碼粘上來,想必也有很多初學者想要,就是都找不到完整的實體。
uj5u.com熱心網友回復:
Delphi開發模式:采取主程式呼叫模塊檔案,是這是普遍使用的。但是模塊的方式,大體通過以下三種方式
1、EXE方式
2、Dll方式
3、bpl方式
大多數采取bpl包的子模塊方式,只有這種模式,主程式與子模塊之間可以共享資料。比如,全域變數和資料模塊。
而EXE模塊,就是一個的模塊。有自己的資料模塊。
DLL模式,比較難一點,它可以通過共享記憶體的方式,讓主程式與Dll之間共享全域。
uj5u.com熱心網友回復:
你說的這個怎么那么像delphi呼叫windows.api的函式.
你是不是只是想把函式封裝在dll里?
你看看delphi自己的api.pas里怎么搞的不就好了.
uj5u.com熱心網友回復:
參考了網路上一個共享全域變數的例子,該例子能夠實作EXE+DLL獲取Datamodule中的adoconnection的連接字串,該例子由DMDll.dll(datamodule)、CommonDll.dll(實作獲取資料程序GetData()) 、主表單Main構成,其中global.pas存放全域變數,供其它單元呼叫。該例在Delphi 7+win32位系統下可運行, 64位系統運行后主視窗不能顯示。
該例只是獲取Datamodule中的adoconnection的連接字串,我也嘗試把GetData()改成由ADOQuery獲取資料集,結果是編譯不能通過。也不知道這個getdata()要怎么寫才能把獲取的資料集在Form1的DBGrid上顯示出來。
是不是因為沒有創建記憶體映射的原因呢?
以下是該例完整代碼:
DMDll.dll
library DMDll;
{ Important note ......}
uses
SysUtils,
Classes,
DM in 'DM.pas' {DataModule1: TDataModule},
global in 'global.pas';
{$R *.res}
function GetGlobalData:PGlobalData;stdcall;
begin
Result:=g_pGlobalData;
end;
exports
GetGlobalData;
begin
NEW(g_pGlobalData);
g_pGlobalData^.ADOConn:=dm.DataModule1.ADOConn;
g_pGlobalData^.Query1 :=dm.DataModule1.Query1;
g_pGlobalData^.DS1:=dm.DataModule1.DS1;
end.
unit DM;
interface
uses
SysUtils, Classes, DB, ADODB;
type
TDataModule1 = class(TDataModule)
ADOConn: TADOConnection;
Query1: TADOQuery;
DS1: TDataSource;
private
{ Private declarations }
public
{ Public declarations }
end;
var
DataModule1: TDataModule1;
implementation
{$R *.dfm}
uses Activex;
initialization
CoInitialize(nil);
DataModule1:= TDataModule1.Create(nil);
finalization
CoUninitialize;
end.
unit global;
interface
uses ADODB,DB;
type
PGlobalData = ^TGlobalData;
TGlobalData = record
ADOConn:TAdoConnection;
Query1:TADOQuery;
DS1: TDataSource;
end;
var
g_pGlobalData:PGlobalData; //全域變數implementation
end.
-----------------------------------------------------------
CommonDll.dll
library CommonDll;
{ Important note ......}
uses
SysUtils,
Classes,
global in 'global.pas',
Dialogs;
{$R *.res}
procedure Init(P:Pointer); //指標指向DMDll.dll的全域共享資料
begin
g_pGlobalData:=P;
end;
procedure GetData(); //獲取資料
begin
if Assigned(g_pGlobalData) then
ShowMessage(g_pGlobalData^.ADOConn.ConnectionString);
end;
exports
Init,GetData;
begin
end.
----------------------------------------------------------------------
主表單Form1
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses global;
{$R *.dfm}
function GetGlobalData:PGlobalData;stdcall;external 'DMDll.dll';
procedure GetData;external 'CommonDll.dll';
procedure InitOtherDll1(P:Pointer);external 'CommonDll.dll' name 'Init';
procedure TForm1.Button1Click(Sender: TObject);
begin
GetData;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
g_pGlobalData:=GetGlobalData;
InitOtherDll1(g_pGlobalData);
end;
end.
uj5u.com熱心網友回復:
可以參考<delphi面向物件編程思想>一書中的封裝篇.里面有完整的實體.轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/84780.html
標籤:數據庫相關
上一篇:FASTREPORT報表問題
