Delphi所带demo\Corba\DataModule示例的简化实现步骤

品雪 作于1999.10.31~11.1

pinxue@hotmail.com http://pinxue.yeah.net

李维的实战篇2对于corba的原理与体系结构讲得非常透,但其实做部份(13-42~13-48页)对例子程序的制作步骤却语焉不详(该不会是写累了吧),着实让俺晕了一会儿。好在Delphi自己带有两个例子,其中datamodule目录下的那个是针对数据库应用的,与实战篇2接近,俺参照这个程序连蒙带猜自己做了一个c/s程序了,基本搞清楚制作的步骤。在此贴出以飨同好,不到之处亦请不咎指点。

一、做Server

  1. 生成一个新的Application
  2. 在Form1上放个Label,Label1.Caption指定为'My Corba Tester Server Running ...'
  3. 在Form1上放个Label,Label2.Caption指定为'now , 0 clients connected'
  4. 给TForm1类加一个priviate的成员:clientscount : integer;
  5. 给TForm1类加一个public的成员:procedure UpdateClients(bInc : boolean);
    procedure UpdateClients(bInc:boolean);
    begin
      if bInc then Inc(clientscount) else Dec(clientscount);
      Label2.Caption := 'now, '+IntToStr(clientscount)+' clients connected';
    end;
    至此服务器程序的界面做好
  6. File | New 弹出New Item对话框
  7. 切换到Multitier页,双击Corba Data Module图标,以加入Corba数据模块
  8. 在弹出的对话框中填上模块类的名字DBServer2,其它不变。
    //Delphi会自动定义TDBServer2类,并以之为类型定义DBServer2对象实例
    //在initialization部分创建名为DBServer2Factory的corba类工厂对象(通俗的说是定义了一个对象生成器,它可应客户端的请求建立corba对象来完成客户服务。注意:默认是为每个客户生成一个对象实例,你也可以选择让所有的客户共享一个实例。
    //
    //代码如下:
    //initialization TCorbaVclComponentFactory.Create('DBServer2Factory', 'DBServer2','IDL:Project1/DBServer2Factory:1.0', IDBServer2, TDBServer2, iMultiInstance, tmSingleThread);
    //参数依次为:类工厂接口名,类工厂对象实例名,类工厂对象的Corba Repository ID,数据模块接口的GUID,数据模块接口的实现类,模块对象实例生成模式,线程使用模式
  9. 在数据模块里放一个Table,Table1.Database指定为DBDemo,Table1.Table指定为biolife.db,Table1.Active设为True。
  10. 在代表Table1的图标上击右键,选Export Table1 From data module,将Table1做为Provider导出,以便为客户端提供的数据集提供数据。(另外必要时可以放入一个TProvider来完成之)
  11. 确认当前Form是数据模块(DBServer),或编辑窗中的当前页是数据模块对应在代码(Unit2),选择菜单File | Use Unit,在弹出的对话框中双击Unit1以引用之(以后就可以使用Form1对应单元中的内容了。)
  12. 为数据模块的OnCreate和OnDestroy指定响应过程,用以跟踪客户数目:
    OnCreate中调用Form1.UpdateClients(True);
    OnDestroy中调用Form1.UpdateClients(False);
    含义为当为一个客户生成一个corba数据模块实例时客户数加1,而销毁时减1。
  13. File | Save All,注意Project的名字存为CorbaTester。(客户端要用到)
  14. Project | Build (或按F9试运行之)。
  15. 服务器制作成功,如果VisiBroker Smart Agent还没启动,启动之(到Borland Delphi程序组里的那个Visibroker组里头找,或在WinNT 4 控制面板的“服务”里启动之)

二、客户端

  1. 生成一个Project
  2. 在Form1上放一个Corba Connection(在Midas页),CorbaConnection1.ResponsitoryID填为CorbaTester/DBServer2,(Server Project名/Corba对象名参见服务器的第8步和第13步
  3. 在Form1上放一个ClientDataSet,ClientDataSet1.RemoteServer选刚才放的CorbaConnection1,ProviderName填Table1(还记得服务器制作的第10步吗?
  4. 在Form1上放一个DataSource,DataSource1.DataSet选刚才放的ClientDataSet1。
  5. 放一个DBNavigator,一个DBGrid,其DataSource都设为4步放到DataSource1。
  6. 响应Form1的OnCreate事件,代码如下:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    try
      CorbaConnection1.Connected:=true;
      ClientDataSet1.Open;
    except
      on E:Exception do
       begin
        ShowMessage(E.Message+': Server should be running.');
        Application.Terminate;
       end;
    end;
    end;
  7. 保存并Build之。Project存为client.dpr(随意)
  8. 先启动服务器程序CorbaTester,然后启动多个client,client均能读出表内数据,CorbaTester能跟踪显示客户个数。
  9. 如果要修改数据则做如下步骤:
    1. 服务器的corba数据模块中的Tabl1.CacheUpdate要设为true(如果看不见数据模块从菜单View|View Form选DBServer2就可以了)。
    2. 重新Build服务器。
    3. 客户端在Form1上加一个ActionList(默认在Standard页最后一个)
    4. 双击ActionList1,在对话框的Action栏里击右键,选New Action
    5. 单击选中刚加的Action1,在Object Inspect里将Enabled设为True,并指定对OnExecute和OnUpdate事件的响应,代码如下:
      procedure TForm1.Action1Update(Sender: TObject);
      begin
       Action1.Enabled:= ClientDataSet1.ChangeCount>0;
      end;

      procedure TForm1.Action1Execute(Sender: TObject);
      begin
       ClientDataSet1.ApplyUpdates(-1);
      end;
    6. 客户端在Form1上加一个SpeedButton(控件面Additional页里),SpeedButton1.Action选定为Action1,SpeedButton1.Caption设为一个空格,SpeedButton1.Glyph选择program files\common files\borland shared\images\buttons\check.bmp。
    7. 保存,编译。先启动server,再运行多个client之。此时如果客户端对表做了修改就可以按SpeedButton1提交给服务器,此后任何用户点一下DBNavigator1的最后一个refresh按钮就可以看到修改的结果了。
  10. 试一试启动多个server和多个client,可发现client是平均分配给各个服务器的。