回 帖 发 新 帖 刷新版面

主题:当读取到一个字符时,则将这一行所有程序全删除

请问一个问题,DELPHI语言的程序,实现的功能是:当读取到一个字符时,则将这一行所有程序全删除。例
 将:
 GOTO  /  -50.00000,  -10.00000
 why/    0.00100
 GOTO  /  -20.00000,  -10.00000
 where/    0.00000
 转换成:
  GOTO  /  -50.00000,  -10.00000
  GOTO  /  -20.00000,  -10.00000
  (当读到why时将所在行全删除,当读到where时将所在行全删除)

回复列表 (共19个回复)

11 楼

9楼的代码还是忽视了你的一个条件:忽略大小写。改为这样:

if (UpperCase(Copy(Memo1.Lines[I], 1, Length(Target1))) = UpperCase(Target1))
      or (UpperCase(Copy(Memo1.Lines[I], 1, Length(Target2))) = UpperCase(Target2)) then

12 楼

请问一下,为什么你的程序循环用的for I := SS.Count-1 downto 0 do

当我改成for I := 0 to SS.Count-1  do 运行时就会说出错,我一直没有找出原因,帮忙指定一下

13 楼

[quote]请问一下,为什么你的程序循环用的for I := SS.Count-1 downto 0 do

当我改成for I := 0 to SS.Count-1  do 运行时就会说出错,我一直没有找出原因,帮忙指定一下[/quote]
这个这个这个....你让我怎么表达啊....

你是在找出错的原因?你改了,就是出错的原因啊!
for循环,循环变量赋值,实际上是给eax寄存器传入一个值,然后循环,直到eax寄存器的值小于循环变量的最终目标值。也就是说 for I := X to Y 这里面Y值在编译后是固定的了
当在循环体内,SS.Count发生变化时,如果改为你那样循环,就会发生下标越界。

我感觉实在不好表达。因为这是编程的常识,早已忘记了教科书上是如何说的了

14 楼

To hahaixix23
如果功能要求“不区分大小写”,则以上程序应做出如下修改。言下之意他(长尾兔)提供给你的程序是严格区分大小写的,你可以测试看看。
...
  if (Copy(Memo1.Lines[I], 1, Length(Target1)) = Target1)
      or (Copy(Memo1.Lines[I], 1, Length(Target2)) = Target2) ...
修改为 
...  if (UpperCase(Copy(Memo1.Lines[I], 1, Length(Target1))) = UpperCase(Target1))
      or (UpperCase(Copy(Memo1.Lines[I], 1, Length(Target2))) = UpperCase(Target2)) ...
解释:UpperCase(Const s: string),转换成大写的字符串。这里也可以用LowerCase代替

15 楼

谢谢各位大哥热心帮助,小弟一定更加努力!

16 楼

有点明白了
[em2]

17 楼

如果功能要求[b]不区分大小写[/b],那么程序中的这一处是不是因该做出修改。
...
if (Copy(Memo1.Lines[I], 1, Length(Target1)) = Target1)
      or (Copy(Memo1.Lines[I], 1, Length(Target2)) = Target2) then
...
改为
...
  if (UpperCase(Copy(Memo1.Lines[I], 1, Length(Target1))) = UpperCase(Target1))
      or (UpperCase(Copy(Memo1.Lines[I], 1, Length(Target2))) = UpperCase(Target2))
...
此处的UpperCase 也可以用 LowerCase代替

18 楼

To hahaixix23:
你的功能中提到[color=FF0000]不区分大小写[/color],不知道你是否测试过他(“长尾兔
”)的那段代码,其实测试的结果就是该代码[b]严格区分大小写[/b]。为此,我修改了该处,你不妨看看。
原代码:
...
 if (Copy(Memo1.Lines[I], 1, Length(Target1)) = Target1)
      or (Copy(Memo1.Lines[I], 1, Length(Target2)) = Target2) then
...
修改后:
...
if (UpperCase(Copy(Memo1.Lines[I], 1, Length(Target1))) = UpperCase(Target1))
      or (UpperCase(Copy(Memo1.Lines[I], 1, Length(Target2))) = UpperCase(Target2)) then
...
这里的UpperCase 可用LowerCase代替。

19 楼

13楼的说法我赞成。
我也试过(改为for I := 0 to SS.Count-1  do )但结果是程序把本应该删除的行给漏删了,比如如下的文本:
原文本:
  start [1]
  why [2]
  where [3]
  end [4]
执行程序(按你的要求先把文本导入 TMemo中,筛选,再保存至文本)结果如下:
  start [1]
  where [3]
  end [4]
为什么这一行(where [3])仍然存在,看来问题出在程序的这一段--“for I := 0 to SS.Count-1  do”
在For循环中,循环变量I 由编译器自动控制(增或减1),当程序删除完第2行(why [2]),第二行空缺,TMemo自动调整后面行的位置,第三行(where [3])、第四行(end [4])依次前移一行,此时I 值自动增1 ,变为2,接下来访问 SS[2](等于end [4]),这样看来,“Where [3]”确实给漏掉了。
如果代码改为“for I := SS.Count-1 downto 0  do”就可以避免这种情况

(抱歉!因未看到第二页,同一个问题我回复了三次。如果版主看到,建议删除重复内容,仅保留最后一次的回复)

我来回复

您尚未登录,请登录后再回复。点此登录或注册