求助:一个应用程序服务器使用两个或多个不同远程数据模块,为何其中一个引用另一个会出错?(200分)

  • 主题发起人 主题发起人 Ktcs
  • 开始时间 开始时间
to:siyan,
TStaff = class(TObject)
private
function GetNextOfficeCode: string;
function GetAreaCode: string;
procedure FreeRights;
procedure GetRights;
public
//单位信息
DUTY_OFFICE_CODE: string;
DUTY_OFFICE_NAME: string;
//部门信息
DEPT_CODE: string;
DEPT_NAME: string;
//员工信息
STAFF_CODE: string;
STAFF_NAME: string;
STS: string;
LoginCryptogram: string;
//登录密码
LoginCode: string;
//登录员工号
RightList: TStringList;
//权限列表
procedure GetStaffInfo;
procedure RegLogoutSystem(var sLogon: string);

constructor Create;
destructor Destroy;
override;
protected
end;
Tstaff类是如此,可是如何创建TStaff实例数组?用什么命令呢?
 
var staffarray :array of TStaff;
创建:在TDMMain.OnCreate事件中处理
指定数组长度SetLength(StaffArray,High(StaffArray)+2);
获取当前操作数组索引CurIndex:=High(StaffArray)
StaffArray[CurIndex]:=TStaff.Create;
 
to:siyan有几个不明白的地方再次请教。
1、为何要指定数组长度SetLength(StaffArray,High(StaffArray)+2);?
2、可否把Ustaff这个实例独立成一个单元,而不要放在远程数据模块中?
3、若Tstaff这个实例必须放在远程数据模块中,那么你的方法是否是这样呢?
procedure TDmMain.RemoteDataModuleCreate(Sender: TObject);
begin
SetLength(StaffArray,High(StaffArray)+2);
end;
然后用type library设置两个方法
(1)procedure TDmMain.GetStaffIndex(Index: OleVariant);
var
CurIndex:integer;
begin
CurIndex:=High(StaffArray);--为何要取high值?
StaffArray[CurIndex]:=TStaff.Create;
end;
(2)function tdmMain.getStaff(index:integer):TStaff;
begin
result:=StaffArray[Index]
end;

可是该方法返回的值为Tstaff,我在Type library中要如何设置呢?
3、最后一个问题
客户端如何调用呢?是否是如下所示
socketconnection1.appserver.getstaffindex;
socketconnection1.appserver.getstaffindex;
那么我的客户端要如何取得这个Tstaff实例的属性呢?
对不起,本人姿质较差,望你指教!!!
 
1、动态数组使用前必须指定数组大小,分配地址空间
2、可以
3(1)、CurIndex值必须在TDmMain.RemoteDataModuleCreate(Sender: TObject);中获取
且需是类成员变量,不能定义为局部变量
procedure TDmMain.RemoteDataModuleCreate(Sender: TObject);
begin
SetLength(StaffArray,High(StaffArray)+2);
CurIndex:=High(StaffArray);//表示最新创建的就是当前客户端对应的
StaffArray[CurIndex]:=TStaff.Create;
end;
3(2)、如果你的TStaff的实例需要客户端直接调用,需要把它作成一个COM对象
如果只是服务器端的其他对象调用,可以不使用接口调用而是使用对象实例方法调用
这样不需要使用类型库定义
4、客户端通过socketconnection1.appserver.getstaffindex;获取对应staff的索引
然后在其他需要该实例的远程数据模块中,公布一个方法让客户端把这个索引传递过去
 
siyan 兄: 请不要见怪,您就帮到底吧!
(1)我客户端是要用到Tstaff实例中的一些属性和方法,作成Com对象恐怕很难吧!请问通过什么方法实现呢?我从未做过COM对象。
(2)方法GetStaffIndex应该如何编写呢?还有您说的“在其他需要该实例的远程数据模块中,公布一个方法让客户端把这个索引传递过去”这个方法又要怎么编写呢?
我想应该是最后一次麻烦你啦!再不会,我都不好意思再问啦!
 
创建一个COM对象非常简单,new-ActiveX-COM OBject(建议用Automation Object)
客户端需要通过TDMMain来访问TStaff就需要用到聚合
惭愧的是,我刚才弄了半天,还是没弄出来怎么将IStaff接口传递到客户端
水平有限,实在不好意思
如果用包容的话,做起来又比较麻烦,看来你得找其他人帮你了
对于你的第二个问题,服务器端TRemote DataModule定义一个CurIndex属性,客户端把从tdmmain中获取的curindex记录在本地的staffindex里,然后将staffindex传递给TRemote DataModule
procedure TRemoteDataModule.getstaffindex(vars staffindex vaiant);
begin
curinedex:=staffindex;
end;
 
siyan 兄:
(1)你是否是说目前如果把Tstaff作成Com对象,但是要处理该对象与其它远程数据模块的调用较麻烦,也较难实现?你是否是这个意思,若是我就不把它作成单独的Com对象,考虑其它办法引用该Tstaff的属性,请你确认一下?
(2)我明白了你的作法,该方法实际上因为远程数据模块中的Tstaff 数组是动态的,本地只是保留登录成功的所对应的数据序号,要引用时再把它返回给远程数据模块。
另外再问你一下,是否用Automation Object 只能包含数据模块,而不能包含一个remote datamodule?见笑啦。
 
1、本来应该是比较简单的,只是我没有弄出来,所以,不能帮你往这个方向去做
如果你“考虑其它办法引用该Tstaff的属性”不是很困难的话,可以试一下
2、其实我就是这个意思
3、不明白你的问题是什么意思
 
这个问题也该结贴啦!谢谢你Siyan,也谢谢所有热心人!!!
 
To Siyan 兄:
我根据你的指导,在远程数据模块中已经定义了公共变量curindex,Staffarray
并设置公共函数GetStaff,而且还公布了Method--GetStaffIndex;
var
DmMain:TLogin;
Staffarray :array of TStaff;
function GetStaff(index:integer):TStaff;
CurIndex :integer;
procedure TLogin.RemoteDataModuleCreate(Sender: TObject);
begin
DutyOras.Connected:=True;
SetLength(StaffArray,High(StaffArray)+2);
CurIndex:=High(StaffArray);//表示最新创建的就是当前客户端对应的
StaffArray[CurIndex]:=TStaff.Create;
end;
function GetStaff(index: integer): TStaff;
begin
Result:=StaffArray[Index];
end;

function TLogin.GetStaffIndex(var StaffIndex: OleVariant): OleVariant;
begin
Result := StaffIndex;
end;
以上设置完成后,我在客户端根本无法获取远程数据模块Create时所取的CurIndex这个值,也就无法再使用GetStaffIndex方法和GetStaff函数,请给予指点迷津,客户端要如何实现?
 

Similar threads

后退
顶部