![]() |
Delphi-Version: 11 Alexandria
Parameter mit multiplen Typen
Hallo,
ich würde gerne wissen ob es eine Möglichkeit gibt, einen Parameter einer Routine mit mehreren Daten-Typen auszustatten? Die einzige Option die mir einfällt, wäre, die Routine zu überladen. In PHP kann man z. B. so etwas machen:
Code:
Bei dieser Funktion könnte man nun entweder einen String oder einen Boolean-Wert für "AParam1" übergeben. Gibt es so etwas wie diesen |-Operator auch in Delphi? Oder muss ich das zwangsläufig wie folgt angehen:
function Test(string|bool $AParam1) {
// ... }
Delphi-Quellcode:
Oder seht ihr noch andere Möglichkeiten?
function Test(AParam1: String): String; overload;
function Test(AParam1: Boolean): String; overload; Schöne Grüße, Andreas Lauß |
AW: Parameter mit multiplen Typen
wie wäre es mit einem TObject?
Delphi-Quellcode:
natürlich mehr Aufwand alle Klassen anzulegen etc...
function Test(AParam1: TObject): String;
begin if AParam1 is TOBJ1 then begin // end; if AParam1 is TOBJ2 then begin // end; end; |
AW: Parameter mit multiplen Typen
Du kannst einen typlosen paramater verwenden
siehe dazu die Move Prozedur.
Delphi-Quellcode:
_
procedure Move(const Source; var Dest; Count: Integer);
Oder TStream read Methode
Delphi-Quellcode:
Du bekommst dann ein Stückspeicher, aber du musst dich vollständig selbst darum kümmern wie du es behandelst.... wenn du es nur verschlüsseln oder bewegen willst es aber ideal.
function TStream.Read(var Buffer; Count: Longint): Longint;
Dann gäbe es noch den Variant typ als paramaeter. Da kann man quasi alles übergeben. Siehe die Locate Methode von TDataset
Delphi-Quellcode:
_
function TFDDataSet.Locate(const AKeyFields: string; const AKeyValues: Variant; AOptions: TLocateOptions = []): Boolean;
Wenn du die Auswahl an möglichen Typen kennst, dann kannst du eventuell auch mit einem Varianten Record arbeiten.
Delphi-Quellcode:
type
TFahrzeugList = (Irgendeins, PKW, LKW, Bus, Motorad, Zug); TFahrzeug = record case Fahrzeug: TFahrzeugList of PKW: (MaxSpeed: Integer; Cabrio:Boolean; DieselFuel:Boolean; ); LKW: (MaxTonage: Single; Trailer:Boolean; ); Bus: (Travelers:Integer; Toilet:Boolean; ); Motorad: (Speed: integer; Sidecar:Boolean; HP:integer; ); Zug: (Passengers:integer; Cars:integer; Cargolist:Tstringlist; ); Irgendeins: (); end; |
AW: Parameter mit multiplen Typen
Was genau spricht denn gegen das overload?
|
AW: Parameter mit multiplen Typen
Danke für eure Antworten :)
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Parameter mit multiplen Typen
Zitat:
Wäre es dann eine Option, jeweils nur die TtuString-Variante zu implementieren, und die andere über ein temporäres tuString-Objekt zu realisieren? Also
Delphi-Quellcode:
ggf. mit optionalem Boolean-Parameter "AutoFree" bei TuWas, damit das temporäre String-Objekt direkt zerstört werden kann?
TuWas(CreateTmpTuString(einString));
|
AW: Parameter mit multiplen Typen
Zitat:
Delphi-Quellcode:
und
String
Delphi-Quellcode:
(wie ist der Typ überhaupt deklariert)? Insbesondere wäre interessant, wie sich die Implementierung für diese beiden Typen unterscheidet.
TtuString
|
AW: Parameter mit multiplen Typen
Um das mal abzukürzen: Nimm einfach
Delphi-Quellcode:
aus System.RTTI für den Parameter-Typ.
TValue
Delphi-Quellcode:
procedure DoIt(Param: TValue);
begin if Param.IsType<string> then ShowMessage(Param.AsString) else if Param.IsType<TForm> then ShowMessage(Param.AsType<TForm>.Caption); end; ... procedure TForm831.FormDblClick(Sender: TObject); begin DoIt('string'); DoIt(Self); end; |
AW: Parameter mit multiplen Typen
Falls TtuString eine spezielle Art von String ist, könnte man ihn als enhanced Record mit einer implicit-Methode für Umwandlung aus String implementieren. Dann muss man nur den TtuString Parameter haben, weil ein string automatisch in einen TtuString umgewandelt würde.
|
AW: Parameter mit multiplen Typen
Zitat:
Delphi-Quellcode:
eine Klasse:
TtuString
Zitat:
Zitat:
Delphi-Quellcode:
vorgeschlagen habe.
TValue
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 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