TMEMO中的多行添加

5

我有一个Delphi XE2项目,里面有两个按钮(Button1,Button2)和一个Memo(Memo1)。

我的要求是,在单击Button1时,某些文本将被写入到Memo1的第一行(Line1)。如果再次单击Button1,则会在新行(Line2)中写入一些新文本。

如果单击Button2,则另一个新文本将添加到Memo1中(最后一行之后会创建一个新行)。因此,我编写了以下代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Text :='Line1';
  Memo1.Lines.Text :='Line2';
end;
....
....
....
....
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Lines.Text :='Line3';
  Memo1.Lines.Text :='Line4';
end;

但问题在于只有一行文本出现,“Button1FirstClick” 上显示为“Line1”,“Button1SecondClick” 上显示为“Line2”,而 “Button2Click” 上显示为“Line4”。请帮忙解决。
3个回答

12

要向备忘录控件添加更多文本,请调用AppendAdd,例如:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Add('Line1');
  Memo1.Lines.Add('Line2');
end;
....
....
....
....
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Lines.Add('Line3');
  Memo1.Lines.Add('Line4');
end;

如果您需要清除内容,请执行以下操作:

Memo1.Lines.Clear;

如果您希望替换一行(前提是该索引已经存在):

Memo1.Lines[2]:= 'Replacement Text';

删除其中一行...

Memo1.Lines.Delete(2);

2
你的 Clear 不太正确。TMemo 有一个 Clear 属性;你不必使用 Lines.ClearMemo1.Clear; 很好用,也更省事。 - Ken White
1
我没有因为这个给你点踩。 :-) 我只是指出它存在,并且在技术上清除 TMemo 控件内容的正确方法。打 6 个额外字符并不多,而且使用 Code Insight 实际上更少,但是当有内置功能可以做到这一点时,并且您可以节省 6 个按键,并且它使您的代码更易读,我通常会使用它。这就像使用 TStringList - 当我有一个名为 SL 的列表时,我总是写 SL[i] 来访问循环中的东西,而不是 SL.Strings[i],即使它们在功能上是等效的。 - Ken White
这是默认数组属性的目的 :D - Jerry Dodge
没错。为了减少打字并使代码更清晰,就像 TMemo.Clear 的设计一样。 :-) - Ken White
1
我想这取决于控件的Delphi实现 - TLama
显示剩余4条评论

7

TMemo.Lines 是一个 TStrings 类型的对象,具有许多字符串处理功能。将 Text 属性赋值会重写它包含的所有字符串。

您可以使用以下语句在已有的所有行后添加一行:

Memo.Lines.Add('Text');

您可以通过以下方式在第四个位置插入一行:

Memo.Lines.Insert(3, 'Text');

您可以添加多行:

Memo.Lines.Add('Line1'#13#10'Line2');
Memo.Lines.AddStrings(ListBox.Lines);

2
当您添加包含换行符的字符串时会发生什么?Lines.Count是否增加超过一个?换句话说,它与TStringList的行为不同吗? - David Heffernan
1
@David 是的。Memo.Lines.Count会增加2,或者当Memo.WordWrap为True且文本被换行到多行时会增加更多。 - NGLN
@David 我同意。但这就是 TMemoStrings 的工作方式。我认为要让它表现得不同可能会很困难,因为当信息存储到 Windows 控件中时,添加的内容会丢失。 - NGLN
@NGLN的TMemoStrings应该将文本附加到EDIT控件中。它不应修改您发送的文本。 - David Heffernan
2
@David 是的。它会写下你发送的内容。那么,它如何读回来呢? - NGLN
显示剩余7条评论

1

在Delphi中有Memo1.Lines.Text

但在C++ Builder中有Memo1.Text或Memo1->Text

要让多行进入TMemo,可以将其分配为memo1->text = tstringlist->text;

作为tstringlist,您可以使用tsringlist->CommaText="line1,line2,line3,line4"; // ,作为新行

然后memo1->text = tstringlist->text;

或memo1->lines->add(tstringlist->text); //插入到上一行之后

或memo1->lines->add("Line 1, \x0d\x0a line 2, \x0d\x0a line 3");

或memo1->lines->add("Line 1, \r\n aline 2, \r\n aline 3");

否则使用memo1->lines->add(""); //每个新空行

祝你好运


2
C++ 和这有什么关系? - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接