Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

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

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

Geschrieben

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.

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

Geschrieben

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

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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]

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