線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1269
推到 Plurk!
推到 Facebook!

关于使用checklistbox出现的问题

尚未結案
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-14 18:47:08 IP:218.19.xxx.xxx 未訂閱
请教各位前辈: 小弟现在使用checklistbox来显示oracle 9i中一些table的数据。 比如说其中一个例子: ...... self.SQLStoredProc9.ExecProc; hmax:=bcdtointeger(SQLStoredProc9.Params[0].AsFMTBCD); (hmax就是该table的记录数) setlength(htemp1,hmax 1); self.SQLQuery2.Open; sqlquery2.First; i:=1; while not sqlquery2.Eof do begin htemp1[i].empno:=sqlquery2.Fields[0].AsString; htemp1[i].lname:=sqlquery2.Fields[1].AsString; htemp1[i].gname:=sqlquery2.Fields[2].AsString; htemp1[i].cname:=sqlquery2.Fields[3].AsString; htemp1[i].sect:=sqlquery2.Fields[4].Asstring; htemp1[i].crp:=sqlquery2.Fields[5].AsString; sqlquery2.Next; i:=i 1; end; self.CheckListBox2.Items.Clear; self.CheckListBox2.Items.BeginUpdate; for i:=1 to hmax ------(1) begin self.CheckListBox2.Items.Append( format('%-7s|%-16s|%-25s|%-13s|%-10s|%-33s',[htemp1[i].empno,htemp1[i].lname,htemp1[i].gname,htemp1[i].cname,htemp1[i].sect,htemp1[i].crp]) ); ...... 通过这种方式显示数据,如果该table被清空,也就是hmax=0时,则会出现错误:‘List index out of bounds (0)’, 如果我把上面code中的(1)处改为for i:=0 to hmax,则checklistbox中就会在最开始增加一条无用的记录,而这条记录会影响到table的记录号,从而影响到对正常记录的修改,删除等。 尝试过当hmax=0时,不刷新checklistbox,反之刷新,但是仍然出现同样错误。 请那位前辈指点一下,谢谢!
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-14 21:22:26 IP:221.226.xxx.xxx 未訂閱
htemp1 的下届是从 0 开始的,所以你必须从0开始。    例如你的程序这样写:
for i:=0 to hmax-1 do
begin
self.CheckListBox2.Items.Append(
format('%-7s|%-16s|%-25s|%-13s|%-10s|%-33s',[htemp1[i].empno,htemp1[i].lname,htemp1[i].gname,htemp1[i].cname,htemp1[i].sect,htemp1[i].crp])
); 
......
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-14 23:18:15 IP:219.86.xxx.xxx 未訂閱
補充:
  hmax:=bcdtointeger(SQLStoredProc9.Params[0].AsFMTBCD);
  (hmax就是該table的記錄數)
  setlength(htemp1,hmax);
  self.SQLQuery2.Open;
  sqlquery2.First;
  i:=0;
  while not sqlquery2.Eof do
  begin
    htemp1[i].empno:=sqlquery2.Fields[0].AsString;
    htemp1[i].lname:=sqlquery2.Fields[1].AsString;
    htemp1[i].gname:=sqlquery2.Fields[2].AsString;
    htemp1[i].cname:=sqlquery2.Fields[3].AsString;
    htemp1[i].sect:=sqlquery2.Fields[4].Asstring;
    htemp1[i].crp:=sqlquery2.Fields[5].AsString;
    sqlquery2.Next;
    i:=i 1;
  end; 
  self.CheckListBox2.Items.Clear;
  self.CheckListBox2.Items.BeginUpdate;
  for i:=0 to hmax -1 do
    With htemp1[i] do
      self.CheckListBox2.Items.Append(
    format('%-7s|%-16s|%-25s|%-13s|%-10s|%-33s',[empno,lname,gname,cname,sect,crp])
...
如果再不改錯誤的話!邏輯錯誤被允許的情況下。 在 For 前加一條 if hMax>0 then .. ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-15 08:44:08 IP:221.226.xxx.xxx 未訂閱
呵呵,插花一句,wameng兄不要介意啊~    其实没有必要加上 if hMax>0 then 的,hMax不大于0的情况FOR循环根本不会运行,所 以没有必要去多一句判断的。 程序长了这些无意义的语句多了就变成运行和阅读 的负担了。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-15 11:42:51 IP:61.222.xxx.xxx 未訂閱
引言: 呵呵,插花一句,wameng兄不要介意啊~ 其實沒有必要加上 if hMax>0 then 的,hMax不大於0的情況FOR循環根本不會運行,所 以沒有必要去多一句判斷的。 程序長了這些無意義的語句多了就變成運行和閱讀 的負擔了。
嘿嘿!不懂我的意思。... 如果再不改錯誤的話!邏輯錯誤被允許的情況下。 ... ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-16 08:06:45 IP:221.226.xxx.xxx 未訂閱
呵呵,明白~
系統時間:2024-06-28 19:24:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!