Ajout d'une propriété a un composant [Résolu]

Signaler
Messages postés
165
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
16 février 2011
-
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
-
Bonjour,



J'aimerais ajouter au composant TstaticText une propriété ACTIVE (de type booulean qui prendrait la valeur True ou False).



Mais cela depasse un peu mes compétences, dans la doc on me parle de surcharger etc. Je n'y comprend rien...



Bref si on pouvait me donner un petit coup de main... Je suis sous D7



D'avance merci.

10 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Il existe une solution simple à mettre en oeuvre, sans passer par la phase de création d'un composant, son install, etc.
De plus, cette solution a le mérite de ne pas obliger à changer le type des composants employés.

<!--StartFragment-->
  TStaticText =   class (StdCtrls.TStaticText)
  private
    FActive: boolean;
  published
    property Active: boolean 
      read FActive 
      write FActive 
      default False;
  end;

Il te suffit d'ins&#233;rer cette d&#233;claration juste avant celle de 
la fiche qui utilise le composant.

Ainsi, le remplacement sera effectu&#233; automatiquement par cette 
nouvelle d&#233;claration. Extrait d'une unit&#233; contenant une fiche :
<!--StartFragment--><CODE>type
  TStaticText  = class(StdCtrls.TStaticText)
  private
    FActive: boolean;
  published
    property Active: boolean read FActive write FActive default False;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Button2: TButton;
    StaticText1: TStaticText;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { D&#233;clarations priv&#233;es }
  public
    { D&#233;clarations publiques }
  end;



</CODE>

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.croix-rouge.fr/index/partner_campagne.html
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Surcharger ?? Je dirai dériver:

type
TMonControl = class (TAncètre) //le composant ancètre (d'où héritage)
private
FActive : boolean = false;
public
protected
published
property Active : boolean read FActive write FActive;
end;

Utilise plutôt la propriété Enabled.

Note: cet exercice est la base du développement de composants. Je doute que tu saches le faire.

===========
Validez les réponses si ok...

ViewVite : HTML
Messages postés
165
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
16 février 2011

Réponse ultra rapide, mais comme tu t'en doute je ne sais pas le faire.



Et je n'arrive pas a mettre ceci dans mon appli.

Parceque je ne veux pas développer un nouveau composants qu'il me faudrait ensuite installer.

Je pensais mettre le code directement dans mon appli, mais peut etre n'est pas possible.



Ou alors où faut t'il que je le mette ton morceau de code ?
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Je sentais bien que tu n'étais pas fort en composant. Ce que je peux te dire est de regarder mon tutorial pour installer des composants (rubrique Outils&Liens à gauche de l'écran). Pour comprendre les composants, va dans les rubriques de composants des codes sources... je ne pourrais pas expliquer les composants, ce serait bien trop long...

===========
Validez les réponses si ok...

ViewVite : HTML
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
7
Ah te voici de retour je commencais a
m'inquieter delphiprog. Deja Bonne année a toi et toute ta famille. Et
encore une fois un superbe exemple tres instructif pour moi en tout cas. Je me posais cette question cet apres midi meme et hop la reponse ideale ici.



Merci qui merci delphiprog.


Bonne prog,
JMP77.

N'oubliez pas de cliquer sur réponse acceptée.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Salut jmp77. Il faut toutefois modérer les usages de cette technique et ne pas l'utiliser à tout va. Si l'usage est limité à une fiche, alors Ok. Si on veut utiliser ce composant redéfini dans plusieurs fiches, alors il faudra se tourner vers des solutions plus "classiques".

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.croix-rouge.fr/index/partner_campagne.html
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
A noter que avec le code de delphiprog, une fois le StaticText passé en True ou False : rien ne se
passe :) la propriété change parfaitement mais aucune action ne se
déroule. (logique ya pas de procedur liée a la propriété !)

Si tu en veux une fait :

....


<code>type
  TStaticText =   class (StdCtrls.TStaticText)
  private
    FActive: Boolean;
    procedure SetActive(Value: Boolean);
  published
    property Active: boolean read FActive write SetActive default False;
  end;

  TForm1  = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Button2: TButton;
    StaticText1: TStaticText;

  private
    { D&#233;clarations priv&#233;es }

  public
    { D&#233;clarations publiques }
  end;

implementation

{$R *.dfm}

</code>

Procedure StaticText1.SetActive(Value: Boolean);

begin

 if Factive=Value then exit; // pour eviter de mettre "true" quand c deja "true" (idem avec false bien sur)

 FActive := Value;

 if FActive then

  // code si actif

 else

  // code si non actif

end; { du begin }



...



end.



je
viens de faire de tete mais je pense ne pas avoir fait d'erreurs (apres
5 relectures ...). Comme tu le comprends, a chaque chagement d'etat de
ton StaticText, la procedure SetActive est execut&#233;e.

Si tu as plusieurs statictext... je pense qu'il faudrait declarer la procedure en PUBLIC et non PRIVATE, je pense :p

ET comme le dit DelphiProg, tu peux toujours t'en remettre a la m&#233;thode
classique de modif le compo pour faire le tiens a partir d'un
TStaticText.

Voila !

a+


                        
                
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Bien que cela ne soit pas une erreur fondamentale de déclarer la procédure SetActive de portée "public" au lieu de "private", ce n'est pas une pratique normale. En effet, en la déclarant "public", elle devient alors visibles des autres unités. Or, laisser l'accès à tout le monde peut se révéler parfois dangereux .
Le fait d'avoir un ou plusieurs TStaticText ne change en rien les pratiques décrites ci-dessus (déclaration de portée public ou private).
C'est ça la programmation objet. Chaque objet est indépendant et il obéit aux méthodes qui sont celles décrites par sa classe (ou ses ancêtres s'il n'y a pas eu de surcharges). Ce qui signifie que tous les TStaticText figurant déposés sur la fiche réagiront tous de la même façon quand on modifiera la valeur de l'un d'entre eux.

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.croix-rouge.fr/index/partner_campagne.html
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
Merci pour ces infos (dont je manque cruellement : oui je n'ai pas les
bases de Delphi :p), donc meme si j'ai mis StaticText1.~ le StaticText2
aura aussi cette procedure ?

je te crois alors :)
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
L'application de ces belles théories sous forme d'un code et du didacticiel qui va bien avec : modifiez vos composants sans modifier vos fiches

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.croix-rouge.fr/index/partner_campagne.html