こんにちは 再度質問です。
リストビュー(カラム数9)のソート処理を行っています。
カラムクリックを実行して1回目は、昇順も降順も成功するのですが、
2回目以降は、ばらばらな順番で表示されます。
void CmyView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
CListCtrl &Ctrl = GetListCtrl();
Ctrl.SortItems(MyCompProc, pNMListView->iSubItem);
this->mSort_Status[pNMListView->iSubItem]
= !this->mSort_Status[pNMListView->iSubItem];
*pResult = 0;
}
int CALLBACK MyCompProc( LPARAM lp1 ,LPARAM lp2, LPARAM lp3 )
{
CFrameWnd* pFW = (CFrameWnd*)AfxGetMainWnd();
CProjectAView* pView = (CProjectAView*)pFW->GetActiveView();
CListCtrl &Ctrl = pView->GetListCtrl();
CString str1 = Ctrl.GetItemText(lp1, lp3);
CString str2 = Ctrl.GetItemText(lp2, lp3);
int iReturn;
// 昇順
if(pView->mSort_Status[lp3] == UP){
if (lp3 == 2 || lp3 == 3 || lp3 == 8){
iReturn = strcmp( str1, str2 );
} else {
if (atof(str1) == atof(str2))
iReturn = 0;
if (atof(str1) < atof(str2))
iReturn = -1;
if (atof(str1) > atof(str2))
iReturn = 1;
}
// 降順
} else {
if (lp3 == 2 || lp3 == 3 || lp3 == 8){
iReturn = strcmp( str2, str1 );
} else {
if (atof(str2) == atof(str1))
iReturn = 0;
if (atof(str2) < atof(str1))
iReturn = -1;
if (atof(str2) > atof(str1))
iReturn = 1;
}
}
return iReturn;
}
慌てて、発言したので、投げやりな内容で申し訳ありませんでした。
2回目以降もソートされるように解決できました。
カラムクリック時に、LV_ITEM構造体のlParamメンバに値を再設定するようにしたら、
できました。
お騒がせしました。
アイテムのLPARAMには、何を設定していますか?
予想するとアイテム追加時のインデックスを入れてると思われます。
ソートしたあとは、インデックスが変わるのでLPARAMを設定しなおさないと正しいインデック
スでソートされなくなります。
(例)
[文字] [インデックス] [LPARAM]
・初期状態
B 0 0
C 1 1
A 2 2
・一回目の昇順ソート
A 0 2
B 1 0
C 2 1
・二回目の昇順ソート
B 0 0
A 1 2
C 2 1
しまった、遅かった(^^;
LPARAMには、インデックスよりも
比較すべきデータが取得できるポインタなどを設定しておくと
再設定をしなくてもすみます。