Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - String oder Integer - ich habe beides
delphinia - Mo 25.12.06 19:37
Titel: String oder Integer - ich habe beides
Moin,
erstmal sorry für diesen Titel aber anderes wusste ich mein Problem nicht zu beschreiben.
Ich möchte ne Funktion haben, die wie folgt aussehen soll
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| function check_value(val:String); Begin
also kann ich nicht "function check_value(val:String) :Integer;" schreiben wenn es nen String ist! end; |
Wer hat eine Lösung für mich?
BenBE - Mo 25.12.06 19:46
Schau Dir mal Variant an ... Ist aber relativ unsauber ...
hansa - Mo 25.12.06 19:48
Es hindert Dich keiner dran, 2 Funktionen zu schreiben, die auf den jeweiligen Typ passen.
alzaimar - Mo 25.12.06 20:55
BenBE hat folgendes geschrieben: |
| Schau Dir mal Variant an ... Ist aber relativ unsauber ... |
Ich verstehe das nicht. Was ist daran unsauber? Overhead, ok. Etwas langsamer, auch. Aber unsauber? :gruebel:
Variants sollten immer dann (und eigentlich auch nur dann) verwendet werden, wenn der konkrete Datentyp zur Entwurfszeit nicht festlegt, aber dann sind sie einfach sehr sauber, sehr praktisch und sehr schnell (schneller als andere Lösungen).
Hinter Variants verbirgt sich doch nur ein (ok, der ist häßlich) variant record, aber Delphi macht uns doch das Leben leicht und kapselt das hinter dem Datentyp 'Variant',
hansa - Mo 25.12.06 21:03
alzaimar hat folgendes geschrieben: |
| ...das Leben leicht und kapselt das hinter dem Datentyp 'Variant', |
Das ist ja gerade das "unsaubere". :mrgreen: Sieht auch nicht danach aus, dass der Datentyp unbekannt wäre. Ergo -> Finger weg davon. Macht eventuell viel Ärger. 8)
pacman1986 - Mo 25.12.06 21:05
Titel: Wie wäre es mit trystrtoint
trystrtoint ist glaube ich das was du suchst
hansa - Mo 25.12.06 21:30
Titel: Re: Wie wäre es mit trystrtoint
pacman1986 hat folgendes geschrieben: |
| ..ist glaube ich das was du suchst |
ne. :mrgreen:
delfiphan - Mo 25.12.06 21:35
Mir fällt da nur so was ein (ist nur bedingt anwendbar auf dein Problem):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure check_value(Val: String; out Result: String); overload; begin end;
procedure check_value(Val: String; out Result: Integer); overload; begin end; |
oder
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| function check_value(Val: String): Boolean; overload; begin end;
function check_value(Val: Integer): Boolean; overload; begin end; |
Weiss nicht genau was du genau brauchst...
Aber wieso möchtest du das unbedingt in eine Funktion kapseln?
Vielleicht wäre es gut den Rest des Codes etwas besser zu gestalten ;)
alzaimar - Mo 25.12.06 22:05
hansa hat folgendes geschrieben: |
| ..Finger weg davon. Macht eventuell viel Ärger. 8) |
Nö, macht keinen Ärger (man muss nur wissen, was man tut :mrgreen:) , deshalb:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Function CheckValue (Const aStringOrIntValue : Variant) : Integer; Begin If VarType (aStringOrIntValue) in [varByte, varWord, varInteger] Then ... Prüfen auf Integer-Schlüssel else If VarType (aStringOrIntValue) in [varString, varWideString] Then ... Prüfen auf String-Schlüssel else Raise Exception.Create('Ungültiger Datentyp im Aufruf') End; |
Leute, Eure Vorurteile gegen Variants sind fast so merkwürdig wir die gegen Stringlisten, na ja: Jedem das Seine.
SirTwist - Di 26.12.06 00:58
Titel: Re: String oder Integer - ich habe beides
delphinia hat folgendes geschrieben: |
| Wer hat eine Lösung für mich? |
Hm, die anderen Beiträge gehen eher in die Richtung, als ob der Übergabeparameter "val" variabel zu sein hat. Ich hatte Dich eher so verstanden, dass der Rückgabewert variabel sein soll, oder?
also bleiben Dir nur zwei Möglichkeiten: entweder eine überladene Funktion, bei der der Rückgabewert als "var"-Parameter übergeben wird oder zwei unterschiedliche Funktionsnamen. Eigentlich läuft beides aufs Gleiche hinaus.
Möglichkeit 1:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function check_value(val: String; var contents: String): Boolean; overload; begin end;
function check_value(val: String; var contents: Integer): Boolean; overload; var s: String; begin result := check_value(val, s); result := result and TryStrToInt(s, contents); end; |
Möglichkeit 2:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function check_value_str(val: String): String; begin ... end;
function check_value_int(val: String): Integer; begin result := StrToIntDef(check_value_str(val), -1); end; |
Wobei ich bei der zweiten Möglichkeit auf jeden Fall noch Default-Werte einbauen würde, um zu erkennen, ob der Wert vorhanden war oder nicht. Aber eigentlich gefällt mir vom stilistischen und so die Möglichkeit 1 ganz gut :)
Ich hoffe, das passt mehr zu Deinem Problem.
Gruß,
SirTwist
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!