0

TIdMappedPortTCPIndy 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そうは言っても、メモのテキストをまったく入れるべきではありません。メモの各行は、すでに改行で区切られています。プロパティを読み取ると、各行が RTL の定数 ( Windowsで定義されている)Memo.Textの値で区切られた文字列が返されます。したがって、テキストを省略し、代わりに自然な改行を入力して、残りは RTL に処理させてください。sLineBreak#13#10%0D%0A

絶対%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 に答える