Création de composant : probleme de liaison de sous-propriété

Résolu
cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 janvier 2009 - 3 oct. 2008 à 11:42
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 4 oct. 2008 à 14:51
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

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
3 oct. 2008 à 14:52
essaye ca alors:

type
  TElement = class; //predeclaration

  TPosition = class(TPersistent)
  private
    FX : Real;
...
...
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
3 oct. 2008 à 14:01
... et quel est ton problème exactement?
0
cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 janvier 2009
3 oct. 2008 à 14:30
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.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
4 oct. 2008 à 14:51
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%" />
0
Rejoignez-nous