全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1395
推到 Plurk!
推到 Facebook!

請教有關 "陣列索引超出界限" 該如何處理

答題得分者是:wscken
yish35
一般會員


發表:5
回覆:29
積分:6
註冊:2007-01-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-07-29 17:04:12 IP:220.130.xxx.xxx 訂閱
請教各位大大:
以下程式,會在
if Contacts.items[k].hobby ='FromAD' then
或是
Contacts.items.remove(k)
發生錯誤,錯誤,並不是多筆刪除才會,而是刪到700多以下就會開始發生,請教各位,是否有什麼辦法可以解決
錯誤訊息為 "陣列索引超出界限"

[code delphi]
USES COMOBJ;
Var
K:INTEGER;
BEGIN
OutlookApp := CreateOleObject('Outlook.Application');
MAPI:= OutlookApp.GetNamespace('MAPI');
Contacts:= Mapi.Folders('NEW CO').Folders('連絡人');
//=====================================================
edit1.text:='資料刪除中';
//==================把我們建的資料刪除==================
if contacts.items.count=0 then //判斷是否為第一筆
begin
edit1.text:='空白資料庫';
end else
begin

for k := 1 to contacts.items.count do
begin
//=======================================================
if Contacts.items[k].hobby ='FromAD' then //
begin //
//把資料刪掉 //
Contacts.items.remove(k) //
end; //裏面的IF //
//======================================================
end; //for //

end; //外面的if
edit1.text:='資料刪除完畢';

[/code]
------
環境 DELPHI 7
Delphi 新手,請多指教
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-07-29 17:34:19 IP:203.66.xxx.xxx 訂閱
是不是因為那個索引已經不存在的關係

改成

for k :=contacts.items.count downto 1 do

從後面判斷回來的方式來試試看。

編輯記錄
wscken 重新編輯於 2009-07-29 17:35:23, 註解 無‧
wscken 重新編輯於 2009-07-29 17:36:16, 註解 無‧
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-07-29 17:37:35 IP:203.79.xxx.xxx 訂閱
因為你刪掉item 後,item 的 count 已經減少了。但for 迴圈還是用原來的數字在跑迴圈,到最後一定會超過陣列的索引值的。
試著改用 while 迴圈來看看
[code cpp]
k:=1;
while k <= to contacts.items.count do
begin
if Contacts.items[k].hobby ='FromAD' then
Contacts.items.remove(k)
else
k:=k 1;
end;
[/code]
我沒實際測試過,大致上是這樣,你自己再試看看


===================引 用 yish35 文 章===================
請教各位大大:
以下程式,會在
if Contacts.items[k].hobby ='FromAD' then
或是
Contacts.items.remove(k)
發生錯誤,錯誤,並不是多筆刪除才會,而是刪到700多以下就會開始發生,請教各位,是否有什麼辦法可以解決
錯誤訊息為 "陣列索引超出界限"

[code delphi]
USES COMOBJ;
Var
K:INTEGER;
BEGIN
OutlookApp := CreateOleObject('Outlook.Application');
MAPI:= OutlookApp.GetNamespace('MAPI');
Contacts:= Mapi.Folders('NEW CO').Folders('連絡人');
//=====================================================
edit1.text:='資料刪除中';
//==================把我們建的資料刪除==================
if contacts.items.count=0 then //判斷是否為第一筆
begin
edit1.text:='空白資料庫';
end else
begin

for k := 1 to contacts.items.count do
begin
//=======================================================
if Contacts.items[k].hobby ='FromAD' then //
begin //
//把資料刪掉 //
Contacts.items.remove(k) //
end; //裏面的IF //
//======================================================
end; //for //

end; //外面的if
edit1.text:='資料刪除完畢';

[/code]
yish35
一般會員


發表:5
回覆:29
積分:6
註冊:2007-01-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-07-30 10:41:16 IP:220.130.xxx.xxx 訂閱
兩位的方式都可以,不過為什麼for迴圈倒者作就可以
真想不透
------
環境 DELPHI 7
Delphi 新手,請多指教
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-07-30 11:11:14 IP:123.194.xxx.xxx 訂閱
因為從前面往後面做,若中間有被刪除,後面的item index值就會被改變。

但由後面往前面做,即使中間有被刪除,前面item 的index 也不會變動。

這真的是一種好方法,長知識....長知識....





===================引 用 yish35 文 章===================
兩位的方式都可以,不過為什麼for迴圈倒者作就可以
真想不透
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-07-30 11:12:04 IP:59.114.xxx.xxx 未訂閱
原因可能就如carstyc大大所說的一樣
"刪掉item 後,item 的 count 已經減少了..."
所以跑迴圈的時候就會有這樣的錯誤了
但假如倒回來跑就不會出現這樣的錯誤了吧~
yish35
一般會員


發表:5
回覆:29
積分:6
註冊:2007-01-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-08-06 11:49:50 IP:220.130.xxx.xxx 訂閱
 感謝兩位的協助
------
環境 DELPHI 7
Delphi 新手,請多指教
系統時間:2024-05-17 4:53:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!