Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Untypisierte Konstante übergeben? (https://www.delphipraxis.net/56226-untypisierte-konstante-uebergeben.html)

tn249 2. Nov 2005 14:48


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:
TColor = (BLUE = 1, RED = 2, GREEN = 3);
TKind = (CAR = 1, BIKE = 2);
und jetzt möchte ich in einer function/procedure sowohl BLUE als auch CAR übergeben können, aber wie mache ich das?

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

NicoDE 2. Nov 2005 15:10

Re: Untypisierte Konstante übergeben?
 
Zitat:

Zitat von tn249
und jetzt möchte ich in einer function/procedure sowohl BLUE als auch CAR übergeben können, aber wie mache ich das?

Meinst du Sets?
Delphi-Quellcode:
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;
Oder zwei Parameter?
Delphi-Quellcode:
procedure Foo(Color: TColor; Kind: TKind);
Oder... untypisierte Parameter (allerdings müsste die Funktion/Prozedur dann irgendwie erfahren worum es sich handelt...)?

Bernhard Geyer 2. Nov 2005 15:13

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;

shmia 2. Nov 2005 15:14

Re: Untypisierte Konstante übergeben?
 
Zitat:

Zitat von tn249
und jetzt möchte ich in einer function/procedure sowohl BLUE als auch CAR übergeben können, aber wie mache ich das?

Das macht aber softwaretechnisch keinen Sinn, da die function/procedure nicht weiss, ob sie jetzt
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.

tn249 2. Nov 2005 15:28

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:
Stream.WriteBuffer( Ord( AValue ), SizeOf( Ord ( AValue ) ) );
also den Wert diese Dingens (wie nennt man das korrekt?) in den Stream schreiben.

Jetzt kann ich natürlich
Delphi-Quellcode:
procedure TMyStream.WriteDingens( var AValue );
[..]
MyStream.WriteDingens( Ord ( BLUE ) );
schreiben

ich hätte aber lieber sowas:
Delphi-Quellcode:
procedure TMyStream.WriteDingens( ?? AValue ?? );
[..]
MyStream.WriteDingens( BLUE );
ich hab nicht so wirklich ahnung ob das ganze sinn macht, belehrt mich eines besseren, wenns ne klügere art gibt das zu erledigen.

Gruß
Thomas

Bernhard Geyer 2. Nov 2005 15:32

Re: Untypisierte Konstante übergeben?
 
Zitat:

Zitat von tn249
also den Wert diese Dingens (wie nennt man das korrekt?) in den Stream schreiben.

Jetzt kann ich natürlich
Delphi-Quellcode:
procedure TMyStream.WriteDingens( var AValue );
[..]
MyStream.WriteDingens( Ord ( BLUE ) );
schreiben

ich hätte aber lieber sowas:
Delphi-Quellcode:
procedure TMyStream.WriteDingens( ?? AValue ?? );
[..]
MyStream.WriteDingens( BLUE );

Und wie soll beim Auslesen erkannt werden das es sich um TColor und nicht um TKind handelt?

tn249 2. Nov 2005 15:33

Re: Untypisierte Konstante übergeben?
 
Zitat:

Zitat von shmia
Zitat:

Zitat von tn249
und jetzt möchte ich in einer function/procedure sowohl BLUE als auch CAR übergeben können, aber wie mache ich das?

Das macht aber softwaretechnisch keinen Sinn, da die function/procedure nicht weiss, ob sie jetzt
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.

ich sehe schon auch dass es wenig sinn machen würde, wenn nicht der wert dahinter das einzig interessante für mich wäre.
aber evtl gibts ja ne möglichkeit ?!

Danke schonmal an euch
Thomas

tn249 2. Nov 2005 15:35

Re: Untypisierte Konstante übergeben?
 
Zitat:

Zitat von Bernhard Geyer
Und wie soll beim Auslesen erkannt werden das es sich um TColor und nicht um TKind handelt?

die reihenfolge und anzahl der typen ist festgelegt

Gruß
Thomas

NicoDE 2. Nov 2005 15:38

Re: Untypisierte Konstante übergeben?
 
Zitat:

Zitat von tn249
ich habe den Zusammenhang zu meinem Problem nicht verstanden.

Ich habe mich beim Lesen der Frage auch ziemlich blöd angestellt, sorry :)

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;

Der_Unwissende 2. Nov 2005 15:53

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:
function getOrdinalValue : Integer
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr.
Seite 1 von 2  1 2      

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