|
You could sort your list at the init state
and save the order in your own variable,
then - change it, at the next sorting...
virtual void BeHappy() = 0;
|
|
|
|
|
there is no lparam in my notify method
***************
HD_NOTIFY *phdntfy = (HD_NOTIFY *) lparam; /this code is there in some other dialog's notify method where they get lParam
|
|
|
|
|
Could you post the whole function (that has your switch), please ?
virtual void BeHappy() = 0;
|
|
|
|
|
case LVN_COLUMNCLICK:
{
LPARAM lParam=(LPARAM)pnmh;
LPNMLISTVIEW pLVInfo = (LPNMLISTVIEW)pnmh->code;
HD_NOTIFY *phdntfy = (HD_NOTIFY *) pnmh->code;
if (phdntfy->hdr.code == HDN_ITEMCLICK) //&& (phdntfy->iItem < 5))
{
if (phdntfy->iItem == Sort1) // if same sort, reverse order
{
SortOrder[phdntfy->iItem] *= -1;
}
else // else, perform secondary sort
{
Sort2 = Sort1; // primary sort becomes secondary sort
Sort1 = phdntfy->iItem; // new primary second sort
}
ListView_SortItems(pLVInfo->hdr.hwndFrom, ListViewCompareProc, Sort1);
}
break;
}
|
|
|
|
|
Try something like it :
#define COL_COUNT 6 // Count of cols
bool g_arOrders[COL_COUNT] = {0};
...
{
..
case WM_NOTIFY:
switch (((LPNMHDR) lParam)->code) {
case LVN_COLUMNCLICK: {
int iCol = ((LPNMLISTVIEW) lParam)->iSubItem;
if (0 <= iCol && iCol < COL_COUNT) {
g_arOrders[iCol] = !g_arOrders[iCol];
ListView_SortItems(hwndList, ListViewCompareProc, iCol);
}
}
break;
...
}
...
virtual void BeHappy() = 0;
|
|
|
|
|
ok thanks
|
|
|
|
|
Now i have given Like this
typedef struct tagNOTATIONINFO
{
int nEpoch;
TCHAR szDateTime[20];
TCHAR szEvent[100];
}
NOTATIONINFO;
int CALLBACK ListViewCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
NOTATIONINFO* nNot1=(NOTATIONINFO*) lParam1;
NOTATIONINFO* nNot2=(NOTATIONINFO*) lParam2;
return _tcscmp(nNot1->szEvent,nNot2->szEvent);
}
just comparing the event parameter
nothing happening
is there any thing extra i need to do ???
|
|
|
|
|
I have some questions :
0) Will the comparing function be called, can you verify it ?
1) The structure instances must be associated with list items.
How were the items inserted ?
virtual void BeHappy() = 0;
|
|
|
|
|
yes the comparing function is getting called.
ListView items are added from a file
at every Loop i m adding to global structure variable of NOTATIONINFO
|
|
|
|
|
Does every item get an own variable of the NOTATIONINFO structure
with unque filled field szEvent ?
virtual void BeHappy() = 0;
|
|
|
|
|
yes
im initializing
NotationInfo = new ArrayVector<NOTATIONINFO> (500);
at my initdialog function
and my fillList function is having a local temp variable
NOTATIONINFO notTemp={0}<
which will get each event,epoch and datetime
NotationInfo->Add(notTemp)
|
|
|
|
|
Have you something like this ? :
...
NOTATIONINFO notTemp = {0};
...
TCHAR szEventToSet[30] = {0};
...
_tcscpy_s(notTemp.szEvent, _countof(notTemp.szEvent), szEventToSet);
NotationInfo->Add(notTemp);
...
virtual void BeHappy() = 0;
|
|
|
|
|
|
OK And how will the structure be associated with an item ?
virtual void BeHappy() = 0;
|
|
|
|
|
there is no association as of now...
i m just reading data and storing in structure
|
|
|
|
|
That is good
But your should set the address of the stored structure in the array
(not the address of the local variable) - at the item data...
Please see the given earlier example from MS
how to insert the items with the data assotiations.
virtual void BeHappy() = 0;
|
|
|
|
|
ok ......
what i should write inside my call back function?
|
|
|
|
|
I would not change the last comparing code given by you -
for the first test step
...but extend the inserting the items by the assotiations.
virtual void BeHappy() = 0;
|
|
|
|
|
Is that must to add data to listview from the structure NOTATIONINFO
currently i m updating Listview values to structue NOTATIONINFO
this is how current association happening
|
|
|
|
|
Please post your items-inserting code
virtual void BeHappy() = 0;
|
|
|
|
|
for (int i = 0; i < Nnots; i++)
{
if (!(*m_NotHeader)[i]->Time)
{
continue;
}
char szEpoch[20] = {0};
char szTime[20] = {0};
char szEvent[NOT_STRING_LENGTH] = {0};
long sec_on_this_day = (*m_NotHeader)[i]->Time % 86400;
int tm_hour = sec_on_this_day / 3600;
int tm_min = (sec_on_this_day / 60) % 60;
int tm_sec = sec_on_this_day % 60;
LONG lEpoch = (*m_NotHeader)[i]->Time;
::SendMessage(m_hReviewWnd, TWM_WEEG_MESSAGE, TWGM_WEEG_GETEPOCHFORTIME, (LPARAM) &lEpoch);
wsprintf(szEpoch, "%ld", lEpoch);
wsprintf(szTime, "%02d:%02d:%02d.%02d", tm_hour, tm_min, tm_sec, ((*m_NotHeader)[i]->Fractional * 100 / nfh.Fraction_Second_Reference));
int flagsToUse = flags;
if (m_dwStaticEndTime)
{
SampleID NT = { (*m_NotHeader)[i]->Time, (*m_NotHeader)[i]->Fractional };
if (NT >= ST || m_dwStaticEndTime == MAXDWORD)
{
flagsToUse ^= NSI_MARK_IF_NOT_IN_FILES;
}
}
szEvent[0] = '\0';
NotationString(m_hNotation, (*m_NotHeader)[i], szEvent, sizeof(szEvent), flagsToUse);
int nItemCount = ListView_GetItemCount(hLVWnd);
LVITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.iItem = nItemCount;
lvi.iSubItem = 0;
lvi.pszText = szEpoch;
listItemIndex = ListView_InsertItem(hLVWnd, &lvi);
NotationList.nEpoch = atoi(szEpoch);
if (listItemIndex != LV_ERR)
{
ListView_SetItemText(hLVWnd, nItemCount, 1, szTime);
strcpy(NotationList.szDateTime,szTime);
ListView_SetItemText(hLVWnd, nItemCount, 2, szEvent);
strcpy(NotationList.szEvent,szEvent);
assert((*m_NotHeader)[i]);
lvi.mask = LVIF_PARAM;
lvi.lParam = (LPARAM)(*m_NotHeader)[i];
ListView_SetItem(hLVWnd, &lvi);
ListView_SetTextColor(hLVWnd,NewColor);
}
NotationInfo->Add(NotationList);
}
|
|
|
|
|
Try to change to :
...
if (listItemIndex != LV_ERR) {
ListView_SetItemText(hLVWnd, nItemCount, 1, szTime);
strcpy(NotationList.szDateTime,szTime);
ListView_SetItemText(hLVWnd, nItemCount, 2, szEvent);
strcpy(NotationList.szEvent,szEvent);
NotationInfo->Add(NotationList);
lvi.mask = LVIF_PARAM;
lvi.lParam = (LPARAM) &NotationInfo->GetTail();
ListView_SetItem(hLVWnd, &lvi);
ListView_SetTextColor(hLVWnd, NewColor);
}
...
virtual void BeHappy() = 0;
|
|
|
|
|
now i m getting this error
Error 19 error C2039: 'GetTail' : is not a member of 'ArrayVector<Item>'
|
|
|
|
|
Try it :
...
if (listItemIndex != LV_ERR) {
...
lvi.mask = LVIF_PARAM;
lvi.lParam = (LPARAM) &NotationInfo[iInserted++];
...
}
...
virtual void BeHappy() = 0;
|
|
|
|
|
Yup.....
Now my code is like this
on WM_NOTIFY
case LVN_COLUMNCLICK:
{
int iCol = ((LPNMLISTVIEW) lParam)->iSubItem;
if (0 <= iCol && iCol < 3)
{
g_arOrders[iCol] = !g_arOrders[iCol];
ListView_SortItems((GetDlgItem(hDlg,LV_NOTATIONS)), ListViewCompareProc, iCol);
}
and my ListViewCompareProc method is
int CALLBACK SelectNotationsDlg::ListViewCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
LPLVITEMDATA lplvid1 = (LPLVITEMDATA) lParam1;
LPLVITEMDATA lplvid2 = (LPLVITEMDATA) lParam2;
int rc = 0;
int second_sort = FALSE;
char epoch1[100];
char epoch2[100];
if (lParamSort & second_sort)
{
lParamSort &= ~second_sort;
second_sort = TRUE;
}
switch (lParamSort)
{
case 0:
{
itoa((*NotationInfo)[lplvid1->ListNumber].nEpoch,epoch1,10);
itoa((*NotationInfo)[lplvid2->ListNumber].nEpoch,epoch2,10);
rc = Left_Greater_Than_Right(epoch1,epoch2,
20, TRUE);
break;
}
case 1:
{
rc = Left_Greater_Than_Right((*NotationInfo)[lplvid1->ListNumber].szDateTime, (*NotationInfo)[lplvid2->ListNumber].szDateTime,
max(lstrlen((*NotationInfo)[lplvid1->ListNumber].szDateTime), lstrlen((*NotationInfo)[lplvid2->ListNumber].szDateTime)),
FALSE);
break;
}
case 2:
{
rc = Left_Greater_Than_Right((*NotationInfo)[lplvid1->ListNumber].szEvent ,
(*NotationInfo)[lplvid2->ListNumber].szEvent, 6, FALSE);
break;
}
}
if ((!rc) && (Sort1 != Sort2) && (!second_sort))
{
rc = ListViewCompareProc(lParam1, lParam2, (Sort2 | second_sort));
}
return (rc * g_arOrders[lParamSort]);
}
still not able to get sorted
still missing something?
|
|
|
|