type
TPosition = class(TPersistent)
private
fControl : TControl;
fX : single;
fY : single;
fOnChange: TNotifyEvent;
procedure SetXY(index: integer; value: single);
protected
procedure Change; virtual;
procedure AssignTo(Dest: TPersistent); override;
property Onchange: TNotifyeVent read fOnChange write fOnChange;
published
property X: single index 0 read FX write SetXY;
property Y: single index 1 read FY write SetXY;
public
constructor Create(AOwner : TControl);
end;
TElement = class(TGraphicControl)
private
fNom : string;
fPosition : TPosition;
procedure SetNom(value: string);
procedure SetPosition(value: TPosition);
protected
procedure AssignTo(Dest : TPersistent); override;
procedure Paint; override;
procedure DoPositionChange(Sender: TObject);
published
property Nom : String read FNom write SetNom;
property Position: TPosition read FPosition write SetPosition;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
end;
{ TPosition }
constructor TPosition.Create(AOwner: TControl);
begin
inherited Create;
fControl := AOwner;
fX := 0;
fY := 0;
end;
procedure TPosition.SetXY(index: integer; value: single);
var ptr : ^single;
begin
case index of
0 : ptr := @fX;
1 : ptr := @fY;
end;
if value <> ptr^ then
begin
ptr^ := value;
change;
end;
end;
procedure TPosition.AssignTo(Dest: TPersistent);
begin
if Dest is TPosition then
with (Dest as TPosition) do
begin
fX := Self.fX;
fY := Self.fY;
Change;
end
else
inherited;
end;
procedure TPosition.Change;
begin
if Assigned(fOnChange) then
fOnChange(Self);
end;
{ TElement }
constructor TElement.Create(AOwner: TComponent);
begin
inherited;
fNom := '';
fPosition := TPosition.Create(Self);
fPosition.Onchange := DoPositionChange;
end;
destructor TElement.Destroy;
begin
fPosition.Free;
inherited;
end;
procedure TElement.AssignTo(Dest: TPersistent);
begin
if Dest is TElement then
with (Dest as TElement) do
begin
fNom := Self.fNom;
Self.fPosition.AssignTo(fPosition);
Changed;
end
else
inherited;
end;
procedure TElement.DoPositionChange(Sender: TObject);
begin
Changed;
end;
procedure TElement.Paint;
begin
inherited;
with Canvas do
begin
// ... paint here ... //
end;
end;
procedure TElement.SetNom(value: string);
begin
if value <> fNom then
begin
fNom := Value;
Changed;
end;
end;
procedure TElement.SetPosition(value: TPosition);
begin
value.AssignTo(fPosition);
end;