小弟刚学Delphi不久,写了段程序,现贴如下:  m_iCheckedCount := 0;
  if G_iStepNumTemp > 0 then
  begin
    for i := 0 to G_iStepNumTemp-1 do
    begin
      NewItem := RzListView.Items.Add;
      NewItem.Caption := IntToStr(ArrPulse(pEventTemp)[i].iSerialNum);      if ArrPulse(pEventTemp)[i].bLevel then
        NewItem.SubItems.Add('高')
      else
        NewItem.SubItems.Add('低');      NewItem.SubItems.Add(IntToStr(ArrPulse(pEventTemp)[i].iKeepTime));      NewItem.Checked := ArrPulse(pEventTemp)[i].bChecked;
      if NewItem.Checked then
      begin
        NewItem.DropTarget := true;
        Inc(m_iCheckedCount);
      end;
    end;
    FreeMem(pEventTemp);     // 释放 pEventTemp
  end;现假设pEventTemp的数据中有一个结构体,并且该数据的bChecked为true,G_iStepNumTemp表示其中的结构体的个数,当执行完这段程序之后,为甚么m_iCheckedCount的值为2,当里面的结构体多于一个时,只有一个bChecked为true,运算出来的m_iCheckedCount的值确是1,我调试过,当循环体只执行一遍,从if对应的end跳到for对应的end时,m_iCheckedCount的值就由1变为2了,很不理解. 

解决方案 »

  1.   

    你可以把断点下到 Inc(m_iCheckedCount);这一行,看你运行时执行过几次就可以了。如果结果为2,肯定执行过两次,也就是说执行第二次时,你可以看看其它参数的状态。
      

  2.   

    断点放到这里看过了,就执行了一次,但是跳过if的那个end后就变为2了,很神奇,搞不懂!
      

  3.   

    刚刚发现m_iCheckedCount的值从0变为1时,是在这个改变的      NewItem.Checked := ArrPulse(pEventTemp)[i].bChecked;
          if NewItem.Checked then
          begin在执行NewItem.Checked := ArrPulse(pEventTemp)[i].bChecked;时m_iCheckedCount还为0
    当执行完 if NewItem.Checked then 后m_iCheckedCount就变为1了,
      

  4.   

    简化代码:
      m_iCheckedCount := 0;
      if G_iStepNumTemp > 0 then
      begin
        for i := 0 to G_iStepNumTemp-1 do
        begin
          if ArrPulse(pEventTemp)[i].bChecked then
            Inc(m_iCheckedCount);
        end;
      end;可以看出问题并不出在这里
    是不是m_iCheckedCount是全局变量,但m_iCheckedCount := 0;不是放在这里
    或者外面还有別的代码,还有其它赋值、循环...
      

  5.   

    应该是NewItem.Checked属性 写了赋值方法。 一般是 procedure SetFChecked(value : boolean);
    你全文找一下 m_iCheckedCount 哪些地方做过修改
      

  6.   

    我明白了,因为我写了NewItem.Checked的事件响应,我将NewItem.Checked设置为true时,也执行了那个事件响应函数,而改变m_iCheckedCount的值,导致后面Inc(m_iCheckedCount)的时候又自加了一下,所以就是2了,谢谢解答!