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;