主题:当读取到一个字符时,则将这一行所有程序全删除
hahaixix23
[专家分:0] 发布于 2007-10-15 17:10:00
请问一个问题,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 楼
长尾兔 [专家分:3630] 发布于 2007-10-17 16:51:00
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 楼
hahaixix23 [专家分:0] 发布于 2007-10-30 11:08:00
请问一下,为什么你的程序循环用的for I := SS.Count-1 downto 0 do
当我改成for I := 0 to SS.Count-1 do 运行时就会说出错,我一直没有找出原因,帮忙指定一下
13 楼
长尾兔 [专家分:3630] 发布于 2007-10-31 14:59:00
[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 楼
Hongyi1234 [专家分:60] 发布于 2007-10-31 18:05:00
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 楼
hahaixix23 [专家分:0] 发布于 2007-11-01 09:01:00
谢谢各位大哥热心帮助,小弟一定更加努力!
16 楼
hahaixix23 [专家分:0] 发布于 2007-11-01 09:03:00
有点明白了
[em2]
17 楼
Hongyi1234 [专家分:60] 发布于 2007-11-01 12:45:00
如果功能要求[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 楼
Hongyi1234 [专家分:60] 发布于 2007-11-01 13:02:00
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 楼
Hongyi1234 [专家分:60] 发布于 2007-11-01 13:49:00
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”就可以避免这种情况
(抱歉!因未看到第二页,同一个问题我回复了三次。如果版主看到,建议删除重复内容,仅保留最后一次的回复)
我来回复