---
title: "Sortera en list control"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/100647-sortera-en-list-control"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "Viktor"
published: "2004-03-30T19:10:38.000Z"
updated: "2004-03-30T23:14:23.000Z"
replies: 4
views: 169
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/100647-sortera-en-list-control"
---

# Sortera en list control

## #1 — Viktor, 2004-03-30T19:10Z

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

Permalänk: https://www.webforum.nu/p/100647

## #2 — Marcus E, 2004-03-30T20:08Z

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

Permalänk: https://www.webforum.nu/p/1311973

## #3 — Viktor, 2004-03-30T21:44Z

**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

Permalänk: https://www.webforum.nu/p/1312019

## #4 — Marcus E, 2004-03-30T22:40Z

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?

Permalänk: https://www.webforum.nu/p/1312038

## #5 — Viktor, 2004-03-30T23:14Z

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

Permalänk: https://www.webforum.nu/p/1312043

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/100647-sortera-en-list-control
