Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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....:(

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...
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?

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.