特定のブランドやモデルに縛られず、いくつかの測定デバイス (キャリパー、体重計など) をアプリに接続する必要があるため、クライアント側では汎用メソッド ( QueryValue
) のインターフェイスを使用します。デバイスは COM ポートに接続され、非同期でアクセスされます。
- 値を求める (= COM ポートで特定の文字シーケンスを送信する)
- 応答を待ちます
「ビジネス」側では、私のコンポーネントは TComPort を内部的に使用します。これはデータ受信イベントですTComPort.OnRxChar
。インターフェイスを介してこのイベントを起動するにはどうすればよいでしょうか。これが私がこれまでに行ったことです:
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
しかし、クライアント側でいつ呼び出すかを知るためにイベントが必要です。その種のデータフローを実行する通常の方法は何ですか?