Zum Inhalt springen

CListCtrl SortItems Probleme mit der CALLBACK funktion


Empfohlene Beiträge

Geschrieben

Hi,

ich möchte mein CListCtrl mit hilfe der Funktion SortItems(vgl. MSDN) sortieren.

SortItems benötigt eine CALLBACK funktion welche jeweils 2 Werte vergleicht und dementsprechend zurückgibt ob Param 1 > Param 2(negativer Returnwert) Param 1 == Param 2(0 Returnwert) Param 1 < Param 2(positiver Returnwert);

Nun zu meine Problem das ganze Funktioniert nicht!(Wär hätte das gedacht :D )

Zur besseren übersicht hier mal mein Quellcode:

//Aufruf von SortItems

void CUbwa_Recover_Dialog::OnColumnclickListIdxFiles(NMHDR* pNMHDR, LRESULT* pResult)

{

CListCtrl *p_m_idx_listbox = & this->m_idx_listbox;

m_idx_listbox.SortItems(SortAbsteigend, (LPARAM) p_m_idx_listbox);

*pResult = 0;

}

//Callback Funktion

int CALLBACK CUbwa_Recover_Dialog::SortAbsteigend(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

{

// lParamSort contains a pointer to the list view control.

// The lParam of an item is just its index.

CListCtrl* pListCtrl = (CListCtrl*) lParamSort;

CString strItem1 = pListCtrl->GetItemText(lParam1, 0);

CString strItem2 = pListCtrl->GetItemText(lParam2, 0);

return strcmp(strItem2, strItem1);

}

Mein Problem ist das bei mir lParam1 und lParam2 immer 0 sind, d.h. das immer nur das erste Item mit sich selber verglichen wird, welche natürlich gleich sind;)

P.S. Bevor die ersten Aufschreien: SortAbsteigend ist natürlich in der HeaderFile static definiert & auch public! (Das ohne static in der cpp hat mir das Visual Studio so angelegt!)

P.P.S. Auch mit den Zeiger auf das ListCtrl ist alles in Ordnung, hab die Adressen verglichen, die sind Identisch!!!

Zur Info: Was ich schon versucht habe:

-SortAbsteigend als Standalone Funktion

-Anderer Zugriffsmodifizierer

-Manuelles hinzufügen von static in der Cpp(bringt Compiler Fehler)

Mein Verdacht ist das das static in irgendeiner weise Probleme macht.....

Wär super enn mir jemand helfen könnte!!!!:D

Geschrieben

Bei der Sortierfunktion stehen in lParam1 und lParam2 die Werte, die im ListControl mit SetItemData eingetragen wurden, nicht(!) die Indizes der zu vergleichenden Elemente. Per Default ist dieser Wert bei allen Einträgen Null.

Geschrieben

thx -> hab ich inzwischen auch durch die Microsoft Knowledge Base Rausbekommen!...Wär nur schön gewesen wenn das in der Hilfe gestanden wäre. Etz muss ich mein komplettes System umstellen....:(

Geschrieben
Original geschrieben von NewNuke

thx -> Etz muss ich mein komplettes System umstellen....:(

Eigentlich reicht es doch, wenn Du

for( int i=0; i<m_idx_listbox.GetItemCount();i++) m_idx_listbox.SetItemData( i, i );

vor den SortItems-Aufruf einfügst.

Geschrieben
Original geschrieben von Klotzkopp

Eigentlich reicht es doch, wenn Du

for( int i=0; i<m_idx_listbox.GetItemCount();i++) m_idx_listbox.SetItemData( i, i );

vor den SortItems-Aufruf einfügst.

mmmhhh... laut Mircosoft Knowledge Base reicht das nicht...die haben dort nämlich SetItemData alle Werte der items und Subitems mitgegeben....das könnt ich zwar jetzt auch noch mit hilfe einer Funktion im Nachhinein hinzufügen...des schaut aber a weng umsauber aus.....

Ich hab mich etz entschieden des anders zu machen: Ich benutz qsort und setz danach die Werte selber....da weis man wenigstens was man macht:D

Trotzdem thx for your help

  • 7 Monate später...
Geschrieben
Original geschrieben von Klotzkopp

Eigentlich reicht es doch, wenn Du

for( int i=0; i<m_idx_listbox.GetItemCount();i++) m_idx_listbox.SetItemData( i, i );

vor den SortItems-Aufruf einfügst.

das reicht. bei mir klappt das so :)

aber ich möchte in der "SortAbsteigend" (hab ich mal so übernommen ;) ) Zugriff auf meine angeklickte Spalte haben (für GetItemText).

Ich habe in meiner "ColumnClick" foglende Zeile eingefügt:


m_spalte=pNMListView->iSubItem;

(m_spalte ist ein global definierter int) und wollte folgende Zeile in SortAbsteigend haben:

CString strItem1 = pListCtrl->GetItemText(lParam1, m_spalte);

folgende Fehlermeldung:

error C2597: illegal reference to data member 'CProjektDlg::zwischen_anzahl' in a static member function

und nu?

Geschrieben

Die Sortierfunktion ist statisch (das muss sie auch sein), und verfügt damit nicht über einen this-Zeiger. Du kannst daher nur auf statische Membervariablen zugreifen.

Eine Möglichkeit wäre, als zweiten Parameter von SortItems nicht einen Zeiger auf das Steuerelement, sondern den this-Zeiger zu übergeben:

m_cltDeinListCtrl.SortItems(SortAbsteigend, (LPARAM) this);

Dann müsste man den Code der Sortierfunktion entsprechen anpassen:

int CALLBACK CProjektDlg::SortAbsteigend(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

{

// lParamSort contains a this pointer of the dialog class

CProjektDlg* pThis = (CProjektDlg*) lParamSort;

CListCtrl* pListCtrl = (CListCtrl*) pThis->GetDlgItem( IDC_DEIN_LIST_CONTROL );

// oder CListCtrl* pListCtrl = (CListCtrl*) &pThis->m_ctlDeinListCtrl;

// falls Du eine Control-Variable hast

...

}

So kannst Du z.B. mittels pThis->zwischen_anzahl auf nichtstatische Member zugreifen.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...