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

// Value anhand von val prüfen ob in Registry vorhanden - wenn vorhanden dann auslesen und übergeben!
// Problem es kann aml Integer oder mal String sein

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

user profile iconBenBE 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

user profile iconalzaimar 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
user profile iconpacman1986 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: Stringout Result: String); overload;
begin
end;

procedure check_value(Val: Stringout 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

user profile iconhansa 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
user profile icondelphinia 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: Stringvar contents: String): Boolean; overload;
begin
  // liefert True zurück, wenn der Wert namens "val" vorhanden ist, ansonsten False
  // wenn vorhanden, wird der Inhalt von "val" in contents übergeben
end;

function check_value(val: Stringvar 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