2 Syntax-Fragen: Typumwandlungen und Properties
-
- 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
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.
(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.
Re: 2 Syntax-Fragen: Typumwandlungen und Properties
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) :
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;
Re: 2 Syntax-Fragen: Typumwandlungen und Properties
1: http://wiki.freepascal.org/Generics
2: Nicht wirklich. So geht aber:
2: Nicht wirklich. So geht aber:
Code: Alles auswählen
posi:=Point(X,Y);
Re: 2 Syntax-Fragen: Typumwandlungen und Properties
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;
Re: 2 Syntax-Fragen: Typumwandlungen und Properties
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;
Re: 2 Syntax-Fragen: Typumwandlungen und Properties
Man, man, man, während ich mein Beispiel anpasse, macht ihr es überflüssig
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: 2 Syntax-Fragen: Typumwandlungen und Properties
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.
Re: 2 Syntax-Fragen: Typumwandlungen und Properties
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.