Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zuweisung für Enums überladen (https://www.delphipraxis.net/167679-zuweisung-fuer-enums-ueberladen.html)

Codewalker 12. Apr 2012 12:43

Delphi-Version: XE2

Zuweisung für Enums überladen
 
Seit einigen Delphi-Versionen kann man ja Operatoren für eigene Datentypen überladen. Wie genau funktioniert das denn z.B. für Enums. Häufig möchte ich diese konvertieren (z.B. einen repräsentativen String, also nicht genau den Enum-Namen).
Beispiel wäre TFontStyle = (fsBold, fsItalic) und bei der Zuweisung zu einem String soll dann z.B. "fett" und "kursiv" herauskommen. Bisher habe ich immer eine Hilfsfunktion gemacht, die das per Case abhandelt, würde es aber lieber direkt über einen Operator abhandeln.

DeddyH 12. Apr 2012 12:50

AW: Zuweisung für Enums überladen
 
Reicht auch die Billig-Variante?
Delphi-Quellcode:
type
  TMyType = (mtOne, mtTwo, mtThree);

const
  MYTYPENAMES = array[TMyType] of string = ('Eins', 'Zwei', 'Drei');

function TypeAsString(aType: TMyType): string;
begin
  Result := MYTYPENAMES[aType];
end;

Codewalker 12. Apr 2012 12:57

AW: Zuweisung für Enums überladen
 
Naja, nicht wirklich. Jetzt habe ich eine Funktion und dazu noch ein Array und kann die meisten Vorzüge der Überladung nicht nutzen. Ist ja das gleiche nur anders :mrgreen:

DeddyH 12. Apr 2012 12:59

AW: Zuweisung für Enums überladen
 
Einen Versuch war es wert :mrgreen:

himitsu 12. Apr 2012 13:50

AW: Zuweisung für Enums überladen
 
Operatoren gehen nur bei Records.
Record-Methoden (ähnlich wie bei Klassen) gibt es seit D2006 natürlich auch nur für Records.
Class Helper und Record Helper gibt es auch nur für Klassen und Records. (Interfaces weiß ich jetzt nicht)

Einfache Typen und Interfaces fehlen leider noch. :cry:


Die Übersetzungen könnte man über Attribute und die neue RTTI regeln.

s.h.a.r.k 12. Apr 2012 14:26

AW: Zuweisung für Enums überladen
 
@himitsu: Meintest du etwa sowas hier?! :stupid:

himitsu 12. Apr 2012 15:20

AW: Zuweisung für Enums überladen
 
Jupp.

Delphi macht es zwar nicht automatisch, aber selbst kann man es schon machen.

Ich bastel mir grade ein paar Basicunits zusammen, für alle meine Projekte, inklusive eigener Typendefinitionen für Integer und Co.
Dort ist auch 'ne generische Typkonvertierung drin ... da würde sowas perfekt reinpasen. :)

Panthrax 12. Apr 2012 20:50

AW: Zuweisung für Enums überladen
 
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TSomeEnum = (seOne, seTwo, seThree);

  TMyEnum = record
  strict private
    FValue: TSomeEnum;

    class function Translate(const Value: TSomeEnum): String; overload; static;
    class function Translate(const Value: String): TSomeEnum; overload; static;

  public
    class operator Implicit(const Value: String): TMyEnum;
    class operator Implicit(const Value: TMyEnum): String;
    class operator Implicit(const Value: TMyEnum): TSomeEnum;
    class operator Implicit(const Value: TSomeEnum): TMyEnum;
  end;

{ TMyEnum }

class operator TMyEnum.Implicit(const Value: TMyEnum): String;
begin
  Result := Translate(Value.FValue);
end;

class function TMyEnum.Translate(const Value: TSomeEnum): String;
begin
  case Value of
    seOne:
      Result := 'Eins';
    seTwo:
      Result := 'Zwei';
    seThree:
      Result := 'Drei';
  end;
end;

class operator TMyEnum.Implicit(const Value: String): TMyEnum;
begin
  Result.FValue := Translate(Value);
end;

class operator TMyEnum.Implicit(const Value: TSomeEnum): TMyEnum;
begin
  Result.FValue := Value;
end;

class operator TMyEnum.Implicit(const Value: TMyEnum): TSomeEnum;
begin
  Result := Value.FValue;
end;

class function TMyEnum.Translate(const Value: String): TSomeEnum;
begin
  if Value = 'Eins' then
    Result := seOne
  else
  if Value = 'Zwei' then
    Result := seTwo
  else
  if Value = 'Drei' then
    Result := seThree
  else
    raise Exception.Create('Ungültiger Wert.');
end;

var
  MyEnum: TMyEnum;
  SomeEnum: TSomeEnum;
begin
  try
    SomeEnum := seTwo;
    MyEnum := SomeEnum;
    WriteLn('MyEnum: ' + MyEnum);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.
Code:
MyEnum: Zwei


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 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