Compos - cacher une propriété existante [Résolu]

Signaler
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
-
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
-
Bonjour à tous! 

J' ai une question existencielle qui va me faire passer une mauvaise fin de semaine si je n' ai pas de réponse.

je voudrais savoir si para exemple, lorsque l' on crée un compo basé sur le TImage, il serait possible de:
- cacher la propriété publiée picture: TPicture
- ou alors modifier la propriété publiée picture: TPicture en mode ReadOnly.
- ou alors soyons fou, modifier le nome de propriété publiée picture: TPicture en mode ReadOnly

Je pense que ce n' est pas possible mais j' attends de voir...

Merci d' avance,
Maurício

9 réponses

Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
4
Salut Mauricio !

Extrait de l'aide :

Si vous dérivez un composant de TWinControl, par exemple, il hérite de la propriété protégée DockSite. En redéclarant DockSite dans votre nouveau composant, vous pouvez changer le niveau de protection en public ou publié.
Le code suivant montre une redéclaration de DockSite en tant que publié, le rendant disponible lors de la conception.

type
  TSampleComponent = class(TWinControl)
  published
    property DockSite;
  end;

Lorsque vous redéclarez une propriété, vous spécifiez uniquement le nom de la propriété, non le type ni les autres informations décrites dans Définition des propriétés. Vous pouvez aussi déclarer de nouvelles valeurs par défaut et spécifier si la propriété est ou non stockée.

Les redéclarations peuvent augmenter la visibilité d'une propriété, mais pas la réduire. Vous pouvez ainsi rendre une propriété protégée publique, mais vous ne pouvez pas masquer une propriété publique en la redéclarant protégée.

Arghhhhh !

Désolé de te pourrir ta fin de semaine ...








Ken@vo




<hr size="2" width="100%" />



Code, Code, Codec !
<
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Tout problème a une solution, le tout étant de trouver la bonne.

Mauricio a écrit : "je voudrais savoir si para exemple, lorsque l' on crée un compo basé sur le TImage, il serait possible de..."
Quand tu écris "basé sur le TImage", tout le monde comprend que tu hérites du composant TImage. Or, c'est une vision bien restrictive de la programmation objet et c'est aussi faire fi des Design Patterns et d'une de ses règles d'or : préférer la composition à l'héritage.
En l'occurrence, je verrais bien un petit DP Adapter...

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
DP := DesignPattern
Ce soir je te poste le code et l'illustration permettrant de mieux comprendre le principe du DP Adapter (aussi appelé wrapper). A tout à l'heure, là je vais aller me restaurer.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Bon, me voila enfin de retour.
Explications : au lieu d'hériter, on crée une classe dont un des membres est du type de la classe que l'on veut adapter ou envelopper.
Ensuite, il suffit de déclarer les méthodes, les propriétés et évènements que l'on veut voir apparaître dans notre nouveau composant. Ainsi, on peut déclarer les portées (publique, privée, protégée et privée) que l'on veut, cela n'a aucune importance vu de l'extérieur.
Diagramme d'un composant TMyImage, s'appuyant sur un TImage mais ne montrant que deux de ses propriétés (Enable et Visible) ainsi que ses constructeurs et son destructeur,  simplifiant ainsi son usage :

Le code qui en résulte est très simple :
type
  TMyImage = class (TGraphicControl)
  private
    FImage: TImage;
    function GetEnabled: Integer;
    function GetVisible: Integer;
    procedure SetEnabled(Value: Integer);
    procedure SetVisible(Value: Integer);
  public
    constructor Create; overload;
    constructor Create(AOwner: TComponent); overload;
    destructor Destroy;
  published
    property Enabled: Integer read GetEnabled write SetEnabled;
    property Visible: Integer read GetVisible write SetVisible;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Wrapped', [TMyImage]);
end;

{****************** Class: TMyImage ******************}
constructor TMyImage.Create;
begin
  inherited Create;
  FImage : = TImage.Create;
end;

constructor TMyImage.Create(AOwner: TComponent);
begin
  inherited Create;
  FImage.Create(AOwner);
end;

destructor TMyImage.Destroy;
begin
  FImage.Destroy;
  inherited Destroy;
end;

function TMyImage.GetEnabled: Integer;
begin
  Result := FImage.Enabled;
end;

function TMyImage.GetVisible: Integer;
begin
  Result := FImage.Visible;
end;

procedure TMyImage.SetEnabled(Value: Integer);
begin
  FImage.Enabled := Value;
end;

procedure TMyImage.SetVisible(Value: Integer);
begin
  FImage.Visible := Value;
end;

end.

Les lignes de code qui ont vraiment un intérêt pédagogique ont été colorées en vert.
Donc, je peux maintenant ajouter les méthodes, propriétés et évènements souhaités à mon nouveau composant. Chaque fois que j'aurai besoin d'influer sur le comportement de l'image, je le ferai par le biais d'un appel de méthode sur le membre FImage. Pour les autres actions, je laisse la place à votre imagination fertile

Est-ce maintenant plus clair ?
Le Design pattern adapter est un motif structurel parmi les plus simples à mettre en oeuvre et je sens déjà qu'il n'a plus de secrets pour vous

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Un petit dessin vaut mieux qu'un long discours, non ?
Il ne te reste plus qu'à...
Bonne continuation.
May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
La 3ème étant :
- ou alors soyons fou, modifier le nome de propriété publiée picture: TPicture
qui n' a jamais fait planter une appli à cause du copier/coller d' un bout de code
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Merci Kenavo, c' est bien ce que je pensais: impossible de cacher ce qui est visible alors que l' inverse je l' ai déjà fait des dixaines de fois.

@DelphiProg: ce n' était qu' un exemple... Je sais que le problème serait résolu en héritant d' un object plus haut dans la descendance.
"En l'occurrence, je verrais bien un petit DP Adapter.." :
désolé mais je ne sais pas ce que tu veux dire par "DP"

Merci à tous les 2 pour votre temps.
Maurício
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Haa bem oui, finalement c' est simple!
Merci DelphiProg,


A+
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Franchement DelphiProg, je pensais avoir besoin de cela pour mon TcyPictureArea. Finalement, je préfère laisser la propriété accessible pour que le programmeur puisse modifier/personaliser ce qui est visualisé à tout moment.

Mais comme je me suis posé la question (et pas que la semaine dernière), ça m' interessait de savoir si on pouvait pour un usage ulterieur

"Il ne te reste plus qu'à..."
Bref, j' ai fini les modifications de mon tcyPictureArea qui est devenu bien plus rapide (avec moins de lignes de code il me semble) car la gestion de la visualisation des différents états est bien meilleure (c' était pas très bien construit à vrai dire, mais ça avait le mérite de très bien marcher) et je l' ai même completé en fonctionnalités!

J' hésite à le poster sur CS pour l' instant même si je sais qu' il est utilisé par certains membres.

A+