![]() |
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
|
AW: Parameter mit multiplen Typen
Krass was für eine Auswahl wir mittlerweile in Delphi haben.
-Typloser Buffer -Variant -Varianter Record -TValue aus RTTI (Das sieht mal ultra komvortabel aus) Nur um das noch mal zusammen zu fassen. |
AW: Parameter mit multiplen Typen
:thumb:
Nur dass nicht jemand meint die Liste wäre komplett: es gibt da noch mehr. Zum Beispiel Klasse mit denen man Daten polymorph abbilden kann. Und am Besten noch interfaces dazu. |
AW: Parameter mit multiplen Typen
Meine Klasse sieht (gekürzt) so aus:
Delphi-Quellcode:
Benutzt werden soll die Klasse wie folgt:
TtuString = class(TPersistent)
// ... protected procedure SetText(Value: String); virtual; function UpdateText(AText: String): TtuString; virtual; procedure DoChanged; virtual; public constructor Create(AText: String = ''); reintroduce; overload; virtual; constructor Create(AText: TtuString); reintroduce; overload; virtual; // ... function IsEmpty: Boolean; function IsNotEmpty: Boolean; function Count: Integer; function Length: Integer; // ... function Insert(AText: String; APosition: Integer = 0): TtuString; overload; virtual; // ... function Surround(AText: String): TtuString; overload; virtual; // ... function Replace(ASearchText: String; AReplaceText: String; AReplaceFlags: TReplaceFlags = [rfReplaceAll]): TtuString; overload; virtual; function Replace(ASearchText: TtuString; AReplaceText: TtuString; AReplaceFlags: TReplaceFlags = [rfReplaceAll]): TtuString; overload; virtual; // ... published property OnChanged: TNotifyEvent read FOnChanged write FOnChanged; property Text: String read FText write SetText; end;
Delphi-Quellcode:
Jetzt möchte ich die Klasse so gestalten, dass auch bereits existierende TtuString-Instanzen an die vielen, vielen String-Manipulations-Methoden (wie bei Replace zu sehen ist...) übergeben werden können.
var
Str: TtuString; begin Str := TtuString.Create('Hallo, Welt!'); try // Folgender Aufruf ersetzt zuerst ', Welt!' mit einem Leerstring, // fügt dann ein Ausrufezeichen an und stellt dem neuen String // drei Unterstriche voran bzw. hängt diese auch an... Str.Replace(', Welt!', '').Insert('!').Surround('___'); // Folgendes gibt aus: '___Hallo!___' ShowMessage(Str.Text); finally FreeAndNil(Str); end; end; Ich werde dafür auf die Variante mit TValue von Uwe Raabe zurückgreifen. Ich finde das diese Lösung am ehesten passt. Was meint ihr? TtuString als Record zu definieren und mit diversen "class operator"-Routinen auszustatten, hätte aber auch was... By the way: Für das verschachtelte aufrufen (.Replace().Insert()...) gibt es einen speziellen Namen. Wie genau heißt dieses Schema oder Prinzip? |
AW: Parameter mit multiplen Typen
Zitat:
![]() Bis bald... Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 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