Autor Beitrag
delphinia
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

XP Pro Sp2
Delphi 5 Standard
BeitragVerfasst: Mo 25.12.06 20:37 
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


ausblenden 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?

_________________
Gruss Doreen
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 25.12.06 20:46 
Schau Dir mal Variant an ... Ist aber relativ unsauber ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 25.12.06 20:48 
Es hindert Dich keiner dran, 2 Funktionen zu schreiben, die auf den jeweiligen Typ passen.

_________________
Gruß
Hansa
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 25.12.06 21: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',

_________________
Na denn, dann. Bis dann, denn.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 25.12.06 22: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)

_________________
Gruß
Hansa
pacman1986
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 25.12.06 22:05 
Titel: Wie wäre es mit trystrtoint
trystrtoint ist glaube ich das was du suchst
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 25.12.06 22:30 
Titel: Re: Wie wäre es mit trystrtoint
user profile iconpacman1986 hat folgendes geschrieben:
..ist glaube ich das was du suchst


ne. :mrgreen:

_________________
Gruß
Hansa
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 25.12.06 22:35 
Mir fällt da nur so was ein (ist nur bedingt anwendbar auf dein Problem):
ausblenden 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
ausblenden 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 ;)


Zuletzt bearbeitet von delfiphan am Di 26.12.06 00:36, insgesamt 2-mal bearbeitet
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 25.12.06 23: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:
ausblenden 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.

_________________
Na denn, dann. Bis dann, denn.
SirTwist
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 26.12.06 01:58 
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:
ausblenden 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:
ausblenden 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