Bonjour,
Toujours dans le développement d'un composant, j'ai besoin d'avoir une collection de collection.
Pour ce faire j'avais fait simplement une première collection puis une seconde qui appelait l'autre mais j'ai vite remarqué que la 2em collection n'avait pas accès à l'éditeur de propriété en mode conception.
Alors j'ai regardé comme était fait le TCategoriesButtons (Present depuis D2005) pour voir comment ils ont fait.
J'ai donc réussi à faire apparaitre l'éditeur en mode conception, à créer/Modifier les Item mais lors de la suppression (Via l'éditeur) j'ai un soucis de pointeur.
Les composants sont détruits (donc passe bien par la case Destroy de l'item) mais la liste dans l'éditeur ne bouge pas et c'est à ce moment que j'ai le message d'erreur de pointeur(les données sont toujours présentes dans le dfm).
Classes principale pour les collections et collections items
(Si on ne passe pas par ses classes l'éditeur n'apparait pas pour la 2em
Puis les classes dérivant des classes de bases.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Type TCollectionItemBase = class(TCollectionItem) private FBaseCaption : TCaption; procedure Set_BaseCaption(const Value: TCaption); virtual; published property Caption : TCaption read FBaseCaption write Set_BaseCaption; end; TCollectionBase = class(TCollection) private FParent : TComponent; strict protected procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override; public constructor Create(AOwner : TComponent; CollectionItem : TCollectionItemClass);overload;virtual; end;
TPanelCollection => Génère des panels dans un TRzGridPanel
TPanelCollectionItem => Paramétrage des panels + Création de boutton pour les panels
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 TPanelCollection = Class(TCollectionBase) private // FParent : TComponent; function GetItem(Index: Integer): TPanelCollectionItem; procedure SetItem(Index: Integer; const Value: TPanelCollectionItem); protected function GetOwner : TPersistent;override; public ParentGridPanel : TRzGridPanel; constructor Create(AOwner : TComponent);overload; function Add : TPanelCollectionItem; property Items[Index : Integer] : TPanelCollectionItem read GetItem write SetItem;default; published End;
TBtnCollection => Collection des boutons qui seront dans les panels
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 TPanelCollectionItem = class(TCollectionItemBase) private FBtnCollection : TBtnCollection; FParentCollection : TCollection; FGinPanel : TGinPanel; FPanCenter : TRzPanel; FImageIndex: TImageIndex; FLineColor: TColor; FVisible: Boolean; FImageList : TImageList; procedure Set_BaseCaption(const Value: TCaption); override; procedure Set_LineColor(const Value: TColor); procedure Set_ImageIndex(const Value: TImageIndex); procedure Set_ImageList(const Value: TimageList); procedure Set_BtnCollection(const Value: TBtnCollection); protected function GetDisplayName : String; override; public ParentGridPanel : TRzGridPanel; constructor Create(Collection: TCollection); override; destructor Destroy;override; published property BtnCollection : TBtnCollection read FBtnCollection write Set_BtnCollection; property ImageIndex : TImageIndex read FImageIndex write Set_ImageIndex Default -1; property ImageList : TimageList read FImageList write Set_ImageList; property LineColor : TColor read FLineColor write Set_LineColor; property Visible : Boolean read FVisible write FVisible Default True; end;
TBtnCollectionItem => Configuration des boutons
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 TBtnCollection = class(TCollectionBase) private // FParent : TPersistent; function GetItem(Index: Integer): TBtnCollectionItem; procedure SetItem(Index: Integer; const Value: TBtnCollectionItem); protected function GetOwner : TPersistent;override; public constructor Create(AOwner : TComponent);overload; function Add : TBtnCollectionItem; property Items[Index : Integer] : TBtnCollectionItem read GetItem write SetItem;default; end;
Si vous voyez d'où vient le soucis ou si vous avez une autre solution pour faire apparaitre l'éditeur pour la 2em collection sans à faire ce traffic, je suis prenneur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 TBtnCollectionItem = class(TCollectionItemBase) private FParentCollection : TCollection; FRzPanelCtner : TRzPanel; FAdvGlowBtn : TAdvGlowButton; FVisible : Boolean; FImageList: TImageList; FImageIndex: TImageIndex; FOnClick : TNotifyEvent; procedure Set_ImageIndex(const Value: TImageIndex); procedure Set_ImageList(const Value: TImageList); procedure Set_OnClick(const Value: TNotifyEvent); protected function GetDisplayName : String; override; public constructor Create(Collection : TCollection);override; destructor Destroy; override; published property Visible : Boolean read FVisible write FVisible; property ImageIndex : TImageIndex read FImageIndex write Set_ImageIndex; property ImageList : TImageList read FImageList write Set_ImageList; property OnClick : TNotifyEvent read FOnclick write Set_OnClick; end;
Merci
Partager