|
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?
|
|
|
|
|
Please try it firstly :
int CALLBACK ListViewCompareProc(LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort)
{
int iResult = 0;
int iClickedCol = int(lParamSort);
if (0 <= iClickedCol && iClickedCol < 3) {
NOTATIONINFO* nNot1=(NOTATIONINFO*) lParam1;
NOTATIONINFO* nNot2=(NOTATIONINFO*) lParam2;
iResult = g_arOrders[iClickedCol] ?
_tcscmp(nNot1->szEvent, nNot2->szEvent) :
_tcscmp(nNot2->szEvent, nNot1->szEvent);
}
return iResult;
}
virtual void BeHappy() = 0;
|
|
|
|
|
its sorting my List View
based on the First Coloum that is epoch
epoch is of numbers
but is it possible to sort based on each column repective on click on them
|
|
|
|
|
Stop
Is'nt it sorted by szEvent now ?
virtual void BeHappy() = 0;
|
|
|
|
|
No...
its getting sorted by the Epoch ie is the number
|
|
|
|