SortClass.cpp
资源名称:GGBT.rar [点击查看]
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:3k
源码类别:
P2P编程
开发平台:
Visual C++
- // SortClass.cpp: implementation of the CSortClass class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "testbt.h"
- #include "SortClass.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CSortClass::CSortClass(CListCtrl * _pWnd, const int _iCol)
- {
- pWnd = _pWnd;
- ASSERT(pWnd);
- int max = pWnd->GetItemCount();
- DWORD dw;
- CString txt;
- // replace Item data with pointer to CSortItem structure
- for (int t = 0; t < max; t++)
- {
- dw = pWnd->GetItemData(t); // save current data to restore it later
- txt = pWnd->GetItemText(t, _iCol);
- pWnd->SetItemData(t, (DWORD) new CSortItem(dw, txt));
- }
- }
- CSortClass::~CSortClass()
- {
- ASSERT(pWnd);
- int max = pWnd->GetItemCount();
- CSortItem * pItem;
- for (int t = 0; t < max; t++)
- {
- pItem = (CSortItem *) pWnd->GetItemData(t);
- ASSERT(pItem);
- pWnd->SetItemData(t, pItem->dw);
- delete pItem;
- }
- }
- void CSortClass::Sort(bool _bAsc, EDataType _dtype)
- {
- long lParamSort = _dtype;
- // if lParamSort positive - ascending sort order, negative - descending
- if (!_bAsc)
- lParamSort *= -1;
- pWnd->SortItems(Compare1, lParamSort);
- }
- int CALLBACK CSortClass::Compare1(LPARAM lParam1, LPARAM lParam2, LPARAM
- lParamSort)
- {
- CSortItem * item1 = (CSortItem *) lParam1;
- CSortItem * item2 = (CSortItem *) lParam2;
- ASSERT(item1 && item2);
- // restore data type and sort order from lParamSort
- // if lParamSort positive - ascending sort order, negative - descending
- short sOrder = lParamSort < 0 ? -1 : 1;
- EDataType dType = (EDataType) (lParamSort * sOrder); // get rid of sign
- // declare typed buffers
- COleDateTime t1, t2;
- switch (dType)
- {
- case EDataType::dtINT:
- return (atol(item1->txt) - atol(item2->txt))*sOrder;
- case EDataType::dtDEC:
- return (atof(item1->txt) < atof(item2->txt) ? -1 : 1)*sOrder;
- case EDataType::dtDATETIME:
- if (t1.ParseDateTime(item1->txt) && t2.ParseDateTime(item2->txt))
- return (t1 < t2 ? -1 : 1 )*sOrder;
- else
- return 0;
- case EDataType::dtSTRING:
- return item1->txt.CompareNoCase(item2->txt)*sOrder;
- default:
- ASSERT("Error: attempt to sort a column without type.");
- return 0;
- }
- }
- CSortClass::CSortItem::CSortItem(const DWORD _dw, const CString & _txt)
- {
- dw = _dw;
- txt = _txt;
- }