begin process at 2010 02 10 05:45:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Algorithme

 > 

Autre

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

vendredi 3 octobre 2008 à 11:42:56 | Création de composant : probleme de liaison de sous-propriété

orelien

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.

vendredi 3 octobre 2008 à 14:01:06 | Re : Création de composant : probleme de liaison de sous-propriété

Guillemouze

... et quel est ton problème exactement?
vendredi 3 octobre 2008 à 14:30:53 | Re : Création de composant : probleme de liaison de sous-propriété

orelien

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.
vendredi 3 octobre 2008 à 14:52:49 | Re : Création de composant : probleme de liaison de sous-propriété

Guillemouze

Réponse acceptée !
essaye ca alors:

type
  TElement = class; //predeclaration

  TPosition = class(TPersistent)
  private
    FX : Real;
...
...
samedi 4 octobre 2008 à 14:51:52 | Re : Création de composant : probleme de liaison de sous-propriété

f0xi

Membre Club Administrateur CodeS-SourceS

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;







Cette discussion est classée dans : property, override, read, tpersistent, telement


Répondre à ce message

Sujets en rapport avec ce message

Problèmes classe dérivée de TPersistent [ par ThWilliam ] Bonjour à tous.Les variables de type Record ne pouvant pas être publiées, je crée une classe dérivée de TPersistent :   TMyClass = class(TPersistent)  Composant : référence circulaire AIE !!! [ par lbensch ] Bonjour j'aimerais savoir si quelqu'un a une idée pour le problème suivant : J'ai créé deux classes qui ont besoin l'une de l'autre tel que :TClass2 = Prob Propriété [ par cricri_forever ] Voila j'ai un ptit prob pour mon composantpublished    { Déclarations publiées }    // les 3 propriétés qui sont présentes dans l'inspecteur d'objets  Label [ par UserXW ] Slt:J'ai un souci avec un composant ... (Boite A propos sous forme de composant) voici donc :(parti du code source)private fCopyright: string; f cast de classes [ par furax13 ] dans mon application , j'ai une classe COoptimisation qui contient une liste de contraintes (classe COContrainte).Chaque contrainte peut être d'un typ Problème dans un composant avec Winsock [ par Francky23012301 ] Salut à tous,Voila un bout de composant,------------------------------unit SMTPClient; interface usesWindows,WinSock,Classes; type  TIdentificat Plantage inspecteur d'objet [ par Oniria ] Bonjour,Voila un gros probléme que j'ai actuellement et je ne parvients vraiment pas à comprendre. Je suis en train de développer un composant (mon pr Composant : Propriétés qui n'apparaissent pas dans l'inspecteur d'objects [ par Francky23012301 ] Salut à tous,Je réalise un composant en ce moment et je ne dois pas avoir les yeux en face des trous (Une ptite baisse de régime ) : TAutoWah=Class  P Composant : Affectation d'un évènement à un autre [ par Francky23012301 ] Salut à tous,J'ai un ptit soucis (surement très bète) mais que je n'arrive pas à résoudre :Je vous poste qu'un tout ptit bout du code (ca évitera des TCollection : changement de stratégie [ par Francky23012301 ] Salut à tous,Je suis entrain d'utiliser les TCollections : seulement je ne suis pas satisfait du résultat . Je vous colle la partie qui me plait pas :


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales