【问题标题】:write specific line in tmemo according to line number根据行号在 tmemo 中写入特定行
【发布时间】:2013-05-17 13:55:36
【问题描述】:

我正在使用以下内容将文本文件中的文本插入TMemo

procedure TForm1.Button1Click(Sender: TObject);
  var
  SL: TStringList;
begin
  SL := TStringList.Create;
  try
    SL.LoadFromFile('c:\testimeng\keyfil.txt');
    Memo1.Lines.Assign(SL);
  finally
    SL.Free;
  end;
end;

我想知道的是,当我选择特定的行号时,如何根据行号将单行添加到TMemo

示例输出:

在此期间,他在学校生活的学术、体育和文化领域表现出色。

在此期间,他在学校生活的学术和体育领域表现出色。

在此期间,他在学校生活的学术和文化领域表现出色。

在此期间,他在学校生活的学术方面表现出色。

在此期间,他在学校生活的体育和文化方面都表现出色。

任何帮助表示赞赏。

【问题讨论】:

  • 我正在开发一个包含 123 个预定义句子的推荐写作程序。所以我需要选择不同的句子来组成最终的证明。
  • 等等,我之前回答过一个几乎相同的问题...stackoverflow.com/questions/16003220/… 不一定是同一个问题,而是完全相同的答案。

标签: delphi delphi-7 delphi-2010


【解决方案1】:

当您从TStringList 指定哪个项目(索引或行号)时,我认为您是在询问将TStringList 中的单行放入TMemo 中。如果是这样的话,你可以使用这样的东西:

Memo1.Lines.Add(SL[Index]);

所以如果keyfile.txt 的第一行是

During this time he has distinguished himself in the academic, sporting and cultural spheres of school life.

你会使用

Memo1.Lines.Add(SL[0]);  // Desired line number - 1

好的,在您对您的问题发表评论后,我想我知道您想要做什么。这是一种方法:

在您的表单上添加TListBoxTButtonTMemo。我将我的ListBox 放在左侧,旁边的按钮(在右上角),然后是按钮右侧的备忘录。

FormCreate 事件中,使用您的文本文件填充TListBox 并清除现有的备忘录内容:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
  ListBox1.Items.LoadFromFile('c:\testimeng\keyfil.txt');
end;

双击按钮添加OnClick处理程序:

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  // If there's an item selected in the listbox...
  if ListBox1.ItemIndex <> -1 then
  begin
    // Get the selected item
    s := ListBox1.Items[ListBox1.ItemIndex];
    // See if it's already in the memo. If it's not, add it at the end.
    if Memo1.Lines.IndexOf(s) = -1 then
      Memo1.Lines.Add(s);
  end;
end;

现在运行应用程序。单击列表框中的项目,然后单击按钮。如果该项目尚未出现在备忘录中,它将作为新的最后一行添加。如果它已经存在,则不会添加(以防止重复)。

如果您想将它添加到当前最后一行的末尾(可能是扩展段落),那么您可以这样做:

// Add selected sentence to the end of the last line of the memo, 
// separating it with a space from the content that's there.
Memo1.Lines[Memo1.Lines.Count - 1] := Memo1.Lines[Memo1.Lines.Count - 1] + #32 + s;

所以,现在应该很清楚,要添加到特定行的末尾,您只需抓取已经存在的内容 在那里并添加到它。例如,如果用户将3 输入到TEdit

procedure TForm1.FormCreate(Sender: TObject);
begin
  SL := TStringList.Create;
  SL.LoadFromFile('c:\testimeng\keyfil.txt');
end;

procedure TForm1.ButtonAddTextClick(Sender: TObject);
var
  TheLine: Integer;
begin
  // SL is the TStringList from the FormCreate code above
  TheLine := StrToIntDef(Edit1.Text, -1);
  if (TheLine > -1) and (TheLine < Memo1.Lines.Count) then
    if TheLine < SL.Count then
      Memo1.Lines[TheLine] := Memo1.Lines[TheLine] + SL[TheLine];
end;

【讨论】:

  • 我在想的是有一个带有行号的按钮可供选择,或者有一个可以输入行号的位置,例如 1、2、23 或 123
  • @Pierre:好的。 :-) 不过,我仍然不确定您要求我们为您提供什么帮助。如您所见,大卫和我都从您的问题中得到了不同的含义。您能否edit 添加更多关于您具体要求我们帮助您做什么的详细信息?等待。我想我(从你的评论到你自己的问题)得到了你在问什么。给我几分钟...
  • Ken 我已经按照您的建议完成了代码。它有效,但我不想在列表框中选择句子组。我有一个问题,他们在哪里打勾(a b)或(c d),这将导致以下组合:ac = 1 ad = 2 a = 3 bc = 4 bd = 5 b = 6 c = 7 d = 8以及不同的部分 1 - 11。所以组合将是 - 3 Reliabiltity=a,Neatness=d 组合变为 3ad = 32。所以当您输入组合时,必须显示句子。到目前为止,感谢您的帮助
  • 这是你的另一个问题,它被关闭了,因为没有人能通过阅读它来理解你的要求。这也不是你在这里问的问题。我已经回答了这里问的那个。 :-) 如果您想问另一个,您需要对其进行编辑和改进,然后要求重新打开它。您无法通过尝试在此处的评论中解决相同的问题来绕过此处的指南。 (我不知道你所说的 ac=1 ad=2 a=3 是什么意思,无论是在这里还是在那个问题中,我怀疑也没有其他人这样做,这就是它被关闭的原因。它需要一张桌子或一张图片。)
  • (续)或其他方式来说明您想要做什么,因为文字描述不清楚。
【解决方案2】:

鼠标点击 TMemo 用字符串写入特定的行

Procedure TForm1.Button1Click(Sender: TObject);
Var SL: TStringList;
    LineNumber : Integer;
Begin
  LineNumber := Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0);
  Memo1.SelStart := Memo1.Perform(EM_LINEINDEX, LineNumber, 0);
  Memo1.SelLength := Length(Memo1.Lines[LineNumber]) ; 
  Memo1.SetFocus;

  SL := TStringList.Create;
  try
    SL.LoadFromFile('c:\testimeng\keyfil.txt');
    Memo1.SelText := SL.Strings[0];
  finally
    SL.Free;
  end;
End;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多