这个while是Bug还是优化后的结果??

wqrz15 2005-08-02 12:48:54
调用的时候ShowGridMoney(2) 然后F7跟进 第一次while循环时TabType是2 以后几次TabType都是0了 是优化的结果??这也太离谱了吧_-##


procedure TFrmBorrowBill.ShowGridMoney(TabType:integer);
var
money:double;
begin
money:=0;
if HKMemTab1.IsEmpty=true then exit;

while not HKMemTab1.Eof do
begin
if TabType=1 then
begin
money:=money+HKMemTab1.FieldByName('SumMoney').Value;
end;
if TabType=2 then
begin
money:=money+HKMemTab1.FieldByName('Amerce_Money').Value;
end;
HKMemTab1.Next;
end;

edtMoney.Text:=floatToStr(money);
end;
...全文
196 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
LocustWei 2005-08-02
  • 打赏
  • 举报
回复
回复人: yayx(yayx) ( ) 信誉:99 2005-08-02 17:36:00 得分: 0


一般是其他某个地方赋值的时候溢出了

建议你把所有的变量一个一个屏蔽排除以下


zsjzwj 2005-08-02
  • 打赏
  • 举报
回复
在procedure TFrmBorrowBill.ShowGridMoney(TabType:integer);
中TabType只是用来进行比较,建议改为
procedure TFrmBorrowBill.ShowGridMoney(const TabType:integer);
亮剑_ 2005-08-02
  • 打赏
  • 举报
回复
优化也不可能把逻辑优化错了啊,要不你改成把 if 改成 case 看看还优化不
yayx 2005-08-02
  • 打赏
  • 举报
回复
一般是其他某个地方赋值的时候溢出了

建议你把所有的变量一个一个屏蔽排除以下
wqrz15 2005-08-02
  • 打赏
  • 举报
回复
Ctrl + F 选择 Find in Files在正个project里面查找这个TabType,看有没有其它地方定义
***********************************************
查了 别的地方没有赋值

procedure CreateMemTab(TabType:integer);
function InsertItem(TabType:integer):BOOL;

都做为函数的参数 生命周期应该只在函数里头吧 而且在这几个函数里 只是if判断 没有赋值操作
wqrz15 2005-08-02
  • 打赏
  • 举报
回复
while not HKMemTab1.Eof do
begin
if TabType=1 then
begin
money:=money+HKMemTab1.FieldByName('SumMoney').AsCurrency;
end
else if TabType=2 then
begin
money:=money+HKMemTab1.FieldByName('Amerce_Money').AsCurrency;
end;
HKMemTab1.Next;
end;


这样子我还不如这样子:
if TabType=1 then
begin
HKMemTab1.First;
while not HKMemTab1.Eof do
begin
money:=money+HKMemTab1.FieldByName('SumMoney').Value;
HKMemTab1.Next;
end;
end;
if TabType=2 then
begin
HKMemTab1.First;
while not HKMemTab1.Eof do
begin
money:=money+HKMemTab1.FieldByName('Amerce_Money').Value;
HKMemTab1.Next;
end;
end;



****************************
问这个问题就是不知道这是不是优化后的结果啊 以前看过for的优化结果是倒过来的


wlbfeihu 2005-08-02
  • 打赏
  • 举报
回复
应该好好考虑问题的所在,不要上来就bug要是这样的编译器谁还敢用啊
hqhhh 2005-08-02
  • 打赏
  • 举报
回复
用下面的试试:
procedure TFrmBorrowBill.ShowGridMoney(TabType:integer);
var
money:double;
begin
money:=0;
if HKMemTab1.IsEmpty=true then exit;

while not HKMemTab1.Eof do
begin
if TabType=1 then
begin
money:=money+HKMemTab1.FieldByName('SumMoney').AsCurrency;
end
else if TabType=2 then
begin
money:=money+HKMemTab1.FieldByName('Amerce_Money').AsCurrency;
end;
HKMemTab1.Next;
end;

edtMoney.Text:=floatToStr(money);
end;
Dlwxn 2005-08-02
  • 打赏
  • 举报
回复
只能说:怎么可能?
Ctrl + F 选择 Find in Files在正个project里面查找这个TabType,看有没有其它地方定义
bee2518 2005-08-02
  • 打赏
  • 举报
回复
肯定是别的地方赋值造成的
你查找一下整个文件,对那个参数赋值的的语句有哪些
或者你的参数是全局参数,跟别的文件一致,造成出错
wqrz15 2005-08-02
  • 打赏
  • 举报
回复
不可能的.除非过程外有一个变量也叫TabType, 而且在HKMemTab1.AfterScroll(或BeforeScroll)中有给TabType赋值,才会这样.
--------------------
绝对没有
wqrz15 2005-08-02
  • 打赏
  • 举报
回复
if TabType=2 then
begin
money:=money+HKMemTab1.FieldByName('Amerce_Money').Value;
end;

循环一次TabType就变0 了 if里都没运行到 结果能对嘛
就奇怪了 怎么会这样_-##
亮剑_ 2005-08-02
  • 打赏
  • 举报
回复
不可能吧,TabType是形参,作用域就在ShowGridMoney方法内。
算下来结果对不对
stonegem 2005-08-02
  • 打赏
  • 举报
回复
不可能的.除非过程外有一个变量也叫TabType, 而且在HKMemTab1.AfterScroll(或BeforeScroll)中有给TabType赋值,才会这样.
wqrz15 2005-08-02
  • 打赏
  • 举报
回复
不管是什么 顶先

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧