Accéder à une autre classe

[Résolu]
Signaler
Messages postés
35
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
27 juillet 2013
-
Messages postés
35
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
27 juillet 2013
-
Bonjour.
J'ai un petit problème pour accéder à une autre classe dans l'écriture d'un composant.
Pas d'erreur à la compilation, mais BUG au lancement de l'application test (violation d'accès à l'adresse...)

Mon code :

type
TMonComposant = class(TComponent)
private
// J'ai aussi testé dans "protected"
Ville:String;
public
// Je ne veux pas mettre la propriété "FVille" ici sinon accès public

TMaClasse2 = class(TPersistent)
private
SN: TMonComposant;
procedure MaMethode;
...
var
// Je ne veux pas mettre la propriété "FVille" ici sinon accès public

procedure MaMethode;
begin
// Besoin d'accéder à la propriété de l'autre classe.
// Pas d'erreur à la compil mais Bug. Plus de bug si j'enlève la ligne
TMonComposant(SN).Ville:='paris';


Merci d'avance

4 réponses

Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
45
Salut,

il faut créer un autre constructeur pour pouvoir lui passer en paramètre
le composant qui t'intéresse:

  TMaClasse2 = class(TPersistent)
  private
    SN: TMonComposant;
    FActive:boolean;
    procedure SetActive(value:boolean);
  public
    //constructor Create;
    constructor Create(aMonComposant : TMonComposant);

  published
    property Active : boolean read FActive write SetActive;
  end;

implementation

constructor TMonComposant.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FPays: =TMaClasse2.Create(Self);
end; destructor TMonComposant.Destroy;
begin
  FPays.Free;
  inherited Destroy;
end;

{ Classe2 }
constructor TMaClasse2.Create(aMonComposant : TMonComposant);
begin
  inherited Create;
  SN := aMonComposant;
end;

procedure TMaClasse2.SetActive(value:boolean);
begin
  SN.FVille:='paris';
end;

J'ai fait ça de tête mais ça devrait fonctionner
j'ai souvant utiliser ce genre de liaison entre deux composants

 
@+
Cirec

<hr siz ="" />
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Salut,

N'aurais-tu pas oublié de créer une instance de SN ?

constructor TMaClasse2.Create(AOwner: TComponent);
begin
  inherited;
  ...
  SN := TMonComposant.Create(self);
  ...
end;

Bonne prog'
Messages postés
35
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
27 juillet 2013

Je ne peux pas créer avec (self) car types incompatibles.
J'ai besoin d'accéder à une propriété du composant depuis ma classe 2.
Mon code ci-dessous :

unit MonComposant;


interface


uses Classes,Dialogs,Contnrs;


type
  { Pré-déclaration du composant, sinon ma classe 2 ne le reconnait pas }
  TMonComposant = class;


  { Déclaration de ma classe 2 }
  TPays = class(TObjectList)
  end;
  TMaClasse2 = class(TPersistent)
  private
    SN: TMonComposant;
    FActive:boolean;
    procedure SetActive(value:boolean);
  public
    constructor Create;
  published
    property Active : boolean read FActive write SetActive;
  end;


  { Déclaration du composant }
  TMonComposant = class(TComponent)
    private
      // J'ai aussi testé dans "protected"
      FVille : String;
      FPays:TMaClasse2;
    protected
    public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
    published
      property Ville : String read FVille write FVille;
      property Pays : TMaClasse2 read FPays write FPays;
  end;


//var
// Je ne veux pas mettre la propriété "FVille" ni "SN" ici sinon accès public
// Si je place 2 composants dans la même page, ils doivent travailler indépendamment un de l'autre


procedure Register;


implementation


procedure Register;
begin
RegisterComponents('Examples', [TMonComposant]);
end;


{ Composant }
constructor TMonComposant.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FPays:=TMaClasse2.Create;
end;


destructor TMonComposant.Destroy;
begin
inherited Destroy;
end;


{ Classe2 }
constructor TMaClasse2.Create;
begin
inherited Create;
// ERREUR DE COMPILATION ICI
// Types incompatibles :'TComponent' et 'TMaClasse2'
// SN := TMonComposant.Create(self);
end;


procedure TMaClasse2.SetActive(value:boolean);
begin
// Pas d'erreur à la compil mais Bug à l'exécution
TMonComposant(SN).FVille:='paris';
end;


end.
Messages postés
35
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
27 juillet 2013

Super, ça marche.
Merci beaucoup à vous deux !