2010-01-02 4 views
0

// Je ne sais pas comment poser la question mieux ... //inspecteur d'objets ne concerne pas les propriétés modifiées

J'INSCRITS nouvelle classe de mon (tDISPLAY). A l'intérieur de cette classe se trouve un objet (TRectangle - aussi le mien), qui est créé dans le constructeur de TCustomDisplay - predecestor de TDisplay. Lorsque je mets TDisplay sur le formulaire, je peux modifier toutes les propriétés publiées de mes deux objets (TDisplay, TRectangle) comme d'habitude, mais seul TDisplay est configuré en fonction de l'inspecteur d'objets. TRectangle reste dans ses valeurs par défaut (gauche 0, Haut 0 droite 30, bas 20), malgré cela, que ces propriétés sont définies à gauche 0, Top 0 droite 100, bas 100.

Que dois-je vérifier à le faire fonctionner correctement?

Thanx

P.S Lorsque les propriétés définies dans l'inspecteur d'objets sont effectivement chargés dans un objet?

Voici l'exemple de code ("short one"). Il n'est pas « propre » alors s'il vous plaît, être tolérant ...

TRectangle = class(TComponent) 
    private 
    FOnAdjustContent: TNotifyEvent; 
    FLeft, FRight, FBottom, FTop:Integer; 
    FoutLeft, FoutRight, FoutBottom, FoutTop:integer; 
    FinLeft, FinRight, FinBottom, FinTop:integer; 
    FAligning:TAligning; 
    FAdjustContent:TAdjustContent; 
    FAnchors:TAnchors; 
    FList:Tlist; 
    FRectangleContainer:TRectangleContainer; 
    FParentRectangle:TRectangle; 
    FdLeft, FdTop, FdBottom, FdRight: integer; 
// function FindParent(AName:string):TRectangle; 


    public  
    constructor Create(AOwner:TComponent);override; 
    destructor Destroy; override; 
    procedure Assign(Source : TPersistent); override; 
    published 
    property AdjustContent:TAdjustContent read FAdjustContent write SetAdjustContent; 
    property Aligning:TAligning read FAligning write SetAlign; 
    property Anchors:TAnchors read FAnchors write SetAnchors; 
    . 
    . 
    . 
    end; 



TTextObject = class (TRectangle) 
    public 
     procedure Assign(Source : TPersistent); override; 
    published 
     property AlignmentInCell:integer read FAlignmentInCell write FAlignmentInCell; 
     property Brush:TBrush read FBrush write FBrush; 
     property CanMove:Boolean read FCanMove write FCanmove; 
     . 
     . 
     . 
    end; 





TCustomDisplay = class (TCustomControl) 
    private 
    FRootTextObject:TTextObject; 
    procedure SetRootTextObject(Value:TTextObject); 
    protected 
    public 
    constructor Create(AOwner:TComponent); override; 
    destructor Destroy; override; 
    procedure Assign(Source:TPersistent); override; 
    published 
    property RootTextObject:TTextObject read FRootTextObject write SetRootTextObject; 
    end; 



    TDesignDisplay = class (TCustomDisplay) 
    protected 
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; 
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; 
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; 
    public 
    procedure Paint; override; 
    end; 

    TDisplay = class (TCustomDisplay) 
    private 

     function GetFirstMovable: TTextObject; 
    protected 
     procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; 
     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; 
     procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; 
    public 
     procedure Paint; override; 
    end; 


procedure Register; 
begin 
    RegisterComponents('My Palette', [TDisplay, TDesignDisplay]); 
end; 



constructor TCustomDisplay.Create(AOwner:TComponent); 
    var i:integer; 
    begin 
    inherited; 

    FRootTextObject:=TTextObject.Create(Self); 
// ShowMessage(FRootTextObject.Name); 
// FRootTextObject.Name:='Root'; 
    FRootTextObject.OnAdjustContent:=DoAdjustContent; 

// FRootTextObject.Right:=Width; 
// FRootTextObject.Bottom:=Height; 
    FRootTextObject.CanMove:=False; 
    TabStop:=True; 
    end; 



procedure TCustomDisplay.SetRootTextObject(Value:TTextObject); 
begin 
    FRootTextObject.Assign(Value); 
end; 




procedure TRectangle.Assign(Source: TPersistent); 
var ARectangle:TRectangle; 
begin 
    if Source is TRectangle then 
    begin 
    ARectangle:=Source as TRectangle; 

// Name:=ARectangle.Name; 
    // FRect:=Rectangle.Rect; 
    FLeft:=ARectangle.Left; 
    FTop:=ARectangle.Top; 
    FRight:=ARectangle.Right; 
    FBottom:=ARectangle.Bottom; 
    FoutLeft:=ARectangle.outLeft; 
    FoutTop:=ARectangle.outTop; 
    FoutRight:=ARectangle.outRight; 
    FoutBottom:=ARectangle.outBottom; 
    FinLeft:=ARectangle.inLeft; 
    FinTop:=ARectangle.inTop; 
    FinRight:=ARectangle.inRight; 
    FinBottom:=ARectangle.inBottom; 
    end 
    else 
    inherited; 
end; 



procedure TTextObject.Assign(Source : TPersistent); 
var ATextObject:TTextObject; 
begin 
     inherited; 
     if Source is TTextObject then 
     begin 
     ATextObject:=Source as TTextObject; 

     AlignmentInCell:=ATextObject.AlignmentInCell; 
     AttachedWP:=ATextObject.AttachedWP; 
     Brush.Assign(ATextObject.Brush); 
     Caption:=ATextObject.Caption; 
     Font.Assign(ATextObject.Font); 
     Painting.Assign(ATextObject.Painting); 
     Pen.Assign(ATextObject.Pen); 
     RichString:=ATextObject.RichString; 
     StateDrawing:=ATextObject.StateDrawing; 
     TabState:=ATextObject.TabState; 
     TextFormat:=ATextObject.TextFormat; 
     Thickness:=ATextObject.Thickness; 
     Transparent:=ATextObject.Transparent; 
     Value:=ATextObject.Value; 
     WPname:=ATextObject.WPname; 
     end;   
end; 

Répondre

7

Assurez-vous que TRectangle est dérivé de la classe TPersistent ou l'une de ses classes descendantes. Vérifiez également que vous avez implémenté la méthode Assign pour TRectangle et que toutes les propriétés publiées de TRectangle sont affectées à la méthode Assign.

REMARQUE: Si votre classe est dérivée de TComponent et est utilisée en tant que composant enfant dans un autre composant, vous devez appeler SetSubComponent (True) lorsque l'objet est créé.

Le code devrait ressembler à ceci:

section Interface:

type  
    TRectangle = class(TComponent) 
     private 
     FTop, 
     FBottom, 
     FLeft, 
     FRight : Integer; 
     public 
     procedure Assign(Source: TPersistent); override; 
     published 
     property Bottom: Integer read FBottom write FBottom; 
     property Left: Integer read FLeft write FLeft; 
     property Right: Integer read FRight write FRight; 
     property Top: Integer read FTop write FTop; 
     end; 

     TDisplay = class(TComponent) 
     private 
     FRectangle : TRectangle; 
     procedure SetRectangle(Value: TRectangle); 
     public 
     constructor Create(AOwner: TComponent); override; 
     destructor Destroy; override; 
     published 
     property Rectangle: TRectangle read FRectangle write SetRectangle; 
     end; 

section de mise en œuvre:

{ TRectangle } 

procedure TRectangle.Assign(Source: TPersistent); 
begin 
    if Source is TRectangle then 
    begin 
    FBottom := TRectangle(Source).Bottom; 
    FLeft := TRectangle(Source).Left; 
    FRight := TRectangle(Source).Right; 
    FTop := TRectangle(Source).Top; 
    end 
    else 
    inherited; 
end; 

{ TDisplay } 

constructor TDisplay.Create(AOwner: TComponent); 
begin 
    inherited; 
    FRectangle := TRectangle.Create(Self); 
    FRectangle.Parent := Self; 
    FRectangle.SetSubComponent(True); 
end; 

destructor TDisplay.Destroy; 
begin 
    inherited; 
end; 

procedure TDisplay.SetRectangle(Value: TRectangle); 
begin 
    FRectangle.Assign(Value); 
end; 
+0

J'ai effectué mon code pour ressembler à votre code. Ça ne fonctionne pas bien. La différence est que, dans le constructeur de TRectangle, j'ai défini Fright: = 30, Fbottom: = 20. Et il utilise toujours ces valeurs ... Je suppose que l'instruction Showmessage (Value.Right) dans la procédure SetRectangle devrait afficher 100 de 30. Dans mon cas, il ne ... Merci beaucoup de toute façon. Ah, ce qui est très intéressant: TRectangle est TComponent. Si le nom du Trectangle diffère de celui de l'inspecteur d'objets. SetRectangle n'est pas exécuté ... – lyborko

+0

Pouvez-vous fournir un exemple de code qui reproduit votre problème? – vcldeveloper

+0

OK ... Je vais essayer ... Je l'ai mis dans les réponses ... – lyborko

Questions connexes