首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过泛型接口的异步事件

通过泛型接口的异步事件
EN

Stack Overflow用户
提问于 2016-04-19 09:16:46
回答 1查看 415关注 0票数 1

我得把几个测量设备连到我的应用程序上。在客户端,我使用带有通用方法(QueryValue)的接口。设备在COM端口上连接,并以异步方式访问:

  1. 请求一个值(=在COM端口上发送特定的字符序列)
  2. 等待回应

在“业务”方面,我的组件在内部使用TComPort,数据接收事件是TComPort.OnRxChar。我想知道我怎么才能通过界面触发这个事件呢?以下是我迄今所做的工作:

代码语言:javascript
复制
IDevice = interface
  procedure QueryValue;
  function GetValue: Double;
end;

TDevice = class(TInterfacedObject, IDevice)
private
  FComPort: TComPort;
  FValue: Double;
protected
  procedure ComPortRxChar;
public
  constructor Create;
  procedure QueryValue;
  function GetValue: Double;
end;

constructor TDevice.Create;
begin
  FComPort := TComPort.Create;
  FComPort.OnRxChar := ComPortRxChar;
end;

// COM port receiving data
procedure TDevice.ComPortRxChar;
begin
  FValue := ...
end;

procedure TDevice.GetValue;
begin
  Result := FValue;
end;

但是我需要一个事件来知道什么时候在客户端调用GetValue。执行这种数据流的通常方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2016-04-19 10:00:47

可以将事件属性添加到接口中。

代码语言:javascript
复制
IDevice = interface
  function GetValue: Double;
  procedure SetMyEvent(const Value: TNotifyEvent);
  function GetMyEvent: TNotifyEvent;
  property MyEvent: TNotifyEvent read GetMyEvent write SetMyEvent;
end;

并在TDevice类中实现。

代码语言:javascript
复制
TDevice = class(TInterfacedObject, IDevice)
private
  FMyEvent: TNotifyEvent;
  procedure SetMyEvent(const Value: TNotifyEvent);
  function GetMyEvent: TNotifyEvent;
public
  function GetValue: Double;
  procedure EmulChar;
end;

然后,像通常一样,在FMyEvent的末尾调用ComPortRxChar处理程序(如果被分配的话)。

代码语言:javascript
复制
 Tform1...
  procedure EventHandler(Sender: TObject);

procedure TForm1.EventHandler(Sender: TObject);
var
  d: Integer;
  i: IDevice;
begin
  i := TDevice(Sender) as IDevice;
  d := Round(i.GetValue);
  ShowMessage(Format('The answer is %d...', [d]));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  id: IDevice;
begin
  id:= TDevice.Create;
  id.MyEvent := EventHandler;
  (id as TDevice).EmulChar; //emulate rxchar arrival
end;

procedure TDevice.EmulChar;
begin
  if Assigned(FMyEvent) then
    FMyEvent(Self);
end;

function TDevice.GetMyEvent: TNotifyEvent;
begin
  Result := FMyEvent;
end;

function TDevice.GetValue: Double;
begin
  Result := 42;
end;

procedure TDevice.SetMyEvent(const Value: TNotifyEvent);
begin
  FMyEvent := Value;
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36713955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档