如何在Automation Object中添加事件,并在多个Client中同时响应???(100分)

  • 主题发起人 主题发起人 jazzfan
  • 开始时间 开始时间
J

jazzfan

Unregistered / Unconfirmed
GUEST, unregistred user!
我已经在Automation Object中添加了一个事件,
当只有一个Client时可以正常响应这个事件。
但是当我运行另一个Client时他会创建一个新的Sever,
而不是响应原来那个Sever的事件!
 
应该把threading model设置为single模式,
保证所有client访问一个server object.
 
>> 应该把threading model设置为single模式,
我想这样不大对吧?!

不知具体是怎样的?
 
instancing:=single instance 把
 
我又搞混了,这是我的“老习惯”了,顺手就写 :-(
 
不管是线程模型还是实例模型我都是过,但是并不解决问题。
注意:Sever和Client不再同一个进程中。
那位大虾有范例,请寄给我看看。
TConnectionPoint TConnectionPoints TEventSink是怎么工作的?
 
顺便把我的源码贴上
unit EventTestIMPL2;(Sever)

interface

uses
ComObj, ActiveX, AxCtrls, Classes, EventTest2_TLB, StdVcl;

type
TMYOB2 = class(TAutoObject, IConnectionPointContainer, IMYOB2)
private
{ Private declarations }
FConnectionPoints: TConnectionPoints;
FConnectionPoint: TConnectionPoint;
FSinkList: TList;
FEvents: IMYOB2Events;
procedure ValueChangeEvent(Sender: TObject);
public
procedure Initialize; override;
protected
{ Protected declarations }
property ConnectionPoints: TConnectionPoints read FConnectionPoints
implements IConnectionPointContainer;
procedure EventSinkChanged(const EventSink: IUnknown); override;
function Get_Value: Integer; safecall;
procedure Set_Value(Value: Integer); safecall;
end;

implementation

uses ComServ,SeverForm;

procedure TMYOB2.EventSinkChanged(const EventSink: IUnknown);
begin
FEvents := EventSink as IMYOB2Events;
if FConnectionPoint <> nil then
FSinkList := FConnectionPoint.SinkList;
end;

procedure TMYOB2.Initialize;
begin
inherited Initialize;
FConnectionPoints := TConnectionPoints.Create(Self);
if AutoFactory.EventTypeInfo <> nil then
FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
AutoFactory.EventIID, ckSingle, EventConnect)
else FConnectionPoint := nil;

FormSever:=TFormSever.Create(Nil);
FormSever.Show;
FormSever.SpinEdit1.OnChange:=ValueChangeEvent;
end;


function TMyOB2.Get_Value: Integer;
begin
Result:=FormSever.SpinEdit1.Value;
end;

procedure TMyOB2.Set_Value(Value: Integer);
begin
FormSever.SpinEdit1.Value:=Value;
end;

procedure TMyOB2.ValueChangeEvent(Sender: TObject);
begin
if FEvents <> nil then FEvents.ValueChanged;
end;

initialization
TAutoObjectFactory.Create(ComServer, TMYOB2, Class_MYOB2,
ciSingleInstance, tmApartment);
end.

//*****************************************************************************

unit ClienForm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,EventTest2_TLB;

type
TFormClient = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Procedure SeverEvent(Sender:TObject);
end;

var
FormClient: TFormClient;
MyOB:IMyOB2;
MyOBT:TMyOB2;

implementation

{$R *.DFM}


procedure TFormClient.FormCreate(Sender: TObject);
begin
MyOB:=CoMyOB2.Create As IMyOB2;
MyOBT:=TMyOB2.Create(Self);
MyOBT.Connect;
MyOBT.OnValueChanged:=FormClient.SeverEvent;
end;

procedure TFormClient.SeverEvent(Sender: TObject);
begin
FormClient.Edit1.Text:=IntToStr(MyOBT.Value);
end;

procedure TFormClient.Button1Click(Sender: TObject);
begin
MyOBT.Value:=100;
// MyOB.Value:=100;
end;

end.


 
难道高手们对这样的问题不感兴趣吗?即使不可能也该给我个答复呀!
 
一时忘记了 :-)

我记得同时向多个客户端发信息没你写得这段程序那么容易,
必须要循环向每个客户发送(激活相应事件)。

你看看这个例子,基本可以了解。
http://www.netdrive.com/MyDrive/get.jsp/%7Eoldpeasant/My%20Public%20Files/ChatServer.zip

这样的例子网上有很多,都是这种模式的,EventSink模式
就是这个含义,不是简单赋几个值就能实现的。
 
具体做法很多,关键是要在服务器程序内部建立一个Singleton对象(可以是一个局部对象,也可
以作内部的interface), 专门用来发送消息.
 
温柔一刀:
你给的文件我无法下载,Oldpeasant的PublicFiles中找不到ChatServer.zip。
能否EMail给我?还能多介绍几个例子吗?

老屯:
Singleton是什么对象,怎么个用法?能说清楚点吗?

感谢两位,看来我的分有主了!
 
不要展开Mypublicfiles那个tree,而是直接点mypublicfiles那个节点,
就会在右边看到ChatServer.zip了。
 
所谓Singleton是指你的程序中的某个只有一个Instance的对象, 在DELPHI中这种单一的
对象很多,比如全局的Application,Screen........

建立Singleton的技巧一般是这样的:
1. 在你的UNIT的Interface段中声明一个全局函数,返回所需要的对象
2. 在Implementation缎,声明一个局部变量,类型是所需要的变量
3. 在函数中检测局部变量是否为nil,如果nil,则创建该对象, 函数返回对象的Instance
4. 程序中用到该对象的时候,直接调用那个全局的函数来得到一个非nil的对象
5. 在Unit的finalization段,不要忘记释放这个对象

举例:
type
TChatUserManager = class
private
fUserList: TStrings;
public
constructor Create; override;
destructor Destroy; override;
function AddUser(Name: String): integer;
function DelUser(Name: String): integer;
procedure NotifyUser(Name: String; Message: String);
procedure Broadcast(Message: string);
end;

function UserManager: TUserManager;

implementation

var
SingletonUserManager: TUserManager;

function UserManager: TUserManager;
begin
if SingletonUserManager = nil then
SingletonUserManager := TUserManager.Create;
end;

initialization

finalization
SingletonUserManager.free;
end;
 
感谢一刀!
程序已经实现了,关键是要同时触发多个客户的事件。
EventSinkImp也很重要!
分数随即送上!。

Singleton的用处我还无法理解,尤其是进程间的应用。
那位能给个更详细的例子,当然也有分啦!
 
附加功能 将问题提前
 
错了错了,应该感谢huizhang,oldpeasant 就是他申请的吧!
你看他老人家都亲自来回答了,呵呵
 
多人接受答案了。
 
后退
顶部