UnicodeString überprüfen - unnötiges Typecasting vermeiden



  • Guten Morgen zusammen,

    ich habe nochmal eine Frage bezüglich C++ Builder.

    Ich habe C++ gelernt mit dem gcc bzw g++ Compiler.
    Dort habe ich nie wirklich über den Tellerrand schauen können, was die Thematik Strings angeht. Da lief alles mit normalen Strings 😉

    Nun bin ich beim C++ Builder gelandet und habe folgende Problem/Fragestellung:

    Ich möchte aus einem TEdit Feld einen Wert auslesen, und diesen überprüfen ob ein Komma oder Dezimalpunkt vorhanden ist. Sofern ein Dezimalpunkt vorhanden ist, soll an dieser Stelle ein Komma stattdessen eingefügt werden.

    Ich habe das soweit hinbekommen, jedoch mit vielen Typcastern.

    Für das Auslesen und temporäre Abspeichern wird ein UnicodeString erwartet.
    Meine Funktion zum Überprüfen ob ein Komma oder Dezimalpunkt vorhanden ist, erwartet als Übergabeparameter einen std::string und gibt auch einen solchen zurück.

    Der zurückgegebene String muss anschließend wieder in UnicodeString gecastet und zurück ins TEdit Feld geschrieben werden.

    Meine Frage:
    Geht das ganze nicht eleganter?
    Z.B. mit einem ActionEvent der bei einem KeyDown überprüft ob ein Dezimalpunkt eingegeben wurde und stattdessen ein Komma schreibt?

    Oder die Funktion zum Überprüfen des Strings als Rückgabewert und Übergabeparameter vom Typ UnicodeString erstellen?

    Danke und Gruß

    // Edit:

    Bzw. ist es möglich auch ein ganzes Objekt (hier TEdit) einer Funktion zu übergeben, sodass das Typecasting in der ausgelagerten Funktion gemacht werden kann?



  • Im Zusammenhang mit Strings gibt es viele Wege. Am Besten Du zeigst mal ein Beispiel. Ansonsten gibt es die Möglichkeit (je nach Komponente) die Eingabe mit valid Char einzugrenzen, bzw. in der Ereignisbehandlung OnChange auf die Eingabe des Anwenders Einfluss zu nehmen.



  • Wie würde eine Implementierung mittels OnChange aussehen?
    Bietet mir diese Methode einen eingegebenen Dezimalpunk in ein Komma zu wechseln?



  • Könntest auch OnKeyPress dafür verwenden. Wenn als Key ein '.' übergeben wurde, weißt du dann einfach das ',' zu, zb so (ungetestet):

    void __fastcall TForm1::Edit1KeyPress(TObject *Sender, System::WideChar &Key)
    {
      if (Key == '.') Key = ',';
    }
    


  • Hi,

    da das eine der wirklich grundlegenden Anforderungen in Programmen ist, würde ich das nicht explizit aufrufen.
    Wesentlich besser ist es, sich dafür entsprechende Komponenten von TEdit abzuleiten, die man dann blos noch auf das Formular drauf zieht.
    Ich habe mir schon damals zu FORTRAN IV Zeiten und auch danach in Turbo-C entsprechende eigene Zeileneditoren gebaut, und das dann bei Borlands Delphi und C++ auch gleich nachgeholt. Daabei kann man dann auch gleich noch ein wenig zusätzliche Funktionalität unterbringen. Zum einen Zugriffs- und Konvertierugspropertys, asInteger, asFloat..., automatisches Runden auf eine entsprechende Stellenzahl sowie auch einen einfachen Taschenrechner der bei Zahlenfeldern über ? Aufgerufen werd und das Ergebnis gleich einsetzt.Die Möglichkeiten sind da vielfältig. Ich hab mir jeweils für Ganzzahlen, Gleitkomma und Jahreseingaben (automatische Vervollständigung auf 4 Stellen) jeweils eine Version von TEdit und TDbEdit abgeleitet. Das vereinfacht vieles.
    Da die VCL in Delphi geschrieben ist, empfiehlt es sich, die eigenen Komponenten auch in Delphi zu schreiben. In C++ gehts natürlich genau so gut.
    Wichtig erscheint mir aber, nicht die Zeichen für Punkt und Komma zu nehmen, sondern die entsprechenden symbolischen Konstanten. Sind glaube ich decimalseparator und thousandseparator...
    Da ich davon ausgehe, daß du noch Anfänger bist ist das eine gute Übung und der erste Schitt zu einer eigenen "Werkzeugkiste".

    Gruß Mümmel



  • und ich würde niemals dem Nutzer die Zeichen unterm Hintern austauschen. Wenn jemand einen Punkt eintippte und automatisch ein Komma draus gemacht würde würde ich mich wundern. Klar, es gibt Programme die genau das machen (Windows Taschenrechner). Ich finde das aber schlecht.
    ich habe mir für diesen Fall eine eigene Edit-Komponente von TEdit abgeleitet die Zahlenprüfung vornimmt aber auch bereichsüberprüfung und Zahlenformatierung erlaubt. Ungültige Zahlen werden mit hellroter Hintergrundfarbe und passenden Tooltip bestraft.
    Ich lasse dann lieber den Dialog darauf reagieren. Wenn ein Edit ungültig ist gibts halt kein Ok sondern nur noch Abbrechen.



  • Hi Braunstein,

    Bei der Massendateneingabe durch ein richtigea Datenschwein nerft das nur. Die wollen einfach nur tippen wie ne Wildsau und erwarten daß das Programm mitdenkt.

    Gruß Mümmel



  • Letztendlich entscheidet m.E. der Kunde, wie er das haben will. Bei meinen letzten Projekt z.B. wollte er, das bei der Eingabe einer IP-Adresse auch nur die Zeichen 0-9 und der Punkt erlaubt sein sollen, alle anderen Zeichen sollen gar nicht erst angenommen werden, auch kein Beep oder ähnliches soll darauf hinweisen.

    Just my 2 Cents äh Kunde. 😃 😃



  • Eine weitere Möglichkeit wäre per DecimalSeperator den verwendeten Separator für alle Edits festzulegen



  • Eine weitere Möglichkeit wäre per DecimalSeperator den verwendeten Separator für alle Edits festzulegen


Log in to reply