【问题标题】:Multiple Line Addition in TMEMOTMEMO 中的多行添加
【发布时间】:2013-04-14 19:14:46
【问题描述】:

我有一个带有 2 个按钮(Button1、Button2)和 1 个备忘录(Memo1)的 Delphi XE2 项目。

我的要求是在 Button1 上单击 Some Text 将在第一行 (Line1) 中写入 Memo1。如果我再次单击 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”。请帮帮我。

【问题讨论】:

    标签: delphi


    【解决方案1】:

    要向备忘录控件添加更多文本,请调用 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);
    

    【讨论】:

    • 您的Clear 不太正确。 TMemo 有一个 Clear 属性;您不必使用Lines.ClearMemo1.Clear; 工作得很好,而且打字更少。
    • @Ken 实际上我从来不知道,6 个额外的字符并没有太大的伤害,但做同样的事情。
    • 我没有对你投反对票。 :-) 我只是指出它在那里,并且在技术上是清除TMemo 控件内容的正确方法。键入 6 个额外字符并不多,实际上比使用 Code Insight 少,但是当有内置功能时,您可以节省 6 次击键, 它使您的代码更具可读性,我通常喜欢使用它。这就像使用TStringList - 当我有一个名为SL 时,我总是写SL[i] 来循环访问事物而不是SL.Strings[i],即使它们在功能上是等效的。
    • '这是默认数组属性的目的:D
    • 这取决于我要说的控件的Delphi implementation
    【解决方案2】:

    TMemo.LinesTStrings 类型的对象,具有许多字符串处理能力。分配 Text 属性会重写它包含的所有字符串。

    您可以在所有其他已经存在的行之后添加一行:

    Memo.Lines.Add('Text');
    

    您可以插入一行(在第四个位置):

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

    你可以添加多行:

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

    【讨论】:

    • 添加包含换行符的字符串时会发生什么? Lines.Count 是否增加超过一?换句话说,它的行为与 TStringList 不同?
    • 我觉得sLineBreak使用起来更方便
    • @David 是的。当 Memo.WordWrap 为 True 且文本被多行换行时,Memo.Lines.Count 增加 2 或更多。
    • 我个人讨厌自动换行的工作方式,行数会失真,然后当我关闭自动换行时,当已经有换行时,它会将它们视为自己的行。很烦人。
    • @David 确实如此。它会写下您发送的内容。现在,它是如何回读的?
    【解决方案3】:

    在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;

    or memo1->lines->add(tstringlist->text); //在最后一行停止的memo1之后插入

    或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(""); //对于每个新的空行

    祝你好运

    【讨论】:

    • C++ 与此有什么关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多