在 delphi 中从 TMemo 中搜索和删除
Search and delete from TMemo in delphi
我有一个代码,可以从备忘录行中搜索和删除。但是有一个小问题,例如,备忘录行包含 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;
只检查字符串
如果只想单独查找字符串,则需要查看字符串前后是否没有数字:
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
周围找到空格、制表符等,只有当您发现该数字是单个 "word" 时才删除字符串.
每行一个数字?
现在,如果您的 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
。函数调用需要时间。
循环删除
如果你想从项目的索引列表中删除,比如 TMemo
的 Lines
属性,那么,为了不跳过任何行,总是向后循环,就像我上面做的那样。因为如果你删除行 i
, i
之后的所有行都会 向下移动一个索引, 所以当你去第 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.
通过删除更改备忘录中的行时,您不能从 0 循环到计数 - 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;
我有一个代码,可以从备忘录行中搜索和删除。但是有一个小问题,例如,备忘录行包含 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;
只检查字符串
如果只想单独查找字符串,则需要查看字符串前后是否没有数字:
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
周围找到空格、制表符等,只有当您发现该数字是单个 "word" 时才删除字符串.
每行一个数字?
现在,如果您的 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
。函数调用需要时间。
循环删除
如果你想从项目的索引列表中删除,比如 TMemo
的 Lines
属性,那么,为了不跳过任何行,总是向后循环,就像我上面做的那样。因为如果你删除行 i
, i
之后的所有行都会 向下移动一个索引, 所以当你去第 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.
通过删除更改备忘录中的行时,您不能从 0 循环到计数 - 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;