【问题标题】:Memo Line Breaks备忘录换行符
【发布时间】:2015-12-13 16:59:02
【问题描述】:

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

我想使用字符串#$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);

【问题讨论】:

    标签: delphi indy-9


    【解决方案1】:

    TIdMappedPortTCP 是一个多线程组件。 OnExecute 事件在工作线程的上下文中触发。你不能像你展示的那样直接访问你的TMemoTComboBox 控件。您必须与 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 的sLineBreak 常量(在Windows 上定义为#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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 2010-10-27
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      相关资源
      最近更新 更多