Hallo Uwe,
ja dankesehr für die Erleuchtung, dann muss ich das Helper.forwarding wohl vergessen.
@Der schöne Günther,
Ok, das muss ich dann wohl so ähnlich machen.
Ich arbeite bevorzugt mit Enums, weil die sich im Gegensatz zu Konstanten "automatisch" richtig verhalten in den meisten Fällen, und super leicht erweiterbar sind.
Solche Enums ersetzen bei mir fast alle "Magic-Numbers".
Mit dem einbau in Records: Meinst du das Beste aus beiden Welten (enum/record-class) zu kombinieren ?
So in etwa:
Delphi-Quellcode:
type
TTest_Record_Level2 =
record
public
type
TEnum = (COneHundret = 1, CTwoHundret, CThreeHundret);
public
class function OneHundret : TTest_Record_Level2.TEnum;
{inline;} static;
// inline needs Base unit
class function TwoHundret : TTest_Record_Level2.TEnum;
{inline;} static;
class function ThreHundret : TTest_Record_Level2.TEnum;
{inline;} static;
class function ToInteger(
const AEnum : TTest_Record_Level2.TEnum) : Integer;
static;
end;
...
...
...
class function TTest_Record_Level2.OneHundret: TTest_Record_Level2.TEnum;
begin
Result := TTest_Record_Level2.TEnum.COneHundret;
end;
class function TTest_Record_Level2.ThreHundret: TTest_Record_Level2.TEnum;
begin
Result := TTest_Record_Level2.TEnum.CTwoHundret;
end;
class function TTest_Record_Level2.TwoHundret: TTest_Record_Level2.TEnum;
begin
Result := TTest_Record_Level2.TEnum.CThreeHundret;
end;
class function TTest_Record_Level2.ToInteger(
const AEnum: TTest_Record_Level2.TEnum): Integer;
begin
Result := Integer( AEnum ) * 100;
end;
...
...
...
procedure TForm1.Button5Click(Sender: TObject);
var
LEnum : TTest_Record_Level2.TEnum;
LInt: Integer;
begin
LEnum := TTest_Record_Level2.OneHundret;
LInt := TTest_Record_Level2.ToInteger( LEnum );
if LEnum = TTest_Record_Level2.OneHundret
then
begin
LEnum := TTest_Record_Level2.TwoHundret;
LInt := TTest_Record_Level2.ToInteger( LEnum );
end;
end;
Das funktioniert, kapselt die Enums, hat aber den Charme der simplen Helper etwas verloren
Kann man auch gleich class helper statt record helper nehmen, ist aber womöglich kein Unterschied.
Delphi-Quellcode:
class function OneHundret : TTest_Record_Level2.TEnum; {inline;} static;
class function TwoHundret : TTest_Record_Level2.TEnum; {inline;} static;
class function ThreHundret : TTest_Record_Level2.TEnum; {inline;} static;
Wobei man die Funktionen auch weglassen, und direkt mit dem TEnum arbeiten kann.
Das mache ich z.T. bei einigen Klassen schon so.
Der Vorteil wäre wohl beim besseren AutoComplete, und das die Funktionen auch etwas mehr machen könnten als nur Werterückgabe.
class function OneHundret : TTest_Record_Level2.TEnum; {inline;} static; // inline
Inline geht beim "forwarden" leider auch nicht, weil dann auch die Base-Units gebraucht werden (nicht zum Kompilieren, aber um 0 warnings zu Erreichen).
Stilfrage:
Da wäre dann noch die Frage zum Stil des "
Unit-Forwarding".
Ich habe ja schon gehört das dies Einige nicht gut finden, ich sehe da nur ein Problem das man
"versteckte" Abhängigkeiten bekommt, im Gegensatz zu "offen sichtbaren" Abhängigkeiten in den uses.
Sonst sehe ich da keine anderen grundsätzlichen Probleme, oder gibt es die etwa doch ?
Rollo