Besoin d'un expert Delphi pour résoudre un souci de traitement de sous-propriété

Rycku Messages postés 8 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 2 avril 2009 - 22 sept. 2004 à 11:36
Rycku Messages postés 8 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 2 avril 2009 - 25 sept. 2004 à 18:19
Bonjour,

Je vais essayer d'être le plus clair possible, voilà quatre semaines que je suis bloqué sur un probléme malgré toutes mes recherches sur divers forum Internet francais et etranger.

Je travaille avec delphi 7.

Je suis en train de faire un composant avec des propriétés dont l'une d'elle comprends des sous-propriété, et je voudrais lorsque je modifie une sous-propriété que mon composant se redessine.

Vous trouverez un code test en fin de message, Tbordure est ma sous-propriété TTest est mon composant principal.

L'erreur se produit quand j'essaie de placer mon composant sur une forme, aucun message d'erreur apparait et mon application se ferme.

Le probleme viens, du moins je le pense de l'assignation de la variable FTest que j'ai fait dans le constructor de TBordure.Create, qui doit boucler mais je n'arrive pas à l'assigner differemment sans avoir des erreurs. Mais le probleme peut être ailleurs.

Si quelqu'un a la solution, elle est la bienvenue car là je commence à saturer. Si vous avez besoin d'infos complementaire je suis pret à vous les fournir.

Merci par avance pour votre aide...

Eric

Code :

unit Test;

interface

uses
SysUtils, Classes, Controls, Dialogs, Graphics;

type
TBordure = class;

TTest = class(TCustomControl)
private
{ Déclarations privées }
FBordure: TBordure;
ImgBouton : TBitmap;
protected
{ Déclarations protégées }
procedure Paint; override;
procedure SetBordure(const Value : TBordure);
public
{ Déclarations publiques }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Déclarations publiées }
property Bordure : TBordure read FBordure write SetBordure;
end;

TBordure = class(TPersistent)
private
FEpaisseur: Integer;
FTest: TTest;

procedure SetEpaisseur(Value: Integer);
public
constructor Create(AOwner : TComponent);
destructor Destroy; override;
procedure Assign(Source : TPersistent); override;

published
//Sub-properties
property Epaisseur: Integer read FEpaisseur write SetEpaisseur;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Mes Composants', [TTest]);
end;

{ TBordure }

procedure TBordure.Assign(Source: TPersistent);
begin
if Source is TBordure then
with TBordure(Source) do begin
Self.Epaisseur := Epaisseur;
end else
inherited; //Autres
end;

//Creation des sous-propriétés
constructor TBordure.Create(AOwner : TComponent);
begin
inherited Create;

FTest := TTest.Create(AOwner);
end;

//Destruction
destructor TBordure.Destroy;
begin
inherited;
FTest.Free;
end;

procedure TBordure.SetEpaisseur(Value: Integer);
begin
if FEpaisseur = Value then exit;

if Value>=1 then
FEpaisseur := Value
else
FEpaisseur := 1;

Assign(Self);

if assigned(ftest) then
FTest.RePaint
else
raise exception.create('TBordure.SetEpaisseur cannot call FTest.Paint(). FTest is nil.');
//////////////////////
end;

constructor TTest.Create(AOwner: TComponent);
begin
//Creation du composant
inherited;

//Creation d'un canevas
ImgBouton:= TBitmap.Create;
ImgBouton.Canvas.Create;

//Creation des sous-propriétés
FBordure := TBordure.Create(Self);
end;

{ TTest }

//Destructeur - Liberation du composant et des objets liés
destructor TTest.Destroy;
begin
FBordure.Free;
ImgBouton.Free;
inherited;
end;

procedure TTest.SetBordure(const Value: TBordure);
begin
FBordure.Assign(Value);
end;

procedure TTest.Paint;
begin
inherited Paint;

Canvas.TextOut(10,10,IntToStr(FBordure.FEpaisseur));
end;

end.

Rycku
Ce qui ne tue pas rend plus fort - Nietzsche

3 réponses

jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
22 sept. 2004 à 14:28
Si tu pouvais m'envoyer ton projet à cette adresse jerome.meuret@waterair.com accompagné d'un bref résumé de ce que doit faire exactement ton compo, je pourrai essayer de te filer un coup de main ;)!
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
23 sept. 2004 à 19:00
Salut, j'ai regardé cet apm ton compo.Alors déjà j'ai tout recommencé à zéro. Ce n'est pas la bonne méthode et tu as mal utilisé les Assign.

Je suis arrivé à quelque chose mais le fait est que c'est loin d'être la bonne méthode.

C'est beaucoup trop lent d'appeler la méthode Refresh depuis le sous composant.

De plus je pensais me servir du Owner( qui est ici Ttest théoriquement).Malheureusement j'ai regardé comment était codée GetOwner et surprise Result := nil; .

Donc finalement tu n'as pas trop de moyen de faire ce que tu veux, à moins de rédéfinir une fonction GetOwner et la méthode Create de TPersistent :s.

Et tu vas faire tout crasher si tu declares une instance de chaque classe (Tpersistent, TTest) chacune dans l'autre.

Tiens moi au courant si tu veux des précisions et un exemple simple de l'usage d'une sous propriété.

Je te souhaite une bonne soirée :)

Jinh
0
Rycku Messages postés 8 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 2 avril 2009
25 sept. 2004 à 18:19
Bonjour,

jinh68 si tu as un exemple simple de l'usage de sous propriété, je suis preneur.

Car pour l'instant je me suis debrouillé seul et comme tu as pu le constaté il y a de gros souci... :D

Merci

Rycku
Ce qui ne tue pas rend plus fort - Nietzsche
0
Rejoignez-nous