0

TIdMappedPortTCP我正在构建一个工具,它使用Indy 9发送除了我的浏览器请求之外的请求。

我想#$d#$A通过在备忘录中写入字符串(换行符)来使用它,%0D%0A 但它不能正常工作,正如您在图像中看到的那样。

我应该使用什么正确的代码来完成这项工作?

procedure TForm1.IdMappedPortTCP1Execute(AThread: TIdMappedPortThread);
var
  memo:string;
begin
  memo:= Memo1.text;
  if Combobox4.text='Back' then begin
    AThread.NetData := AThread.NetData +memo  ;
    form2.Memo1.Lines.Add(AThread.NetData);

IdMappedPortTCP 请求和日志

4

1 回答 1

2

TIdMappedPortTCP是一个多线程组件。该OnExecute事件在工作线程的上下文中触发。你不能像你展示的那样直接访问你的TMemo和控件。TComboBox您必须与 UI 线程同步才能安全正确地访问它们。

尝试更多类似的东西:

uses
  ..., IdSync;

type
  TGetForm1BackMemoTextSync = class(TIdSync)
  protected
    FText: string;
    procedure DoSynchronize; override;
  public
    class function GetText: string;
  end;

  TAddToForm2MemoSync = class(TIdSync)
  protected
    FText: string;
    procedure DoSynchronize; override;
  public
    class procedure AddToMemo(const S: string);
  end;

procedure TGetForm1BackMemoTextSync.DoSynchronize;
begin
  if Form1.ComboBox4.Text = 'Back' then
    FText := Form1.Memo1.Text;
end;

class function TGetForm1BackMemoTextSync.GetText: string;
begin
  with Create do
  try
    Synchronize;
    Result := FText;
  finally
    Free;
  end;
end;

procedure TAddToForm2MemoSync.DoSynchronize;
begin
  Form2.Memo1.Lines.Add(FText);
end;

class procedure TAddToForm2MemoSync.AddToMemo(const S: string);
begin
  with Create do
  try  
    FText := S;
    Synchronize;
  finally
    Free;
  end;
end;

//...

procedure TForm1.IdMappedPortTCP1Execute(AThread: TIdMappedPortThread);
var
  memo: string;
begin
  memo := TGetMemoBackTextSync.GetText;
  if memo <> '' then begin
    AThread.NetData := AThread.NetData + memo;
    TAddToForm2MemoSync.AddToMemo(AThread.NetData);
  //...
end;

话虽如此,您根本不应该%0D%0A输入备忘录文本。备忘录中的每一行都已由换行符分隔。读取该Memo.Text属性会返回一个字符串,其中每行由 RTL 常量的值(在 Windows 上sLineBreak定义)分隔。#13#10因此,只需从您的文本中省略%0D%0A并输入自然换行符,然后让 RTL 为您处理其余部分。

如果您绝对必须保留%0D%0A在文本中,则必须去掉本地换行符,然后%0D%0A手动转换为本地换行符,例如:

procedure TGetForm1BackMemoTextSync.DoSynchronize;
begin
  if Form1.ComboBox4.Text = 'Back' then
  begin
    FText := StringReplace(Form1.Memo1.Text, sLineBreak, '', [rfReplaceAll]);
    FText := StringReplace(FText, '%0D%0A', #13#10, [rfReplaceAll]);
  end;
end;
于 2015-12-13T20:31:11.917 回答