aLeXanDer.. Geschrieben 5. Februar 2008 Geschrieben 5. Februar 2008 Hallo, Ich habe folgendes Anliegen. Ich habe ein StringGrid in das ich jetzt z.B Weckzeiten einlese. Habe dann die Spalten Aktiv: Datum: Tag: Zeit: Bemerkung: Meine Idee wäre es , das das Programm am Anfang das StrinGrid befüllt und dann sortiert. Welcher Termin der nächste ist. Habe mit TDateTime gearbeitet. Ich bin soweit das ich erst Abfrage ob es aktiv ist, dann ob es ein festes Datum ist oder ob es Wöchentlich ist( ist einstellbar) dann frage ich obs ein fester Tag ist(Montag,Dienstag, ect...) oder obs es Täglich ist und dann lass ich die eingetragene Zeit - die jetzige Zeit rechnen und dann sollte der kleinste Wert in der obersten Zeile stehen dann der 2. kleinste... usw. Nur woher weiß ich dann aus welcher Reihe ich den kleinsten Wert habe? Ich habe in google schon ein paar Routinen gefunden wie BubbleSort usw. ja und ich bin zu dumm sie zu benutzen..kann ja sein, aber bei mir funktionieren sie nicht... HAt jemand noch andere Vorschläge?Ideen? Vielen Dank Alex Zitieren
Klotzkopp Geschrieben 5. Februar 2008 Geschrieben 5. Februar 2008 Normalerweise brauchst du zum Sortieren zwei Dinge: Die Möglichkeit, zwei Einträge zu vergleichen und zu entscheiden, welcher weiter oben stehen soll. Wie dieser Vergleich aussieht, musst du entscheiden.Die Möglichkeit, zwei Einträge zu vertauschen. Das musst du nicht direkt in deinem Steuerelement machen, du kannst die Daten vorher auch in einen passenden Container kopieren, oder nur die Indizes sortieren. Wenn du diese beiden Funktion hast, kannst du praktisch jeden Sortieralgorithmus auf deine Daten anwenden. Wenn du die Daten in einen Container der C++-Standardbibliothek packst, kannst du sogar direkt std::sort benutzen. aber bei mir funktionieren sie nicht... Siehe dazu meine Signatur. Zitieren
aLeXanDer.. Geschrieben 6. Februar 2008 Autor Geschrieben 6. Februar 2008 Konnt es nicht anders beschreiben als mit "Funktioniert nicht" =) Bin auf deinen Vorschlag eingegangen. Ich lade die Daten in eine StringList und zwar nur die Zeiten, die auch den aktuellen Tag betreffen. und mit ->Sort sotier ich dann die abgespeicherten Zeiten in der StringList. Ziel ist es , das die nächste Weckzeit an erster Stelle steht. Da dann nur diese Zeit beobachtet wird, bis das Ereigniss eintritt. Mein Problem ist jetzt. Es wird ja immer normal sotiert. Sprich : 13:37 14:55 17:43 Nur wenn es jetzt 14:10 ist, sollte 14:55 an erster Stelle stehen und nicht 13:37. Folglich bräuchte ich das Sortieren anhand des Kriteriums der jetzigen Uhrzeit. Frage: Muss man es berechnen und dann danach sotieren lassen oder gibt es etwas, das selbst anhand eines angegeben Kriteriums sortiert? (CustomSort) Danke Alex Zitieren
Klotzkopp Geschrieben 6. Februar 2008 Geschrieben 6. Februar 2008 Ich lade die Daten in eine StringList und zwar nur die Zeiten, die auch den aktuellen Tag betreffen. und mit ->Sort sotier ich dann die abgespeicherten Zeiten in der StringList.Irgendeine Klasse hat da also eine Sort-Methode? Wie sieht die genau aus? Folglich bräuchte ich das Sortieren anhand des Kriteriums der jetzigen Uhrzeit. Frage: Muss man es berechnen und dann danach sotieren lassen oder gibt es etwas, das selbst anhand eines angegeben Kriteriums sortiert?Möglicherweise kann man bei der Sort-Methode, die du da benutzt, ein eigenes Sortierprädikat angeben. Ich kenne die Methode nicht, diese Information müsstest du in der Dokumentation nachlesen. Wenn das nicht geht, musst du entweder von Hand sortieren, oder, wie bereits gesagt, die Daten in einen Container kopieren, mit dem std::sort zurechtkommt. Zitieren
aLeXanDer.. Geschrieben 6. Februar 2008 Autor Geschrieben 6. Februar 2008 Ich nutze bis jetzt,die Standartvorgegebene Eigenschaft StringList->Sort(); Jedoch sortiert sie absteigend anhand der Zahlenwerte z.B. Man hat " 3, 6 , 1, 9" würde diese Methode einfach 1 , 3 ,6 ,9 sotieren ohne Bezug einfach nach nummerischen Werten. Es gibt noch die CustomSort-Methode, die Beschreibung ist jedoch für mich nicht ganz begreifend. Vielleicht hatte jemand ja schon damit zu tun. Zitieren
Klotzkopp Geschrieben 6. Februar 2008 Geschrieben 6. Februar 2008 Es gibt noch die CustomSort-Methode, die Beschreibung ist jedoch für mich nicht ganz begreifend. Vielleicht hatte jemand ja schon damit zu tun.Oder du verrätst mal, zu welcher Klasse das ganze gehört, oder verweist auf eine Online-Doku, falls es eine gibt. Es riecht irgendwie nach Borland. Zitieren
aLeXanDer.. Geschrieben 6. Februar 2008 Autor Geschrieben 6. Februar 2008 Du hast eine gute Nase Die Methode CustomSort sortiert die Strings in der Liste in der festgelegten Reihenfolge. typedef int (CALLBACK *TStringListSortCompare)(TStringList List, int Index1, int Index2); virtual void __fastcall CustomSort (TStringListSortCompare Compare); Beschreibung Mit CustomSort werden die Strings in der Liste sortiert, wobei die Sortierungsreihenfolge im Parameter Compare definiert wird. Die Compare-Funktion vergleicht anhand eines angegebenen Wertes zwei Strings in der String-Liste. Der Parameter List stellt den Zugriff auf die String-Liste bereit. Die Parameter Index1 und Index2 legen die zu vergleichenden Strings fest und werden als Indizes des Eigenschafts-Arrays Strings verwendet. Die Funktion Compare liefert einen Wert kleiner als 0, wenn sich der in Index1 angegebene String vor dem in Index2 angegebenen befindet. 0, wenn beide Strings identisch sind. einen Wert größer als 0, wenn sich der in Index1 angegebene String nach dem in Index2 angegebenen befindet. Übergeben Sie im Parameter Compare keinen NULL-Wert. Hinweis Die Methode CustomSort muß explizit aufgerufen werden. Wenn nur die Eigenschaft Sorted gesetzt wird, werden die Strings nach der ANSI-Reihenfolge sortiert (gemäß der Implementierung in der Methode Sort). Zitieren
Klotzkopp Geschrieben 7. Februar 2008 Geschrieben 7. Februar 2008 typedef int (CALLBACK *TStringListSortCompare)(TStringList List, int Index1, int Index2); Na dann ist doch alles klar, oder? Du musst eine Funktion schreiben, die so aussieht: int CALLBACK NameIstEgal(TStringList list, int index1, int index2) { // Hier den richtigen Wert zurückgeben, je nachdem, // ob index1 oder index2 nach oben soll. }[/code] Dann kannst du CustomSort mit einem Zeiger auf diese Funktion aufrufen. Zitieren
aLeXanDer.. Geschrieben 7. Februar 2008 Autor Geschrieben 7. Februar 2008 Habs gestern dann noch anders gelöst gehabt. Erst sortiert, mit eben diesem ->Sort(); und dann prüf ich den ersten Wert darauf, ob er kleiner als die aktuelle Zeit ist. Wenn sie kleiner ist, dann lösch ich sie aus der StringListe und prüf die nächste Zeit. Wenn keine Einträge mehr drin sind weil alle Zeiten kleiner sind als die Uhrzeit Wird die StringListe wieder mit den Werten aus dem StringGrid gefüllt. Also ist mit 2 if-Abfragen und 3 Zeilen in den Abfragen gelöst. Sollte nicht zu unsauber sein. Aber die CSort ist aufjedenfall ne Alternative Danke für die CSort Erklärung. Ich probiers aus aufjedenfall auch aus. Alex Zitieren
d.uNd.eE Geschrieben 14. Februar 2008 Geschrieben 14. Februar 2008 Könntest auch n bool "erledigt/vorbei" einfügen erledigt könntest du so implementieren, dass sobald der Nutzer bei einem Termin in der Vergangenheit diesen Termin nicht als "erledigt" gemarkt hat, er immer als erster steht wenn das Flag gesetzt ist wird der "Termin" einfach von der Überprüfung des nächsten Termins indiziert. Nur so ne idee Zitieren
aLeXanDer.. Geschrieben 14. Februar 2008 Autor Geschrieben 14. Februar 2008 Du meinst in das StringGrid nen Bool-Wert noch einfügen? und dann nach dem Sortieren lassen. Ja ist ne Idee, aber das StringGrid habe ich jetzt dann überhaupt nicht angefasst, sortiere nur intern in einer StringList Zitieren
d.uNd.eE Geschrieben 14. Februar 2008 Geschrieben 14. Februar 2008 Naja, müsstest dir dann schon ne eigene Struktur aufbauen, aber das ist ja eh nicht falsch, so wie ich as jetzt grade sehe. Kannst dabei natürlich die bereits vorhandene einfach kopieren und erweitern Zitieren
d.uNd.eE Geschrieben 14. Februar 2008 Geschrieben 14. Februar 2008 Beispiel: vector<*Termin> NochAusstehendeTermine; vector<*Termin> ErledigteTermine; vector<*Termin> AlleTermine; class Termin { bool erledigt; string Name; vector<string> Teilnehmer; string Bemerkung; timedate datum; //weiss ned, ob die klasse so heisst, gibt aber auf jeden Fall eine, die Datumsangaben speichern kann };[/PHP] 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.