在delphi中搜索和删除TMemo

问题描述 投票:-3回答:2

我有一个代码,可以从备忘录行中搜索和删除。但是有一个小问题,例如,备注行包含1,11,12,13,21,22等。当e = 1时,它会删除包含1的所有行。我只需要删除定义的搜索(e = 1) )

  for i := 0 to memo3.lines.count-1 do
  begin
    if (pos(IntToStr(e), Memo3.Lines[i]) > 0) then begin
      Memo3.Lines.Delete(i);  
      Memo3.Lines.Delimiter := '-';
      Memo3.Lines.StrictDelimiter := True;
      t:= Memo3.Lines.DelimitedText;
      Label5.Caption:=t;
    end;

enter image description here

delphi delphi-2010
2个回答
2
投票

Checking only for the string

如果你只想隔离地找到字符串,那么你必须查看字符串之前和之后是否没有数字:

NumStr := IntToStr(e);
Str := Memo3.Lines[i];
NumPos := Pos(NumStr, Str);
if NumPos > 0 then
begin
  if (NumPos > 1) and IsDigit(Str[NumPos - 1])) or
     (NumPos < Length(Str)) and IsDigit(Str[NumPos + 1])) then
    Continue; // i.e. skip deleting etc.

或者,您尝试在找到的NumStr周围找到空格,制表符等,只有在您发现该数字是该字符串中的单个“单词”时才会删除。

One number per line?

现在如果你的TMemo每行只包含一个单独的数字,那么事情就容易多了,你根本不需要Pos()

NumStr := IntToStr(e);
for i := Memo3.Lines.Count - 1 downto 0 do
begin
  if NumStr = Memo3.Lines[i] then
  begin
    Memo3.Lines.Delete(i);
    ...
  end;
end;

请注意,我没有为循环的每次迭代重复调用IntToStr()。我刚做了一次并将调用结果分配给NumStr。函数调用需要时间。

Deleting in a loop

如果你想从一个索引的项目列表中删除,比如LinesTMemo属性,那么,为了不跳过任何行,总是向后循环,就像我上面那样。因为如果删除行ii之后的所有行都会向下移动一个索引,所以当你去i+1行时,这将是下一行的第二行,而不是下一行(因为删除后得到索引i)。

但是当你向后循环时,前一行将是i-1,并且该索引没有改变。

简单的例子:

原始情况:

index: text
0:     A
1:     B
2:     C  <-- delete!
3:     D
4:     E

删除后:

0:     A
1:     B
2:     D <-- now at index 2, was at index 3
3:     E <-- now at index 3, was at index 4

如果在索引2处删除C,则D和E向下一个索引,现在D在索引2.但是向上循环将i递增到3,所以现在检查第3行,并且从不检查D。但是,如果你向下,那么i变为1,这并没有改变索引,仍然包含B.


1
投票

通过删除更改备忘录中的行时,无法从0循环到count - 1,因为每次删除行时索引都会更改

此循环将删除包含e中的值的所有行

for i := Memo3.Lines.Count - 1 downto 0 do
begin
  if pos(e, Memo3.Lines[i]) > 0 then
  begin
    Memo3.Lines.Delete(i);
  end;
end;

但是我不知道你的样本中的其他代码行应该做什么,也许你可以详细说明你想要实现的目标。

编辑 如果您只想删除与e中的值匹配的行,请使用此循环

Value := IntToStr(e);
for i := Memo1.Lines.Count - 1 downto 0 do
begin
  if Value = Trim(Memo1.Lines[i]) then
  begin
    Memo1.Lines.Delete(i);
  end;
end;
© www.soinside.com 2019 - 2024. All rights reserved.