tutorials.de Buch-Aktion 05/2012
Seite 3 von 3 ErsteErste 123
ERLEDIGT
NEIN
ANTWORTEN
36
ZUGRIFFE
6460
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #31
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Versuch es mal mit einem Cast:
    Code :
    1
    
    m_listCtrl.SortItems( (PFNLCOMPARE)sortitems, 0);

    Übrigens sitze ich im Moment wieder an der Listensortierung -- jetzt allerdings mit .Net. Das hat seine eigenen Fallstricke.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  2. #32
    Ravebaby Ravebaby ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    151
    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);
     

  3. #33
    Ravebaby Ravebaby ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    151
    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...
     

  4. #34
    Ravebaby Ravebaby ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    151
    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 :
    1
    2
    3
    4
    5
    6
    
    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 :
    1
    
    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 :
    1
    
    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 :
    1
    
    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 :
    1
    2
    3
    4
    
    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?!
     

  5. #35
    Avatar von CodeFatal
    CodeFatal CodeFatal ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Beiträge
    509
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
    //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
     
    Grüß die Welt, dann grüßt sie dich!

    Keine Panik, die Titanic ist schon gesunken!

  6. #36
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Es sieht so aus, als ob die Aufrufkonventionen nicht zusammenpassen. Hast du Compare-Funktion auch so deklariert?
    Code :
    1
    
    int CALLBACK MyCompareProc (LPARAM , LPARAM , LPARAM);
    Ist bei deiner "lustigen Standardvariante" die C2664-Fehlermeldung die einzige, oder kommen da noch welche nach?

    BTW:
    Zitat Zitat von Kachelator
    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 :
    1
    
    static int CALLBACK MyCompareProc (LPARAM , LPARAM , LPARAM);
    Vielleicht probierst du es ja mal so aus.
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  7. #37
    JJ164 JJ164 ist offline Grünschnabel
    Registriert seit
    Oct 2008
    Beiträge
    1
    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
     

Ähnliche Themen

  1. IE Listenelement Lücke
    Von dezerver im Forum CSS
    Antworten: 4
    Letzter Beitrag: 19.11.07, 12:53
  2. Listenelement IE und FF
    Von Luna1000 im Forum CSS
    Antworten: 2
    Letzter Beitrag: 11.09.07, 16:55
  3. Text im Listenelement
    Von udo_the_man im Forum HTML & XHTML
    Antworten: 1
    Letzter Beitrag: 22.04.06, 21:32
  4. Hintergrund für Listenelement
    Von ares99kk im Forum CSS
    Antworten: 6
    Letzter Beitrag: 09.12.04, 10:05
  5. Listenelement, Farbe, checkbox
    Von jma im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 22.03.04, 12:22