2 Syntax-Fragen: Typumwandlungen und Properties

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Martin V
Beiträge: 142
Registriert: Sa 30. Jan 2010, 19:35
OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
CPU-Target: xxBit

2 Syntax-Fragen: Typumwandlungen und Properties

Beitrag von Martin V »

Ich bin sehr routiniert (Kein Anfänger), trotzdem bin ich kürzlich auf zwei Probleme bzgl. Typumwandlungen und Properties gestoßen, wo ich mich frage, ob es nicht elegante Lösungen dazu gibt.

(1) Eine tList ist eine Pointer-Liste. Wenn ich eine Liste eines Objektes oder einer Klasse habe, muß ich dann jedes Mal eine Typumwandlung durchführen:
tMeineKlasse (MeineKlasseListe[I]).MeineProperty

oder geht das auch irgendwie eleganter? Kann ich vielleicht eine Nachfahre-Klasse von tList erzeugen und dabei den Pointer mit einem neuen Typ überschreiben?

(2) Ich möchte eine read/write Property bezogen auf einen Record definieren, also beispielsweise:

tPosition = record
X, Y : Integer;
end;
property posi : tPosition read _GetPosi write _SetPosi;

Ich kann dann im Programmtext nicht schreiben:

posi.X := 3;

Gibt es hier eine Lösungsmöglichkeit, ohne den Vorgang zu umschreiben:

kurzposi := posi;
kurzposi.X := 3;
posi := kurzposi;

Bin schon gespannt auf Eure Vorschläge.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: 2 Syntax-Fragen: Typumwandlungen und Properties

Beitrag von Michl »

Zu 1.: Nimm eine spezialisierte Liste http://www.freepascal.org/docs-html/rtl/fgl/tfpglist.html

Zu 2.: Du könntest mir Record Helpern arbeiten oder in der Klasse eigene Setter und Getter Methoden nutzen.

Beispiel (zu 1. und 2. (damit 2. funktioniert, habe ich die X zu XValue und Y zu YValue umbenannt, obs schön ist, darüber kann man streiten) :

Code: Alles auswählen

program Project1;
 
{$modeswitch advancedrecords}
 
uses fgl;
 
type
 
  { TMyClass }
 
  TPosition = record
    XValue, YValue: Integer;
  end;
 
  { TPositionHelper }
 
  TPositionHelper = record helper for TPosition
  private
    function GetX: Integer;
    function GetY: Integer;
    procedure SetX(AValue: Integer);
    procedure SetY(AValue: Integer);
  public
    property X: Integer read GetX write SetX;
    property Y: Integer read GetY write SetY;
  end;
 
 
  TMyClass = class
  private
    FPosi: TPosition;
  public
    property Posi: TPosition read FPosi write FPosi;
  end;
  TMyList = specialize TFPGList<TMyClass>;
 
 
var
  MyList: TMyList;
  aMyClass: TMyClass;
  i: Integer;
 
{ TPositionHelper }
 
function TPositionHelper.GetX: Integer;
begin
  Result := XValue;
end;
 
function TPositionHelper.GetY: Integer;
begin
  Result := YValue;
end;
 
procedure TPositionHelper.SetX(AValue: Integer);
begin
  XValue := AValue;
end;
 
procedure TPositionHelper.SetY(AValue: Integer);
begin
  YValue := AValue;
end;
 
begin
  MyList := TMyList.Create;
  for i := 0 to 9 do
  begin
    aMyClass := TMyClass.Create;
    aMyClass.Posi.X := i;
//    aMyClass.Posi.Y := 2;
    MyList.Add(aMyClass);
  end;
 
  for aMyClass in MyList do
    WriteLn(aMyClass.Posi.X, ' - ', aMyClass.Posi.Y);
  ReadLn;
 
  for i := Pred(MyList.Count) downto 0 do
  begin
    aMyClass := MyList.Items[i];
    aMyClass.Free;
  end;
  MyList.Free;
end.
Zuletzt geändert von Michl am So 3. Jul 2016, 17:08, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: 2 Syntax-Fragen: Typumwandlungen und Properties

Beitrag von theo »

1: http://wiki.freepascal.org/Generics
2: Nicht wirklich. So geht aber:

Code: Alles auswählen

posi:=Point(X,Y);

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

Re: 2 Syntax-Fragen: Typumwandlungen und Properties

Beitrag von wp_xyz »

Zu 2: Oder du machst X und Y zu Properties. Das geht seit einiger Zeit auch mit Records, wenn {$modeswitch advancedrecords} am Kopf der Unit steht:

Code: Alles auswählen

type
  TPosition = record
    FX, FY: Integer;
    property x: Integer read FX write FX;
    property y: Integer read FY write FY;
  end;

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: 2 Syntax-Fragen: Typumwandlungen und Properties

Beitrag von theo »

wp_xyz hat geschrieben:Zu 2: Oder du machst X und Y zu Properties. Das geht seit einiger Zeit auch mit Records, wenn {$modeswitch advancedrecords} am Kopf der Unit steht:

Code: Alles auswählen

type
  TPosition = record
    FX, FY: Integer;
    property x: Integer read FX write FX;
    property y: Integer read FY write FY;
  end;


Ja, das ist zwar möglich, aber das kann er auch gleich in seiner Klasse einbauen und spart sich den modeswitch.

Code: Alles auswählen

  TForm1 = class(TForm)
  private
    fPosi:tPosition;
  public
    property X: integer read fPosi.X write fPosi.X;
    property Y: integer read fPosi.Y write fPosi.Y;
  end;

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: 2 Syntax-Fragen: Typumwandlungen und Properties

Beitrag von Michl »

Man, man, man, während ich mein Beispiel anpasse, macht ihr es überflüssig :roll:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: 2 Syntax-Fragen: Typumwandlungen und Properties

Beitrag von wp_xyz »

theo hat geschrieben:Ja, das ist zwar möglich, aber das kann er auch gleich in seiner Klasse einbauen und spart sich den modeswitch.

Allerdings, wenn die Properties schon im Record stecken, dann hat man das Thema für TPosition ein für allemal erledigt. Deine Lösung müsste man für jede Klasse, die TPosition enthält, separat implementieren.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: 2 Syntax-Fragen: Typumwandlungen und Properties

Beitrag von theo »

wp_xyz hat geschrieben:
theo hat geschrieben:Ja, das ist zwar möglich, aber das kann er auch gleich in seiner Klasse einbauen und spart sich den modeswitch.

Allerdings, wenn die Properties schon im Record stecken, dann hat man das Thema für TPosition ein für allemal erledigt. Deine Lösung müsste man für jede Klasse, die TPosition enthält, separat implementieren.


Ja, ist Geschmackssache.
Bin mir nicht sicher, ob Martin V mit seiner Frage überhaupt so etwas gemeint hat.

Antworten