备忘录换行符
Memo Line Breaks
我正在构建一个工具,它使用来自 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);
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
属性 returns 一个字符串,其中每行由 RTL 的 sLineBreak
常量的值分隔(在 [=31 上定义为 #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;
我正在构建一个工具,它使用来自 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);
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
属性 returns 一个字符串,其中每行由 RTL 的 sLineBreak
常量的值分隔(在 [=31 上定义为 #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;