DBO Geschrieben 18. Februar 2002 Geschrieben 18. Februar 2002 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 ) 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!!!! Zitieren
Klotzkopp Geschrieben 18. Februar 2002 Geschrieben 18. Februar 2002 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. Zitieren
DBO Geschrieben 18. Februar 2002 Autor Geschrieben 18. Februar 2002 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.... Zitieren
Klotzkopp Geschrieben 18. Februar 2002 Geschrieben 18. Februar 2002 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. Zitieren
DBO Geschrieben 19. Februar 2002 Autor Geschrieben 19. Februar 2002 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 Zitieren
beebof Geschrieben 17. Oktober 2002 Geschrieben 17. Oktober 2002 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? Zitieren
Klotzkopp Geschrieben 17. Oktober 2002 Geschrieben 17. Oktober 2002 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. Zitieren
beebof Geschrieben 18. Oktober 2002 Geschrieben 18. Oktober 2002 das klappt!!! :marine :marine dankeschön!!!! bisst mein held! Zitieren
Empfohlene Beiträge
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.