Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Funktion soll als Parameter verschiedene Datentypen akzeptieren (https://www.delphipraxis.net/174785-funktion-soll-als-parameter-verschiedene-datentypen-akzeptieren.html)

Tenobaal 9. Mai 2013 19:23

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;

Sir Rufo 9. Mai 2013 19:26

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;

grl 9. Mai 2013 21:07

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
 
Zitat:

Zitat von Tenobaal (Beitrag 1214849)
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

und was für ein Fehler?

Zitat:

Zitat von Tenobaal (Beitrag 1214849)
Delphi-Quellcode:
    VarInteger: Begin
      ptrInteger:=@Value;
      Val(s,ptrInteger^,error);
      ptrInteger:=nil;
      End;

^Integer ist nicht das gleiche wie ein Pointer auf Value.
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:

Zitat von Tenobaal (Beitrag 1214849)
Delphi-Quellcode:
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;

Die Definition von Speichern
Delphi-Quellcode:
function Speichern(s:String; var Value):Integer;
hat aber keinen Parameter für Fehler. Wie soll das gehen?

Gruß
Luggi

Furtbichler 9. Mai 2013 22:52

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
 
In der Deklaration
Delphi-Quellcode:
procedure Foo(Var Bar)
ist 'Bar' kein Variant und deshalb führt die Verwendung in 'varType' zu einem Fehler.

Ändere die Deklaration in
Delphi-Quellcode:
function Speichern(s:String; Value : Variant):Integer;
und Du hast weniger Probleme.

Tenobaal 10. Mai 2013 09:11

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
 
Danke für eure Antworten! Ihr habt mir schon sehr geholfen.

Zitat:

Zitat von grl (Beitrag 1214860)
Die Definition von Speichern
Delphi-Quellcode:
function Speichern(s:String; var Value):Integer;
hat aber keinen Parameter für Fehler. Wie soll das gehen?

Ja, du hast recht. Ich war zu voreilig und hab den Quellcode von der Funktion "Speichern" geändert ohne das Button-Ereignis anzupassen. :roll:

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:
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;
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.
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;

grl 10. Mai 2013 10:15

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
 
Wobei ich das Überladen für die schönere Variante halte...

Luggi

Sir Rufo 10. Mai 2013 10:24

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren
 
Zitat:

Zitat von grl (Beitrag 1214922)
Wobei ich das Überladen für die schönere Variante halte...

Luggi

Fehler bei der Benutzung werden auch schon bei der Compilierung erkannt :)

Der schöne Günther 10. Mai 2013 10:31

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 09:19 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