Listenelement sortieren

Kachelator

Peter Jerz
Versuch es mal mit einem Cast:
Code:
m_listCtrl.SortItems( (PFNLCOMPARE)sortitems, 0);

Übrigens sitze ich im Moment wieder an der Listensortierung -- jetzt allerdings mit .Net. Das hat seine eigenen Fallstricke. :)
 

Ravebaby

Erfahrenes Mitglied
Nun bringt er 3 Fehler:
u:\Projekte\FileExplorer\ColumnLevelView.cpp(297): error C2059: syntax error : ')'
u:\Projekte\FileExplorer\ColumnLevelView.cpp(297): error C2065: 'PFNLCOMPARE' : undeclared identifier
u:\Projekte\FileExplorer\ColumnLevelView.cpp(297): error C2146: syntax error : missing ')' before identifier 'sortitems'

Code: m_listCtrl.SortItems((PFNLCOMPARE)sortitems, 0);
 

Ravebaby

Erfahrenes Mitglied
das gibts doch nich, ich bekomm es einfach nicht zum Laufen... mit und ohne Cast...
Ich habe das Ganze vor ein paar Wochen schonmal in Angriff genommen und bin kläglich dran gescheitert...
 

Ravebaby

Erfahrenes Mitglied
Ich werd nun echt bald wahnsinnig. Ich habe nun in größeren zeitlichen Abständen immer wieder versucht, die Suche EINMAL erfolgreich zu implementieren, aber wirklich ohne Erfolg...

Dies ist meine vereinfachte Comparefunktion um es testen zu können:
Code:
int CALLBACK MyCompareProc (LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	if ( lParam1 < lParam2 ) return +1;
	if ( lParam1 > lParam2 ) return -1;
	return 0;
}

Nur beim Aufruf scheiter ich echt kläglich:

Die lustige Standardvariante
Code:
pView->m_listCtrl.SortItems(MyCompareProc, (LPARAM) &pView->m_listCtrl );
bringt folgenden Fehler:
"c:\Develop\Projects\FileExplorer\FileExplorerDoc.cpp(154): error C2664: 'CListCtrl::SortItems' : cannot convert parameter 1 from 'int (LPARAM,LPARAM,LPARAM)' to 'PFNLVCOMPARE'"

Deshalb dachte ich, casten wir das ganze mal in PFNLVCOMPARE, hat aber leider auch nichts geholfen:

Code:
pView->m_listCtrl.SortItems((PFNLVCOMPARE)MyCompareProc, (LPARAM) &pView->m_listCtrl );
Bringt folgenden Fehler:
" c:\Develop\Projects\FileExplorer\FileExplorerDoc.cpp(152): error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'PFNLVCOMPARE' "

Code:
pView->m_listCtrl.SortItems((PFNLVCOMPARE)MyCompareProc, (DWORD)this );
Bringt den Fehler:
" c:\Develop\Projects\FileExplorer\FileExplorerDoc.cpp(153): error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'PFNLVCOMPARE' "

Habe nun gelesen, dass das msdn Beispiel falsch ist und man erst noch mittels CListCtrl::SetItemData den 32 bit - Wert speichern muss. Also habe ich folgenden Funktionsaufruf zugefügt:
Code:
for (int i=0;i < pView->m_listCtrl.GetItemCount();i++)
{
	pView->m_listCtrl.SetItemData(i, i);
}

Aber auch das scheint den Fehler nich zu beheben...

WAS KANN ICH DENN NUN NOCH TUN?! :confused:
 

CodeFatal

Erfahrenes Mitglied
Moin moin,

hört sich echt nach Verzweiflung an:)

Muss gestehen hab mir die drei Seiten jetzt nicht bis ins letzte durchgelesen, aber folgendes funktioniert einwandfrei bei mir:
Code:
//Callback Funktion
int CALLBACK sortitems( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort )
{
	if ( lParam1 == 0 || lParam2 == 0 ) return 0;
	
	CString* pA = (CString*)lParam1;  
	CString* pB = (CString*)lParam2;

	if(lParamSort)return pA->Compare( LPCTSTR( *pB ) );
	else return -pA->Compare( LPCTSTR( *pB ) );

	return 0;
}

//imHeader
extern int CALLBACK sortitems( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort );


//Aufruf der Sortierfunktion
void CGerateInfo::SortAufgabeByListTitle(int Subitem)
{
	//LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

	int i;

	//- "Itemdatas mit Text füllen"
	for ( i = 0; i < m_ListAktionen.GetItemCount(); ++i )
	{
		CString strTemp = m_ListAktionen.GetItemText( i, Subitem ); 
		m_ListAktionen.SetItemData( i, (( DWORD_PTR)( new CString( strTemp ))) );
	}
	  
	//- sortieren
	m_ListAktionen.SortItems( sortitems, 1/*Sortorder*/ );
	//SortOrder[pNMLV->iSubItem] = 1-SortOrder[pNMLV->iSubItem];

	//- Itemdatas wieder freigeben
	for ( i = 0; i < m_ListAktionen.GetItemCount(); ++i )
	{
		CString* pA = (CString*) m_ListAktionen.GetItemData( i ); 
		delete pA;
		m_ListAktionen.SetItemData( i, 0 );
	}
	//*pResult = 0;

}
hab zwar nicht die View benutzt sondern direkt nen CListCtrl aber das sollte keinen Unterschied machen.

Viel Erfolg beim test.

Gruss Michael
 

MCoder

Erfahrenes Mitglied
Es sieht so aus, als ob die Aufrufkonventionen nicht zusammenpassen. Hast du Compare-Funktion auch so deklariert?
Code:
int CALLBACK MyCompareProc (LPARAM , LPARAM , LPARAM);
Ist bei deiner "lustigen Standardvariante" die C2664-Fehlermeldung die einzige, oder kommen da noch welche nach?

BTW:
Kachelator hat gesagt.:
Das darf keine Memberfunktion sein. Richtig ist int CALLBACK sortitems(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort).
Ist so nicht ganz richtig. Man kann als Sortierfunktion auch eine Memberfunktion verwenden, allerdings muss diese dann als "static" deklariert werden:
Code:
static int CALLBACK MyCompareProc (LPARAM , LPARAM , LPARAM);
Vielleicht probierst du es ja mal so aus.
 

JJ164

Grünschnabel
Hallo,

ich weis das der Beitrag schon sehr Alt ist, trotzdem möchte ich mich bedanken.
Mir als Programmieranfänger hat er super gut geholfen und alles klappte auf anhieb.
Hoffe das ich auch bald mal wem helfen kann :)

MfG

JJ