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

交換 ListItem 後 ItemIndex 異常

尚未結案
dadai
一般會員


發表:29
回覆:31
積分:12
註冊:2009-01-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-01-27 17:36:18 IP:124.9.xxx.xxx 未訂閱
小弟目前嘗試在 TListView 上做上下兩筆資料的交換移動
但是沒找到有關swap相關的function
所以用了很蠢的方式來實現:

1. 資料存在一個 List
2. 交換 List 的上下兩筆資料
3. 將 ListView 清掉重新顯示一次
4. 指定 ListView 的 ItemIndex 到新的位置

但是現在卻發生了一些詭異的問題
我一個一個列出來
a. 將某個 ListItem 往下移動的時候,雖然 ListView 上的排列顯示是正確的,但是 ItemIndex 卻會跳到第一筆資料
b. 將某個 ListItem 往上移動的時候,ListView 上的排列是正確的,ItemIndex 的位址也是正確的。但是這時候如果我按上或是下, ItemIndex 會跳到第一筆資料

以下是我程式的寫法

[code cpp]
int tmpIndex = listView->ItemIndex;
ItemSwap( tmpIndex, tmpIndex 1); // 往下移動
listView->Items->BeginUpdate();
listView->Items->Clear();
for(int i=0; i<顯示的數量; i)
{
TListItem* tmpItem = listView->Items->Add();
tmpItem->Caption = IntToStr( i );
}
listView->Items->EndUpdate();
listView->ItemIndex = tmpIndex 1;
[/code]

請問我這樣寫法哪邊有問題嗎?
我該怎麼做才可以正確的移到預期的 ListItem ?


編輯記錄
dadai 重新編輯於 2011-01-27 02:39:13, 註解 無‧
dadai
一般會員


發表:29
回覆:31
積分:12
註冊:2009-01-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-01-28 08:21:35 IP:124.9.xxx.xxx 未訂閱
自問自答
雖然根本沒有解決問題

當把整個 ListView clear 之後
原本紀錄的一些狀態也都會跟著被清掉
只是目前還無法得知為什麼清掉之後再 assgin ItemIndex 不會成功

目前暫時解決的方式
將兩筆 ListItem 的 Caption 和 SubItems 交換
這樣子就不會有 ItemIndex 異常的情況了

無法得知 ListView->Items->Clear() 內部有做了哪些事情 Orz....
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-01-31 16:07:36 IP:61.219.xxx.xxx 訂閱
從你的程式碼來看tmpindex除了第一行取值應該不會變才對
你有試著下中斷點看tmpindex嗎

我的寫法
[code cpp]
void TForm1::swap(int i1,int i2)
{
TListItem *selitem = ListView1->Selected;
TListItem *tmpitem = ListView1->Items->Item[i2];
TListItem *newitem = ListView1->Items->Insert(i1);
newitem->Assign(tmpitem);
if (tmpitem==selitem) { //因為tmp下面被del掉,補selected和focused
newitem->Selected = true;
newitem->Focused = true;
}
tmpitem->Delete();
}

[/code]
系統時間:2017-10-20 13:26:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!