Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TEdit (1)... Type Conversion (https://www.delphipraxis.net/42267-tedit-1-type-conversion.html)

junale 16. Mär 2005 15:15


TEdit (1)... Type Conversion
 
Hallo,

zwar gibt es Implementierungen von TEdit wie Sand am Meer, aber mich treibt es doch zu einer eigenen Umsetzung. Dazu habe ich einige Fragen (eigentlich sind die meisten genereller Natur).

Umwandlung der Eingabe in Integer/Float (oder andere Formate)...

Wie implementiere ich dies am besten:
* TryStrToInt / TryStrToFloat
* try ... StrToInt / StrToFloat ... except ...
* zeichenweises interpretieren des Textes
oder gar noch andere Ideen?

Das try... except... ist Programmtechnich das komfortabelste, kann ich doch jegliche Typ-Umwandlung damit abfangen und neutrale Werte zurückgeben. Wie verhält sich aus Sicht der Verarbeitungsgeschwindigkeit TryStrToInt im Gegensatz dazu?

Das zeichenweise interpretieren eines Textes gibt mir die größte Flexibilität...
Gibt es hier eine schnelle Möglichkeit den Text gegen die Bereichsgrenzen für Integer/Int64 und die Float-Typen zu testen?

mfg,
Alex

Brüggendiek 16. Mär 2005 21:56

Re: TEdit (1)... Type Conversion
 
Hallo Alex!

Du solltest die Finger von TRY/EXCEPT lassen. Irgendjemand (war es Luckie?) hat mal geschrieben, das sei als fährt man mit Vollgas auf die Kreuzung und wenns kracht war Rot.
Außerdem ist das ein Performance-Killer.

Es gibt mehrere Möglichkeiten:
Man kann die Zeichen bei der Eingabe (OnKeyDown und OnKeyPress) gleich prüfen und Ungültiges vermeiden. Das ist allerdings nicht gesichert gegen Copy&Paste!

Eventuell kan man auch im OnChange war erreichen (Vorsicht: Ändern des Inhaltes im OnChange löst erneut OnChange aus, also temporär abschalten).

Zur Prüfung auf gültige Werte empfehle ich das gute alte Pascal-VAL. Das liefert auch gleich die Stelle, wo es hakt - und muß nicht den Riesenaufwand für einen TRY treiben.

Gruß

Dietmar Brüggendiek

junale 18. Mär 2005 07:27

Re: TEdit (1)... Type Conversion
 
Hallo,

Zitat:

Zitat von Brüggendiek
Zur Prüfung auf gültige Werte empfehle ich das gute alte Pascal-VAL. Das liefert auch gleich die Stelle, wo es hakt - und muß nicht den Riesenaufwand für einen TRY treiben.

Hmm.. Aber wenn ich zum Besipiel nur einen ShortInt zurückgeben will, liefert mir "Val ('128', aShortInt, Code);" als Code 0 und als aShortInt -128 was durch den Überlauf geschieht. Wie kann ich dieses Fehlverhalten umgehen?

mfg,
Alex

bttb930 18. Mär 2005 08:11

Re: TEdit (1)... Type Conversion
 
Zitat:

Zitat von Brüggendiek
Du solltest die Finger von TRY/EXCEPT lassen. Irgendjemand (war es Luckie?) hat mal geschrieben, das sei als fährt man mit Vollgas auf die Kreuzung und wenns kracht war Rot.
Außerdem ist das ein Performance-Killer.

Was ist das denn für ein Schwachsinn?? Try Except ist eine der sinnvollsten Delphi-Erweiterungen der vergangenen Jahre. Und das mit dem Performance-Killer... ist in einem Edit-Feld sowas von uninteressant (wie schnell willst du denn tippen?)

Natürlich ist Try/Except nicht in jeder vorstellbaren Konstellation gut und richtig angewendet, aber die obige Aussage ist einfach komplett daneben.

Brüggendiek 18. Mär 2005 22:09

Re: TEdit (1)... Type Conversion
 
Hallo Alex!

Zitat:

Zitat von junale
Hmm.. Aber wenn ich zum Besipiel nur einen ShortInt zurückgeben will, liefert mir "Val ('128', aShortInt, Code);" als Code 0 und als aShortInt -128 was durch den Überlauf geschieht. Wie kann ich dieses Fehlverhalten umgehen?

Dann lasse das Ganze doch in eine lokale Longint- oder besser Int64-Variable umwandeln.
Danach prüfst Du einfach, ob das größer als High(ShortInt) oder kleiner als Low(ShortInt) ist - wenn ja, war der Wert überschritten! Vorher noch die Länge prüfen, damit der DAU nicht 30mal auf die 9 gehämmert hat - das sprengt nämlich auch einen Int64.

Außerdem ist es ja oft so, daß man einen ShortInt nimmt, weil z.B. nur Werte von -30 bis +95 zugelassen sind - dann brauchst Du die technischen Grenzen ja gar nicht zu prüfen.

Übrigens, die dämliche TRY/EXCEPT-Variante liefert Dir unter den Umständen auch den falschen Wert!
In einem Edit ist das tatsächlich vernachlässigbar mit dem Preformance-Verlust - aber wenn man eine Datendatei mit mehreren 1000 Text-Integern einlesen muß, bremst das doch ganz schön.

Gruß

Dietmar Brüggendiek


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz