Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

StringGrid sortieren

Empfohlene Antworten

Veröffentlicht

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

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

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

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.

  • Autor

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.

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

  • Autor

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

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.

  • Autor

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

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

  • Autor

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

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

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]

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.