begin
CorbaInitialize;
// Add CORBA server Code Here
Acct := TAccountSkeleton.Create('Array Server', TAccount.Create);
BOA.ObjIsReady(Acct as _Object);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
InitCorba;
Memo1.Lines.Add('Account object created...');
Memo1.Lines.Add('Server is ready');
end;
end.
//客户端程序
unit ClientMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Corba, StdCtrls, Account_I, Account_C;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ private declarations }
protected
{ protected declarations }
Acct : Account;
myArray : ArrayType;
procedure InitCorba;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.InitCorba;
begin
CorbaInitialize;
Acct := TAccountHelper.bind;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
j: Integer;
begin
InitCorba;
for j := 0 to 2 do
myArray[j] := (j 1) * 100;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := FormatFloat('InputArray = $#,##0.00', Acct.inputArray(myArray));
end;
end.
上面的程序实例很简单我就不一一说明了,下面我们来看一个数据访问的实例
//IDL
interface Employee {
any getEmployeesByName(in string name);
};
接口方法声明单元
//XXX_Impl.pas
interface
uses
SysUtils,
CORBA,
employee_i,
employee_c;
type
TEmployee = class;
TEmployee = class(TInterfacedObject, employee_i.Employee)
public
constructor Create;
function getEmployeesByName ( const name : AnsiString): ANY;
end;
implementation
uses dmEmployee,DMPooler, provider,DSIntf,ServerMain;
constructor TEmployee.Create;
begin
inherited;
end;
function TEmployee.getEmployeesByName ( const name : AnsiString): ANY;
var
DM: TdmEmploy;
RecsOut: Integer;
Options: TGetRecordOptions;
begin
Options := [grMetaData,grReset]; //must specify meta data
DM := ModulePooler.GetModule as TdmEmploy; //Get instance of datamodule from Pool
try
DM.qryEmployee.Close;
DM.qryEmployee.ParamByName('name').AsString:= name '%';
//显示连接服务器的数量
Inc(Form1.HitCount);
Form1.Label1.Caption := Format('Hit Count = %d', [Form1.HitCount]);
DM.qryEmployee.Open;
Result:=DM.proEmployee.GetRecords(-1, RecsOut, Byte(Options));
DM.qryEmployee.Close;
finally
ModulePooler.FreeModule(DM);//Return instance of DataModule to pool
end;
end;
initialization
//将TdmEmploy对象放入共享池中
ModulePooler.ModuleClass := TdmEmploy;
end.
//共享池的声明单元
主要描述如何提供一个多客户的访问数据提供
unit DMPooler;
interface
uses SysUtils, Classes, Forms, SyncObjs, Windows;
type
//本单元用于为每个客户提供一个独立使用的DataModule对象,相当于我们在以前的CORBA DataModule中选择创建的多线程对象一样的功能
TDataModuleClass = class of TDataModule; //定义类
TPooledModule = record//声明记录类型
Module: TDataModule; //继承标准的TdataModule
InUse: Boolean; //标明上面继承的TdataModule是否在使用
end;
TModulePooler = class
private
FCSect: TCriticalSection; //允许线程自己改变FModules
FModuleClass: TDataModuleClass; //在共享池中类化TDataModule
FModules: array of TPooledModule; //定义一个动态的对象记录数组
FSemaphore: THandle; //限定同时使用的用户规则
public
property ModuleClass: TDataModuleClass read FModuleClass write FModuleClass;
constructor Create;
destructor Destroy; override;
function GetModule: TDataModule;
procedure FreeModule(DataModule: TDataModule);
end;
const
PoolSize = 5;
var
ModulePooler: TModulePooler = nil;
implementation
uses Dialogs;
{ TModulePool }
constructor TModulePooler.Create;
begin
IsMultiThread := True;
FCSect := TCriticalSection.Create;
FSemaphore := CreateSemaphore(nil, PoolSize, PoolSize, nil);
end;
destructor TModulePooler.Destroy;
begin
FCSect.Free;
CloseHandle(FSemaphore);
end;
procedure TModulePooler.FreeModule(DataModule: TDataModule);
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




