AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Funktion soll als Parameter verschiedene Datentypen akzeptieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion soll als Parameter verschiedene Datentypen akzeptieren

Ein Thema von Tenobaal · begonnen am 9. Mai 2013 · letzter Beitrag vom 10. Mai 2013
Antwort Antwort
Tenobaal

Registriert seit: 9. Mai 2013
21 Beiträge
 
Delphi XE5 Professional
 
#1

Funktion soll als Parameter verschiedene Datentypen akzeptieren

  Alt 9. Mai 2013, 20:23
Delphi-Version: 5
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.

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;

Geändert von Tenobaal ( 9. Mai 2013 um 20:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren

  Alt 9. Mai 2013, 20:26
Du kannst Funktionen auch überladen

Delphi-Quellcode:
procedure foo( var Value : string ); overload;
procedure foo( var Value : Integer ); overload;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
grl

Registriert seit: 5. Feb 2007
174 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren

  Alt 9. Mai 2013, 22:07
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?

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;
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 function Speichern(s:String; var Value):Integer; hat aber keinen Parameter für Fehler. Wie soll das gehen?

Gruß
Luggi
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren

  Alt 9. Mai 2013, 23:52
In der Deklaration procedure Foo(Var Bar) ist 'Bar' kein Variant und deshalb führt die Verwendung in 'varType' zu einem Fehler.

Ändere die Deklaration in function Speichern(s:String; Value : Variant):Integer; und Du hast weniger Probleme.
  Mit Zitat antworten Zitat
Tenobaal

Registriert seit: 9. Mai 2013
21 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren

  Alt 10. Mai 2013, 10:11
Danke für eure Antworten! Ihr habt mir schon sehr geholfen.

Die Definition von Speichern 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.

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
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;
  Mit Zitat antworten Zitat
grl

Registriert seit: 5. Feb 2007
174 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren

  Alt 10. Mai 2013, 11:15
Wobei ich das Überladen für die schönere Variante halte...

Luggi
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren

  Alt 10. Mai 2013, 11:24
Wobei ich das Überladen für die schönere Variante halte...

Luggi
Fehler bei der Benutzung werden auch schon bei der Compilierung erkannt
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Funktion soll als Parameter verschiedene Datentypen akzeptieren

  Alt 10. Mai 2013, 11:31
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...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 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