AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Untypisierte Konstante übergeben?

Ein Thema von tn249 · begonnen am 2. Nov 2005 · letzter Beitrag vom 2. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von tn249
tn249

Registriert seit: 18. Jan 2004
Ort: München
164 Beiträge
 
Delphi 2005 Personal
 
#1

Untypisierte Konstante übergeben?

  Alt 2. Nov 2005, 15:48
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
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#2

Re: Untypisierte Konstante übergeben?

  Alt 2. Nov 2005, 16:10
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?procedure Foo(Color: TColor; Kind: TKind); Oder... untypisierte Parameter (allerdings müsste die Funktion/Prozedur dann irgendwie erfahren worum es sich handelt...)?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Untypisierte Konstante übergeben?

  Alt 2. Nov 2005, 16:13
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;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Untypisierte Konstante übergeben?

  Alt 2. Nov 2005, 16:14
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von tn249
tn249

Registriert seit: 18. Jan 2004
Ort: München
164 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Untypisierte Konstante übergeben?

  Alt 2. Nov 2005, 16:28
@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:
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
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Untypisierte Konstante übergeben?

  Alt 2. Nov 2005, 16:32
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?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von tn249
tn249

Registriert seit: 18. Jan 2004
Ort: München
164 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Untypisierte Konstante übergeben?

  Alt 2. Nov 2005, 16:33
Zitat von shmia:
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
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von tn249
tn249

Registriert seit: 18. Jan 2004
Ort: München
164 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Untypisierte Konstante übergeben?

  Alt 2. Nov 2005, 16:35
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
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#9

Re: Untypisierte Konstante übergeben?

  Alt 2. Nov 2005, 16:38
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;
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#10

Re: Untypisierte Konstante übergeben?

  Alt 2. Nov 2005, 16:53
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
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:30 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