Zum Inhalt springen

CListCtrl -> Nach Datum sortiert


Filou

Empfohlene Beiträge

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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];

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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>::*'

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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