Filou Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 Hi, ich habe eine CListCtrl in den Eine Beschreibung und ein Datum angezeigt wird. Ich möchte jetzt alle Einträge in der Liste absteigend nach Datum sortieren. Wie geht das? Ist CListCtrl::SortItems die richtige Funktion? Und wenn ja, wie funktioniert das? http://msdn2.microsoft.com/en-us/library/b4ceh1za.aspx Das verstehe ich nämlich nicht! Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 Hast du hier mal nach *SortItems gesucht? Das Thema hatten wir schon mehrmals. Zitieren
Filou Geschrieben 28. Juni 2006 Autor Geschrieben 28. Juni 2006 Ich hab versucht den Code hier aus diesem thread zu verstehen aber ich weiß gar nicht wo und wie ich anfangen soll http://forum.fachinformatiker.de/c-compiler-ides-apis/61235-sortitems-tut-bug.html?highlight=%2ASortItems Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 Als erstes brauchst du eine Funktion zum Vergleichen zweier Einträge. Die muss so aussehen: int CALLBACK NameEgal(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)Die Parameternamen sind auch egal. Wenn es eine Memberfunktion ist, muss sie static sein. Beim Aufruf von SortItems gibst du den Funktionszeiger dieser Funktion an. Die Funktion wird dann immer wieder aufgerufen, bis die Reihenfolge der Einträge geklärt ist. In lParam1 und lParam2 stehen die Itemdata-Werte, die den Einträgen zugeordnet wurden. In lParamSort landet der Wert, den du als zweiten Parameter bei SortItems angegeben hast. In der Funktion musst du dann von den ItemData-Werten auf die zu vergleichenden Werte kommen, und dann je nach Relation der zu vergleichenden Einträge -1, 0 oder 1 zurückgeben. Zitieren
Filou Geschrieben 28. Juni 2006 Autor Geschrieben 28. Juni 2006 Das ist aber sehr verwirrend. Ich habe es jetzt mal so geweit gemacht. Aber mir fehlen noch viele Parameter und ich weiß noch nicht was das ganze funktionieren soll?? [COLOR="seagreen"]///////////////////////////////////////////////////////////////////////////// // Sortiert die Dokumentenliste nach Datum[/COLOR] [COLOR="SeaGreen"]//[/COLOR] [COLOR="Blue"]void [/COLOR]CPatient::DokumenteSortieren() { [COLOR="blue"]int [/COLOR]iCount = [COLOR="darkred"]0[/COLOR]; //while m_ctrlList.SortItems([COLOR="blue"]this[/COLOR]->DokumenteVergleichen(),IRGENDWAS); } [COLOR="SeaGreen"]///////////////////////////////////////////////////////////////////////////// // Vergleicht Dokumente[/COLOR] [COLOR="seagreen"]//[/COLOR] [COLOR="blue"]int [/COLOR]CALLBACK CPatient::DokumenteVergleichen(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { [COLOR="blue"]int [/COLOR]iSelected = m_ctrlList.GetSelectionMark(); DWORD Item = m_ctrlList.GetItemData(iSelected); [COLOR="blue"]if[/COLOR](Item <= wasmusshierrein?) { [COLOR="blue"]return [/COLOR][COLOR="darkred"]1[/COLOR]; ?? } [COLOR="blue"]return [/COLOR][COLOR="DarkRed"]0[/COLOR]; } Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 Du musst beim Aufruf von SortItems die Klammern bei DokumenteVergleichen weglassen, denn du musst den Funktionszeiger übergeben, wie ich oben schon geschrieben habe, nicht den Rückgabewert eines Aufrufs. Du kannst in DokumenteVergleichen nicht auf m_ctrlList zugreifen, weil die Vergleichsfunktion static sein muss, wie ich oben schon geschrieben habe. Überlicherweise übergibt man als zweiten Parameter entweder einen Zeiger auf das Steuerelement oder sein Elternfenster und holt das in der Vergleichsfunktion wieder raus. Außerdem hat das Sortieren nichts mit der aktuellen Auswahlmarkierung zu tun. Wie gesagt: In lParam1 und lParam2 stehen die Itemdata-Werte, die den Einträgen zugeordnet wurden. Wie du daran die zu vergleichenden Einträge erkennst, und wie du darüber an die Daten kommst, die du für den Vergleich brauchst, darum musst du dich selbst kümmern. So lange du nicht jedem Eintrag mit SetItemData einen Wert zuweist, an dem du ihn erkennen kannst, wird das nichts. Zitieren
Filou Geschrieben 28. Juni 2006 Autor Geschrieben 28. Juni 2006 Ok, mal für blööde.... ich hab die Funktion so definiert: static int CALLBACK DokumenteVergleichen(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) {...} aber wie rufe ich sie auf? m_ctrlList.SortItems(*:: DokumenteVergleichen,*m_ctrlList); m_ctrlList.SortItems(::*DokumenteVergleichen,*m_ctrlList); m_ctrlList.SortItems(:: DokumenteVergleichen,*m_ctrlList); m_ctrlList.SortItems(*DokumenteVergleichen,*m_ctrlList); m_ctrlList.SortItems(DokumenteVergleichen,*m_ctrlList); geht alles nicht... Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 geht alles nicht...Lies meine Signatur Der * vor m_ctrlList sollte aber schon ein & sein. Zitieren
Filou Geschrieben 28. Juni 2006 Autor Geschrieben 28. Juni 2006 Lies meine Signatur Der * vor m_ctrlList sollte aber schon ein & sein. Ok, also: m_ctrlList.SortItems(*DokumenteVergleichen,*m_ctrlList); 'DokumenteVergleichen' : nichtdeklarierter Bezeichner UND 'DokumenteVergleichen' : Neudefinition; unterschiedliche Modifizierer m_ctrlList.SortItems(:: DokumenteVergleichen,*m_ctrlList); DokumenteVergleichen' : Ist kein Element von '`global namespace'' UND 'DokumenteVergleichen' : Neudefinition; unterschiedliche Modifizierer m_ctrlList.SortItems(*:: DokumenteVergleichen,*m_ctrlList); DokumenteVergleichen' : Ist kein Element von '`global namespace'' UND 'DokumenteVergleichen' : Neudefinition; unterschiedliche Modifizierer m_ctrlList.SortItems(::*DokumenteVergleichen,*m_ctrlList); Syntaxfehler : Fehlendes ')' vor '<tag>::*' Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 m_ctrlList.SortItems(DokumenteVergleichen,(LPARAM)&m_ctrlList); Ist denn DokumenteVergleichen Member derselben Klasse wie m_ctrlList? Zitieren
Filou Geschrieben 28. Juni 2006 Autor Geschrieben 28. Juni 2006 In den Beispiel oben nicht, aber ich habe es auch schon als Memberfunktion versucht: m_ctrlList.SortItems(DokumenteVergleichen,*m_ctrlList); 'SortItems' : Konvertierung des Parameters 2 von 'struct HWND__' in 'unsigned long' nicht moeglich m_ctrlList.SortItems(*DokumenteVergleichen,*m_ctrlList); '*' : Ungueltige Operation auf Ausdruck einer gebundenen Member-Funktion PS: Obwohls ja im orberen Beispiel an m_ctrlList liegen muss, oder? Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 In den Beispiel oben nicht, Dann musst du schon den Klassennamen dazuschreiben, in dem DokumenteVergleichen deklariert ist. m_ctrlList.SortItems(DokumenteVergleichen,*m_ctrlList); m_ctrlList.SortItems(*DokumenteVergleichen,*m_ctrlList); Wie ich oben bereits geschrieben habe: Der * vor m_ctrlList sollte aber schon ein & sein.Und einen Cast auf LPARAM brauchst du auch. Liest du eigentlich nicht, was ich schreibe? Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 Eine explizite Typumwandlung. SortItems erwartet als zweiten Parameter LPARAM, wir haben einen MFC-Fensterzeiger. Das lässt sich nicht implizit umwandeln, daraum brauchen wir einen Cast. In diesem Fall ist das ein C-Style-cast: Man schreibt den neuen Typ in Klammern davor. So langsam habe ich den Eindruck, dass du dir das ein oder andere Grundlagentutorial zu Gemüte führen solltest Zitieren
Filou Geschrieben 28. Juni 2006 Autor Geschrieben 28. Juni 2006 Also so wie bei: char test[50]; CString test = CString (test); Wenn ichs aber so veruche: m_ctrlList.SortItems(CPatient:: DokumenteVergleichen,LPARAM(&m_ctrlList)); passiert: Nichtaufgeloestes externes Symbol "public: static int __stdcall CPatient:: DokumenteVergleichen(long,long,long)" (?DokumenteVergleichen@CPatient@@SGHJJJ@Z) Und wenn ich die Funktion DokumenteVergleichen mit CPatient:: DokumenteVergleichen anlege, bekomme ich die Fehlermeldung hier: 'DokumenteVergleichen' : 'static' sollte nicht für Member-Funktionen verwendet werden, die ausserhalb der Klasse definiert werden Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 Also so wie bei: char test[50]; CString test = CString (test);Nein, das ist kein Cast. Ein Cast sähe so aus: CString test = [b](CString)[/b] test; Nichtaufgeloestes externes Symbol "public: static int __stdcall CPatient:: DokumenteVergleichen(long,long,long)" Die Definition passt nicht auf die Deklaration, oder du hast die Funktion nicht definiert, oder die Übersetzungseinheit, in der sie definiert ist, nicht dazugelinkt. Zitieren
Filou Geschrieben 28. Juni 2006 Autor Geschrieben 28. Juni 2006 Dekalriet ist die Funktion in der Headerdatei von CPatient. Und zwar so: (Patient.h) // Konstruktion public: static int CALLBACK DokumenteVergleichen(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); Und definiert ist sie in der Patient.cpp: static int CALLBACK DokumenteVergleichen(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) {...} Ich weiß jetzt nur nicht ob mit CPatient:: DokumenteVergleichen oder ohne. Beides funktioniert jedenfalls nicht. Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 Und definiert ist sie in der Patient.cpp: static int CALLBACK DokumenteVergleichen(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) {...}Nochmal der Verweis auf ein Grundlagentutorial. Das muss so aussehen: int CALLBACK CPatient::DokumenteVergleichen(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) Also ohne static, dafür mit dem Klassennamen. Zitieren
UltimateRuppi Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 Na dann lass im FUnktionskopf bei der Definition (Implementierung) mal das static weg. Zitieren
Filou Geschrieben 28. Juni 2006 Autor Geschrieben 28. Juni 2006 Nochmal der Verweis auf ein Grundlagentutorial. Das muss so aussehen: int CALLBACK CPatient::DokumenteVergleichen(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) Also ohne static, dafür mit dem Klassennamen. Ja so hätte ich es auch gemacht, so lege ich jede Funktion an, aber Du sagtest doch es MUSS static sein... :confused: Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 aber Du sagtest doch es MUSS static sein... :confused:Richtig. Und statische Memberfunktionen definiert man ohne das Schlüsselwort static -> Grundlagentutorial Zitieren
Filou Geschrieben 28. Juni 2006 Autor Geschrieben 28. Juni 2006 Oh nein, es geht immer noch nicht. Das ist ja zum verrückt werden.... Und wir sind erst ganz am Anfang. es tut ja noch überhaupt nix sortieren Sorry dass ich mich so doof anstelle.... ich habe es jetzt so deklariert: int CALLBACK CPatient:: DokumenteVergleichen(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); und auch so definiert: int CALLBACK CPatient:: DokumenteVergleichen(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) {...} und es kommt immernoch ein Fehler: m_ctrlList.SortItems(DokumenteVergleichen,LPARAM(&m_ctrlList)); SortItems' : Konvertierung des Parameters 1 von 'int (long,long,long)' in 'int (__stdcall *)(long,long,long)' nicht moeglich und der Aufruf mit * oder & geht auch nicht... Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 und der Aufruf mit * oder & geht auch nicht...Wenn der Compiler an Parameter 1 herummäkelt, ist es ziemlich egal, wie Parameter 2 aussieht! Bei der Deklaration einer statischen Memberfunktion muss static stehen, bei der Definition nicht! Und die Deklaration muss in die Klasse, ohne den Klassennamen davor! Und der Cast ist auch immer noch falsch. Ich habe doch schon hingeschrieben, wie das aussehen muss! Ich stehe kurz davor, multiple Ausrufezeichen zu machen! Zitieren
Filou Geschrieben 28. Juni 2006 Autor Geschrieben 28. Juni 2006 Wenn der Compiler an Parameter 1 herummäkelt, ist es ziemlich egal, wie Parameter 2 aussieht! ich meinte ja auch den ersten parameter. ich habe das Andere geändert, aber immernoch: 'SortItems' : Konvertierung des Parameters 1 von 'int (long,long,long)' in 'int (__stdcall *)(long,long,long)' nicht moeglich Zitieren
Klotzkopp Geschrieben 28. Juni 2006 Geschrieben 28. Juni 2006 'SortItems' : Konvertierung des Parameters 1 von 'int (long,long,long)' in 'int (__stdcall *)(long,long,long)' nicht moeglichUnd wenn du &CPatient::DokumenteVergleichen schreibst? 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.