Enum Helper

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Enum Helper

Beitrag von compmgmt »

Hallo allerseits, ich habe einen Enum der angibt ob ein Produkt Fleischhaltig, Vegetarisch oder Vegan ist. Dafür möchte ich einen Helper erstellen, mit dem ich ich abfragen kann ob ein Produkt bspw Vegetarisch ist.

Code: Alles auswählen

type
  TDiet = (BEEF, VEGETARIAN, VEGAN);
 
  TDietHelper = record helper for TDiet
    function IsVegan: Boolean;
    function IsVegetarian: Boolean;
  end;

Problem: Es kommt eine Fehlermeldung beim Kompilieren:

Code: Alles auswählen

Fatal: Syntax error, ":" expected but "FOR" found
Gemeint ist damit die Zeile "TDietHelper = record helper for TDiet".

In meinen Augen macht das ganze keinen Sinn, da die Syntax ja korrekt ist. Ich hab extra nochmal in der Wiki reingeschaut (http://wiki.freepascal.org/Helper_types).

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Enum Helper

Beitrag von wp_xyz »

Der Basistyp ist eine Aufzählung, kein Record. Daher: TDietHelper = type helper for TDiet. Und damit das funktioniert muss im Kopf der Unit noch stehen: {$MODESWITCH TYPEHELPERS}

Das funktioniert bei mir:

Code: Alles auswählen

program Project1;
 
{$MODESWITCH TYPEHELPERS}
 
type
  TDiet = (BEEF, VEGETARIAN, VEGAN);
 
  TDietHelper = type helper for TDiet
    function IsVegan: Boolean;
    function IsVegetarian: Boolean;
  end;
 
function TDietHelper.IsVegan: Boolean;
begin
  Result := Self = VEGAN;
end;
 
function TDietHelper.IsVegetarian: Boolean;
begin
  Result := Self = VEGETARIAN;
end;
 
var
  d: TDiet;
begin
  d := VEGAN;
  if d.IsVegan then Writeln('Vegan') else WriteLn('nicht vegan');
  if VEGAN.IsVegan then WriteLn('Vegan') else WriteLn('nicht vegan');
  if BEEF.IsVegan then WriteLn('Vegan') else WriteLn('nicht vegan');
 
  ReadLn;
end.

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Enum Helper

Beitrag von compmgmt »

Ah, vielen Dank. Jap, es funktioniert. Ich hatte erst gegoogelt und unter Delphi nimmt man scheinbar ein record helper bei Aufzählungstypen.

Eine Sache noch, die zwar eigentlich egal ist, aber die Funktion IsVegetarian müsste heißen

Code: Alles auswählen

Result := (Self >= VEGETARIAN)
da ein veganes Produkt ja automatisch auch vegetarisch ist. Ist aber egal, mir ging es ja nur um den Enum.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Antworten