基于 midas 的三层开发

 本程序仅仅是一个 midas 程序的演示,真正要完成一些功能,还得花力气写较多的代码

 

 

一、创建服务器
新建一个 Application,然后添加 RemoteDataModule,在RemoteDataModule 中放置 Database,Query,Session,DataSetProvider 控件各一个。
代码如下:

 



 

  1. unit RemoteServer;
  2. {$WARN SYMBOL_PLATFORM OFF}
  3. interface
  4. uses
  5. Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
  6. DBClient, Server_TLB, StdVcl, DBTables, DB, Variants, Provider;
  7. type
  8. TServerModule = class(TRemoteDataModule, IServerModule)
  9.     Session1: TSession;
  10.     Database1: TDatabase;
  11.     Query1: TQuery;
  12.     Provide: TDataSetProvider;
  13.     procedure RemoteDataModuleCreate(Sender: TObject);
  14. private
  15.     { Private declarations }
  16. protected
  17.     class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID:
  18.       string); override;
  19.     function GetTableNames: OleVariant; safecall;
  20. public
  21.     { Public declarations }
  22. end;
  23. var
  24. ServerModule      : TServerModule;
  25. implementation
  26. {$R *.DFM}
  27. function TServerModule.GetTableNames: OleVariant;
  28. var
  29. I                 : Integer;
  30. TableNames        : TStrings;
  31. begin
  32. TableNames := TStringList.Create;
  33. try
  34.     Session1.GetTableNames(Database1.DatabaseName, '*.*', True,
  35.       False, TableNames);
  36.     result := VarArrayCreate([0, TableNames.Count - 1],
  37.       varOleStr);
  38.     for I := 0 to TableNames.Count - 1 do
  39.       result[I] := TableNames[I];
  40. finally
  41.     TableNames.Free;
  42. end;
  43. end;
  44. class procedure TServerModule.UpdateRegistry(Register: Boolean; const ClassID,
  45. ProgID: string);
  46. begin
  47. if Register then
  48. begin
  49.     inherited UpdateRegistry(Register, ClassID, ProgID);
  50.     EnableSocketTransport(ClassID);
  51.     EnableWebTransport(ClassID);
  52. end
  53. else
  54. begin
  55.     DisableSocketTransport(ClassID);
  56.     DisableWebTransport(ClassID);
  57.     inherited UpdateRegistry(Register, ClassID, ProgID);
  58. end;
  59. end;
  60. procedure TServerModule.RemoteDataModuleCreate(Sender: TObject);
  61. begin
  62. end;
  63. initialization
  64. TComponentFactory.Create(ComServer, TServerModule,
  65.     Class_ServerModule, ciMultiInstance, tmApartment);
  66. end.
  67. 然后保存,编译服务器程序
  68. 二、创建客户端
  69. 新建一个Application,然后添加 DComConnection,ClientDataSet,DateSource,ListBox,DBGrid,Memo,Button 各一个。用 DComConnection 可以自动连上远程服务器程序,然后控件之间进行关联
  70. 代码如下:
  71. unit frmMain;
  72. interface
  73. uses
  74. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  75. Dialogs, DB, StdCtrls, DBClient, MConnect, Grids, DBGrids, ComCtrls;
  76. type
  77. TForm1 = class(TForm)
  78.     DCOMConnection1: TDCOMConnection;
  79.     ClientDataSet1: TClientDataSet;
  80.     ListBox1: TListBox;
  81.     DataSource1: TDataSource;
  82.     PageControl1: TPageControl;
  83.     TabSheet1: TTabSheet;
  84.     TabSheet2: TTabSheet;
  85.     DBGrid1: TDBGrid;
  86.     Memo1: TMemo;
  87.     GroupBox1: TGroupBox;
  88.     Button1: TButton;
  89.     procedure FormCreate(Sender: TObject);
  90.     procedure Button1Click(Sender: TObject);
  91.     procedure ListBox1Click(Sender: TObject);
  92. private
  93.     { Private declarations }
  94. public
  95.     { Public declarations }
  96. end;
  97. var
  98. Form1             : TForm1;
  99. implementation
  100. {$R *.dfm}
  101. procedure TForm1.FormCreate(Sender: TObject);
  102. var
  103. I                 : Integer;
  104. TableNames        : OleVariant;
  105. begin
  106. DCOMConnection1.Connected := True;
  107. TableNames := DCOMConnection1.AppServer.GetTableNames;
  108. if VarIsArray(TableNames) then
  109.     for I := 0 to VarArrayHighBound(TableNames, 1do
  110.       ListBox1.Items.Add(TableNames[I]);
  111. end;
  112. procedure TForm1.Button1Click(Sender: TObject);
  113. begin
  114. ClientDataSet1.Close;
  115. ClientDataSet1.CommandText := Memo1.Lines.Text;
  116. ClientDataSet1.Open;
  117. end;
  118. procedure TForm1.ListBox1Click(Sender: TObject);
  119. begin
  120. end;
  121. end.

三、总结
通过 DCOM 进行三层开发是非常方便的,只要在服务器端写入需要的方法
在客户端可以非常方便的调用,当然了,AppServer 后的方法是点不出来的,需要写入和服务端相同的方法名,不过这一样很方便,通常情况下,服务端与客户端是一起开发的,就算不一起开发,也会有文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值