begin process at 2012 02 11 08:57:03
  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)  Classe déclarée mais non trouvée dans un composant [ par Francky23012301 ] Salut à tous J'ai besoin de vos lumières car je bute sur un problème que je n'arrive pas à identifier (Surement un truc con que je vois pas [^^confus Utilisation d'une classe de base [ par Francky23012301 ] Salut à tous,J'ai une petite question à vous soumettre :  J'ai fais un composant basé sur ce principe TCustomCollectionItem = class(TCollectionItem)  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 : Classe non trouvée dans un composant [ par Francky23012301 ] Salut à tous ,J'ai un ptit soucis avec un composant de mon cru. Ce dernier fonctionne très bien quant je l'utilise : il n'y a pas de beugs apparents. 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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 1,622 sec (3)

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