typehelper und record case

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6956
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

typehelper und record case

Beitrag von Mathias »

Ich habe einen bestehenden record in einer fremden Unit, der so aussieht.

Code: Alles auswählen

type
  TSDL_Color = record
    r: uint8;
    g: uint8;
    b: uint8;
    a: uint8;
  end;
Hier habe ich auf folgende Weise ein Array-Zugriff hinzugefügt.

Code: Alles auswählen

type
  TVec2 = array[0..1] of single;

  TSDL_ColorHelper = type Helper for TSDL_Point
  private
    function Getarr: TVec2;
    procedure Setarr(AValue: TVec2);
  public
    property arr: TVec2 read Getarr write Setarr;
  end;

  function TSDL_ColorHelper.Getarr: TVec2;
  begin
    Result[0] := Self.x;
    Result[1] := Self.y;
  end;

  procedure TSDL_ColorHelper.Setarr(AValue: TVec2);
  begin
    Self.x := AValue[0];
    Self.y := AValue[1];
  end;
Irgendwie ist dies recht viel Code für so was einfaches, daher die Frage, gibt es da auch etwas kompakteres so wie es bei einem case-record gibt.
So das man den Getter und Setter weglassen könnte ?
Evtl. gibt es auch etwas mit absolute.

Gut ich könnte es in der bestehenden Unit auf folgende Art abändern, aber wen es etwas einfaches mit typehelper geben würde, würde ich die vorziehen.

Code: Alles auswählen

type
  TNewSDL_Point = record
    case Byte of
      1: (
        r: single;
        g: single);
      2: (arr: array[0..3] of single);
  end;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 963
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: typehelper und record case

Beitrag von PascalDragon »

Mathias hat geschrieben: So 12. Mai 2024, 15:41 Hier habe ich auf folgende Weise ein Array-Zugriff hinzugefügt.
Ist es eigentlich Absicht, dass dein TSDL_ColorHelper ein Helper für TSDL_Point ist? 🤔
Mathias hat geschrieben: So 12. Mai 2024, 15:41 Irgendwie ist dies recht viel Code für so was einfaches, daher die Frage, gibt es da auch etwas kompakteres so wie es bei einem case-record gibt.
Nein, gibt es nicht. Selbst mit einem überladenem Zuweisungsoperator kommst du nicht mit all zu viel weniger Code aus.
Mathias hat geschrieben: So 12. Mai 2024, 15:41 Evtl. gibt es auch etwas mit absolute.
Die Verwendung von absolute würde bedeuten, dass du das an jeder Stelle machen musst, an der du zwischen einem Array und dem Record umwandelst. Desto mehr dieser Stellen du hast, desto mehr rentiert sich der Code des Helpers, da du diese dann einsparen kannst.
FPC Compiler Entwickler

Antworten