我试图像这样发送消息
strMsg := Memo.Text;
Tclient.IOHandler.WriteLn(strMsg);
但是我如何在服务器执行事件中记录memo.text中的文本?
Remy示例很好,但我是如何使用这样的代码
procedure TChatFo.SendClick(Sender: TObject);
var
strMsg: string;
begin
if tmemo.Text = '' then Abort;
strMsg := tmemo.Text;
Tcli.IOHandler.WriteLn(strMsg);
usertype.Clear;
end;
答案 0 :(得分:2)
Indy服务器是多线程的。数据在工作线程中接收,而不是主UI线程。一旦读取了传入的消息数据(例如,使用AContext.Connection.IOHandler.ReadLn
),如果要在UI组件中显示消息,则必须与主线程同步。您可以使用Indy的TIdSync
或TIdNotify
类进行同步,或者如果您的Delphi版本可用,则使用TThread.Synchronize()
或TThread.Notify()
的匿名过程重载。
例如:
uses
..., IdSync;
type
TMemoSync = class(TIdSync)
protected
FText: string;
procedure DoSynchronize; override;
end;
procedure TMemoSync.DoSynchronize;
begin
Form1.Memo1.Lines.Add(FText);
end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
Text: String;
begin
Text := AContext.Connection.IOHandler.ReadLn;
with TMemoSync.Create do
try
FText := Text;
Synchronize;
finally
Free;
end;
end;
或者:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
Text: String;
begin
Text := AContext.Connection.IOHandler.ReadLn;
TThread.Synchronize(nil,
procedure
Form1.Memo1.Lines.Add(Text);
end
);
end;