Auflösungen in ListBox sortieren
-
Hallo,
wie kann ich Auflösungen in einer ListBox sortieren?
IST:
- "1024x768 Pixel, 32 Bit, 70 Hz"
- "1024x768 Pixel, 32 Bit, 60 Hz"
- "1280x1024 Pixel, 32 Bit, 75 Hz"
- "800x600 Pixel, 32 Bit, 80 Hz"SOLL:
- "800x600 Pixel, 32 Bit, 80 Hz"
- "1024x768 Pixel, 32 Bit, 60 Hz"
- "1024x768 Pixel, 32 Bit, 70 Hz"
- "1280x1024 Pixel, 32 Bit, 75 Hz"Wenn ich mit sorted=true arbeite kommt folgendes raus:
- "1024x768 Pixel, 32 Bit, 60 Hz"
- "1024x768 Pixel, 32 Bit, 70 Hz"
- "1280x1024 Pixel, 32 Bit, 75 Hz"
- "800x600 Pixel, 32 Bit, 80 Hz"Kennt jemand dieses Problem? Ich weiß echt nicht mehr weiter.
Bye
Martin
-
Das ist vollkommen korrekt, so wie das sortiert wird. Die '8' kommt nun mal nach der '1'...
Du wirst Dir die Arbeit machen müssen, den String zu verarbeiten und die Reihenfolge selbst zu bestimmen.
-
Das geht leider nicht, weil die Auflösungen dynamisch eingelesen werden, also bei jeder GraKa anders
-
Irgendwie befüllst Du die Listbox doch. Dabei mußt Du - anhand des Strings - selbst festlegen, was an welcher Position eingefügt wird.
-
Ich bin mir nicht ganz sicher - aber kann man bei der Listbox einen eigenen Vergleichsoperator angeben?
-
Der Custom-Sort geht nur bei der TStringList, nicht bei ListBox::TStrings. Außerdem mußt er trotzdem die Vergleichsfunktion schreiben. Ob er nun erst die Daten in eine TStringList schreibt und dort seine Sortierfunktion aufruft, oder ob er beim Einfügen eines Strings in die ListBox prüft, an welcher Stelle er den String einfügt, macht meiner Meinung keinen großen Unterschied.
Ich denke das große Problem ist, dass er nicht weiß, wie er die Strings auswerten soll, um seine Vergleichsfunktion zu schreiben, aber was fertiges gibt es nicht.
-
gib mal sysutils.h ein und drücke F1 (Hilfe). Dort habe ich schon viele Funktionen für das Vergleichen von Strings gefunden. Dann spart man sich eine Menge Schreibarbeit.
-
Joe_M. schrieb:
Ich denke das große Problem ist, dass er nicht weiß, wie er die Strings auswerten soll, um seine Vergleichsfunktion zu schreiben, aber was fertiges gibt es nicht.
Dem Manne kann geholfen werden - mit substr() und find() (wenn Borlands TString da nichts eigenes bietet, bleibt als Alternative std::string oder strtok()) kannst du die einzelnen Bestandteile (Höhe, Breite, Farbtiefe, Frequenz) auseinanderdröseln und anschließend in Ganzzahlen umwandeln.
(zu letzterem gibt es eine ausführliche Erklärung in der C++-FAQ)
-
Im BCB6 gibt es, neben dem std::String noch den AnsiString, hier wären die passenden Funktionen AnsiString::AnsiPos() und AnsiString::SubString() zum aufdröseln des Strings in die Teilbereiche.
Die Hilfe zu AnsiString ist recht gut, einfach mal die Methoden durchsehen, die dort geboten werden.
-
Danke für die schnelle Hilfe, ich denke, dass ich es so machen werde wie CStoll gemeint hat.
Bye
-
Um noch mal sysutils.h anzupreisen (muss nur #included werden, im BCB enthalten!): Die Stringfunktionen gibt es dort auch alle, jedoch noch viele zusätzliche.
-
Methoden der Klasse AnsiString:
~AnsiString AnsiCompare AnsiCompareIC AnsiLastChar AnsiPos AnsiString ByteType c_str cat_printf cat_sprintf cat_vprintf CurrToStr CurrToStrF data Delete FloatToStrF FmtLoadStr Format FormatFloat Insert IntToHex IntToHex IsDelimiter IsEmpty IsLeadByte IsPathDelimiter IsTrailByte LastDelimiter Length LoadStr LoadString LowerCase operator != operator [] operator + operator += operator < operator <= operator = operator == operator > operator >= Pos printf SetLength sprintf StringOfChar SubString ToDouble ToInt ToIntDef Trim TrimLeft TrimRight Unique UpperCase vprintf WideChar WideCharBufSizeLäßt wohl kaum noch Wünsche offen... Auf jeden Fall ist alles dabei, was er braucht. Inklusive wandeln nach int...