![]() |
Untypisierte Konstante übergeben?
Hallo,
wahrscheinlich steh ich wie der Ochs vorm Berg, aber auch die Suchfunktion hat mir nicht weitergeholfen; habe mehrere Typen:
Delphi-Quellcode:
und jetzt möchte ich in einer function/procedure sowohl BLUE als auch CAR übergeben können, aber wie mache ich das?
TColor = (BLUE = 1, RED = 2, GREEN = 3);
TKind = (CAR = 1, BIKE = 2); bei variablen kann man ja den Typ weglassen, wenn man dafür ein var oder const schreibt, aber bei Konstanten geht das nicht, weil der compiler wegen 'incompatible types' stoppt. natürlich könnte ich Ord ( BLUE ) oder Ord ( CAR ) übergeben, aber das finde ich nicht elegant, auch wenns für meine Zwecke ausreichen würde. Gruß & Dank im Vorraus Thomas |
Re: Untypisierte Konstante übergeben?
Zitat:
Delphi-Quellcode:
Oder zwei Parameter?
type
TColor = ( Blue = 1, Red = 2, Green = 3 ); TColors = set of TColor; function ColorToStr(Color: TColor): string; begin case Color of Blue : Result := 'Blue'; Red : Result := 'Red'; Green: Result := 'Green'; else Result := '#' + IntToStr(Integer(Color)); end; end; function ColorsToStr(Colors: TColors): string; var Color: TColor; begin Result := ''; for Color := Low(TColor) to High(TColor) do if (Color in Colors) then begin if Length(Result) > 0 then Result := Result + ', '; Result := Result + ColorToStr(Color); end; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(ColorsToStr([Blue, Red])); end;
Delphi-Quellcode:
Oder... untypisierte Parameter (allerdings müsste die Funktion/Prozedur dann irgendwie erfahren worum es sich handelt...)?
procedure Foo(Color: TColor; Kind: TKind);
|
Re: Untypisierte Konstante übergeben?
Du könntest einen Record mit varianten Teile nehmen wenns umbedingt nur ein parameter sein soll:
Delphi-Quellcode:
type
TMyRec = record case MyRectype: Boolean of True: (Color: TColor); False: (Kind: TKind); end; |
Re: Untypisierte Konstante übergeben?
Zitat:
mit TColor oder TKind arbeiten soll. Selbst wenn du hier nur ein fiktives Beispiel gegeben hast, hast du dich in einen falschen Lösungsweg verstrickt. Du musst zurück an den Anfang und die Idee, du bräuchtest eine funktion/procedure mit untypisiertem Parameter, aus deinen Gedanken streichen. |
Re: Untypisierte Konstante übergeben?
@NicoDE: ich habe den Zusammenhang zu meinem Problem nicht verstanden.
Ich schildere mein Problem nochmal konkreter; Habe mir eine Klasse von TMemoryStream abgeleitet. Diese abgeleitete Klasse soll eine Methode bekommen die folgendes macht:
Delphi-Quellcode:
also den Wert diese Dingens (wie nennt man das korrekt?) in den Stream schreiben.
Stream.WriteBuffer( Ord( AValue ), SizeOf( Ord ( AValue ) ) );
Jetzt kann ich natürlich
Delphi-Quellcode:
schreiben
procedure TMyStream.WriteDingens( var AValue );
[..] MyStream.WriteDingens( Ord ( BLUE ) ); ich hätte aber lieber sowas:
Delphi-Quellcode:
ich hab nicht so wirklich ahnung ob das ganze sinn macht, belehrt mich eines besseren, wenns ne klügere art gibt das zu erledigen.
procedure TMyStream.WriteDingens( ?? AValue ?? );
[..] MyStream.WriteDingens( BLUE ); Gruß Thomas |
Re: Untypisierte Konstante übergeben?
Zitat:
|
Re: Untypisierte Konstante übergeben?
Zitat:
aber evtl gibts ja ne möglichkeit ?! Danke schonmal an euch Thomas |
Re: Untypisierte Konstante übergeben?
Zitat:
Gruß Thomas |
Re: Untypisierte Konstante übergeben?
Zitat:
Eine Möglichkeit wären überladene Funktionen:
Delphi-Quellcode:
procedure Foo(Color: TColor); overload;
begin // end; procedure Foo(Kind: TKind); overload; begin // end; procedure TForm1.Button1Click(Sender: TObject); begin Foo(Blue); Foo(Car); end; |
Re: Untypisierte Konstante übergeben?
Hi,
eine weitere Alternative, die am Anfang nach recht viel Overhead aussieht, wäre die Benutzung von Interfaces oder einer abstrakten Basisklasse. Darin deklarierst du etwas wie
Delphi-Quellcode:
Nun musst du natürlich deine types in einem Wrapper verpacken, der einerseits einen Wert speichert (wie ne Variable halt) und andererseits von dieser abstrakten Klasse (dem Interface) "erbt" (" " wegen erben bei Interface). Na ja, dann kannst du Methoden benutzen, die als Parameter etwas vom Typ <WrapperKlasse> bekommen und auf ihren ordinalen Wert mittels getOrdinalValue zugreifen. Wenn du jetzt spezielle Eigenschaften willst (z.B. willst du wissen ob es ein TColor ist) kannst du das mit dem "is" Operator prüfen und explizit casten.
function getOrdinalValue : Integer
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 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