Création de composant : probleme de liaison de sous-propriété [Résolu]

Signaler
Messages postés
137
Date d'inscription
dimanche 7 juillet 2002
Statut
Membre
Dernière intervention
11 janvier 2009
-
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
Bonjour,

Je souhaite faire fonctionner le code suivant :

...


type
  TPosition = class(TPersistent)
  private
    FX : Real;
    FY : Real;
    FReference: TElement;
  protected
  public
    constructor Create(AOwner : TPersistent); override;
    destructor Destroy; override;
    procedure Assign(Source : TPersistent); override;
  published
    property X: Real read FX write FX;
    property Y: Real read FY write FY;
    property Reference: TElement read FReference write FReference;   
  end;
   


  TElement = class(TGraphicControl)
  private
    FNom : String;
    FPosition : TPosition;
  protected
  public
    constructor Create(AOwner : TPersistent);
    destructor Destroy; override;
    procedure Assign(Source : TPersistent); override;
  published
    property Nom: String read FNom write FNom;   
    property Position: TPosition read FPosition write FPosition;   
  end;
 
  ...

Mon but est de lister les objets de type TElement dans une sous propriété de TElement. Est-ce possible ?
Ainsi, j'aimerais qu'un TElement ait sa position de calculé en fonction d'un autre TElement, et ce pour autant de propriétés TPosition crées.

Merci
Orélien.

4 réponses

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
essaye ca alors:

type
  TElement = class; //predeclaration

  TPosition = class(TPersistent)
  private
    FX : Real;
...
...
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
... et quel est ton problème exactement?
Messages postés
137
Date d'inscription
dimanche 7 juillet 2002
Statut
Membre
Dernière intervention
11 janvier 2009

Et bien la compilation est impossible et me renvoie une erreur car la sous propriété TPosition de la classe TElement contient elle-même dans sa propre classe une propriété TElement.
A la lecture de la classe TPosition,le compilateur veut créer la propriété Reference (TElement) et bloque la dessus, car il ne trouve pas la classe TElement (qui ne vient qu'après).

J'espère avoir été clair dans mes explications...
Merci

Orélien.
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
30
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;

<hr size="2" width="100%" />