webForumDet fria alternativet

Sortera en list control

4 svar · 153 visningar · startad av Viktor

ViktorMedlem sedan aug. 20021 752 inlägg
#1

Hej

Jag håller på att göra ett program i Win32 utan MFC osv och jag vill sortera lite saker som jag har lagt in i en list control (report view). Problemet nu är att min compare funktion anroppas och körs men listan är ändå inte sorterad utan ser likadan som innan jag begärde en sortering.

Här är koden för sorteringen,

void OnNotify(WPARAM wParam, LPARAM lParam)
{
	if(wParam==IDC_LIST_PROGRAM_KEYSTROKE)
	{
		LV_DISPINFO *pLvdi=(LV_DISPINFO*)lParam;
		NM_LISTVIEW *pNm=(NM_LISTVIEW*)lParam;
		switch(pLvdi->hdr.code)
		{
			case LVN_COLUMNCLICK:
			{
				ListView_SortItems(pNm->hdr.hwndFrom,CompareFunc,(LPARAM)(pNm->iSubItem));
				break;
			}
		}
	}
}

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	ItemData *Data1=(ItemData*)lParam1;
	ItemData *Data2=(ItemData*)lParam2;
	int iResult=0;
	if(lParamSort==0)
		iResult=lstrcmpi(Data1->Name,Data2->Name);
	else
		iResult=Data2->Keys-Data1->Keys;
	return(iResult);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message) 
	{
		case WM_NOTIFY:
			OnNotify(wParam,lParam);
...
}

och här är kod som jag använder för att lägga in mina items,

void UpdateList()
{
	char *Temp=NULL;
	ItemData *pItemData=NULL;
	int i=0;
	map<string,int> keys=m_Counter.GetMap();
	map<string,int>::iterator iter;

	// Clear all items
	SendMessage(m_hList,LVM_DELETEALLITEMS,0,0);

	for(iter=keys.begin();iter!=keys.end();iter++)
	{
		pItemData=new ItemData();
		Temp=new char[_MAX_DIR];
		sprintf(Temp,"%s",iter->first.substr(iter->first.find_last_of('\\')+1).c_str());
		pItemData->Keys=iter->second;
		pItemData->Name=Temp;
		AddItem(Temp,i,0,pItemData);
		Temp=new char[_MAX_DIR];
		sprintf(Temp,"%d",iter->second);
		AddItem(Temp,i++,1);
	}
}

bool AddItem(char *Name, int Item, int SubItem, ItemData *pItemData)
{
	LVITEM LvItem;

	memset(&LvItem,0,sizeof(LvItem));
	if(SubItem==0)
		LvItem.mask=LVIF_TEXT|LVIF_PARAM;
	else
		LvItem.mask=LVIF_TEXT;
	LvItem.cchTextMax=256;
	LvItem.pszText=Name;
	LvItem.lParam=(LPARAM)pItemData;
	LvItem.iItem=Item;
	LvItem.iSubItem=SubItem;
	if(SubItem==0)
		SendMessage(m_hList,LVM_INSERTITEM,0,(LPARAM)&LvItem);
	else
		SendMessage(m_hList,LVM_SETITEM,0,(LPARAM)&LvItem);
	return(true);
}

/Viktor

Marcus EMedlem sedan maj 20021 466 inlägg
#2

Anropas CompareFunc flera gånger? Är iResult något annat än noll? Returnerar ListView_SortItems true?

ViktorMedlem sedan aug. 20021 752 inlägg
#3

Anropas CompareFunc flera gånger
Ja!
Är iResult något annat än noll
Ja!
Returnerar ListView_SortItems true
Ja!

MEN! När jag skrev om koden på detta sätt för att kunna svara på din sista fråga,

if(ListView_SortItems(pNm->hdr.hwndFrom,CompareFunc,(LPARAM)(pNm->iSubItem)))
	MessageBox(m_hWnd,"True","Data",MB_OK);
else
	MessageBox(m_hWnd,"False","Data",MB_OK);

så hände något konstigt! Listan är sorterad när jag får upp min messagebox men så fort som jag trycker på OK i den så går listan tillbaka till sin ursprungliga ordning.

/Viktor

Marcus EMedlem sedan maj 20021 466 inlägg
#4

Aha, då beror det troligen på att listan sorteras i DefWndProc.

Har du kollat så att du inte har LVS_SORTASCENDING eller LVS_SORTDESCENDING som style till kontrollen?

ViktorMedlem sedan aug. 20021 752 inlägg
#5

Jo det gör den nog (mitt första win32 program så jag är inte så het på det ännu men jag tror jag vet vad du menar :))

Jag har identifierat att listan sorteras och sedan anroppas min funktion som rensar den och fyller den igen, och då blir den osorterad. Denna funktion anroppas när WinProc får in ett WM_SIZE - SIZE_RESTORED medelande. Meningen är att detta medelande ska gälla för fönstret (det ligger i sys tray och den ska fyllas när man visar fönstret) men jag antar att det i detta fall gäller för list boxen och att man ska skapa separata Proc's för varje fönster och sedan ha en master, WinProc?

/Viktor

126 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)