Delphi 2007中的IdThreadComponent(Indy 9)错误

j9per5c4  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(297)

我正在使用IdTCPClient和IdThreadComponent来获取条形码阅读器的一些信息。这段代码,经过一些修改,可以在Delphi 11和Indy 10中使用,但不能在Delphi 2007和Indy 9中使用:

procedure TPkgSendF1.IdThreadComponent1Run(Sender: TIdCustomThreadComponent);
var
  s: String;
begin
  s := IdTCPClient1.ReadLn('&', 20000, 1500);
  TThread.Queue(nil, procedure  // <== Expected @ but received PROCEDURE
                begin
                  ProcessRead(s);
                end);
end;

// [DCC Error] PkgSendF1.pas(239): E2029 Expression expected but 'PROCEDURE' found

procedure TPkgSendF1.ProcessRead(AValue: string);
begin
  Memo1.Text := AValue;
end;

如果我不使用TThread.Queue,我会错过一些阅读。我将感谢任何帮助。弗朗西斯科阿尔瓦拉多

eblbsuwk

eblbsuwk1#

匿名方法在 Delphi 2007中还不存在,它们是在Delphi 2010中引入的。因此,D2007中的TThread.Queue()只有一个版本接受TThreadMethod

type
  TThreadMethod = procedure of object;

这意味着您需要将对ProcessRead()的调用 Package 在一个helper对象中,该对象包含一个不带参数的procedure,例如:

type
  TQueueHelper = class
  public
    Caller: TPkgSendF1;
    Value: String;
    procedure DoProcessing;
  end;

procedure TQueueHelper.DoProcessing;
begin
  try
    Caller.ProcessRead(Value);
  finally
    Free;
  end;
end;

procedure TPkgSendF1.IdThreadComponent1Run(Sender: TIdCustomThreadComponent);
var
  s: string;
begin
  s := IdTCPClient1.ReadLn('&', 20000, 1500);
  with TQueueHelper.Create do
  begin
    Caller := Self;
    Value := s;
    TThread.Queue(nil, DoProcessing);
  end;
end;

仅供参考,Indy(9和10)在IdSync单元中有一个异步的TIdNotify类,您可以使用它来代替直接使用TThread.Queue(),例如:

uses
  IdSync;

type
  TMyNotify = class(TIdNotify)
  public
    Caller: TPkgSendF1;
    Value: String;
    procedure DoNotify; override;
  end;

procedure TMyNotify.DoNotify;
begin
  Caller.ProcessRead(Value);
end;

procedure TPkgSendF1.IdThreadComponent1Run(Sender: TIdCustomThreadComponent);
var
  s: string;
begin
  s := IdTCPClient1.ReadLn('&', 20000, 1500);
  with TMyNotify.Create do
  begin
    Caller := Self;
    Value := s;
    Notify;
  end;
end;

相关问题