![]() |
Delphi-Version: 5
Funktion soll als Parameter verschiedene Datentypen akzeptieren
Hallo,
ich möchte eine Funktion schreiben, die als Parameter "Value" verschiedene Datentypen (Integer, String, Single, Double) akzeptiert. Die Funktion soll abhängig vom Datentypen von "Value" unterschiedliche Operationen ausführen. Ich habe schon versucht "Value" als Pointer usw. zu deklarieren, aber der Kompiler ließ sich damit nicht austricksen. :wink: Edit: Meine Delphi-Version ist Delphi 2007
Delphi-Quellcode:
function Speichern(s:String; var Value):Integer;
var ptrString:^String; ptrInteger:^Integer; ptrDouble:^Double; ptrSingle:^Single; error:Integer; begin case VarType(Value) of //hier tritt ein Fehler auf VarInteger: Begin ptrInteger:=@Value; Val(s,ptrInteger^,error); ptrInteger:=nil; End; VarSingle: Begin ptrSingle:=@Value; Val(s,ptrSingle^,error); ptrSingle:=nil; End; VarDouble: Begin ptrDouble:=@Value; Val(s,ptrDouble^,error); ptrDouble:=nil; End; VarString: Begin ptrString:=@Value; s:=ptrString^; ptrString:=nil; error:=0; End; Else error:=1; end; result:=error; End; procedure TForm1.Button2Click(Sender: TObject); var a:Double; Fehler:Integer; begin Speichern(Edit1.Text,a,Fehler); //Hier ist a vom Datentyp Double. Prinzipiell sollen aber auch alle der oben erwähnten Datentypen funktionieren. end; |
AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
Du kannst Funktionen auch überladen
Delphi-Quellcode:
procedure foo( var Value : string ); overload;
procedure foo( var Value : Integer ); overload; |
AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
Zitat:
Zitat:
wenn du ein Variant verwendetest in dem ein Integer gespeichert ist, kannst du es einfach einem Integer zuweisen. also:
Delphi-Quellcode:
var iWert:Integer;
if VarType(Value)=varInteger then begin iWert:=Value; end; Zitat:
Delphi-Quellcode:
hat aber keinen Parameter für Fehler. Wie soll das gehen?
function Speichern(s:String; var Value):Integer;
Gruß Luggi |
AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
In der Deklaration
Delphi-Quellcode:
ist 'Bar' kein Variant und deshalb führt die Verwendung in 'varType' zu einem Fehler.
procedure Foo(Var Bar)
Ändere die Deklaration in
Delphi-Quellcode:
und Du hast weniger Probleme.
function Speichern(s:String; Value : Variant):Integer;
|
AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
Danke für eure Antworten! Ihr habt mir schon sehr geholfen.
Zitat:
Wenn ich das richtig Verstanden habe gibt es zwei Ansätze: 1) Mit dem Datentyp Variant arbeiten. Führt aber dazu, dass ich Variablen hin und her kopieren muss :gruebel:
Delphi-Quellcode:
2) Für jeden Datentyp eine eigene Funktion überladen (wusste nicht, dass es möglich ist). Dann nimmt mir der Kompiler die Arbeit ab, sodass keine Typ-Unterscheidung meinerseits nötig ist.
function Speichern(s:String; var Value:Variant):Integer;
var help_int:Integer; begin case VarType(Value) of VarInteger: Begin Val(s,help_int,result); Value:=help_int; End; (* . . . . . *) Else result:=1; end; End; procedure TForm1.Button2Click(Sender: TObject); var a:Integer; aVar:Variant; begin aVar:=a; Speichern(Edit1.Text,aVar); a:=aVar; end;
Delphi-Quellcode:
function Speichern(s:String; var Value:Integer):Integer; overload;
begin Val(s,Value,result); End; function Speichern(s:String; var Value:Double):Integer; overload; begin Val(s,Value,result); End; function Speichern(s:String; var Value:Single):Integer; overload; begin Val(s,Value,result); End; function Speichern(s:String; var Value:String):Integer; overload; begin Value:=s; result:=0; End; procedure TForm1.Button2Click(Sender: TObject); var a:Double; b:Single; c:String; begin Speichern(Edit1.Text,a); Speichern(Edit1.Text,b); Speichern(Edit1.Text,c); end; |
AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
Wobei ich das Überladen für die schönere Variante halte...
Luggi |
AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
Zitat:
|
AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
Und wer weiß, was dieser gruselige Nullzeiger-Typ Variant noch alles für Überraschungen bereitgehalten hätte. Vielleicht ist das aber auch nur meine Paranoia...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz