Propriété d'un composant

Résolu
Signaler
Messages postés
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009
-
Messages postés
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009
-
Bonjour,
J'aimerais savoir, lorsque l'on dérive un composant, (en l'occurence un TStringGrid pour mon cas) si l'on peut lui retirer un propriété qu'il aurait en natif ?
Par exemple je voudrais retirer le propriété "FixedRow"
Merci pour vos réponses

29 réponses

Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
salut,

l'override "vide", n'est qu'une solution de remplacement si tu ne peut pas dérivé la class de base. C'est une moche solution.

dans l'unit grids.pas:

1. recopy la déclaration de   "TDrawGrid = class(TCustomDrawGrid)" dans une unité à toi. (ajoute grids au uses)

2. renomme la (genre TgedDrawGrid)

3. commente les lignes que ne veux pas:
cad
    ....
    property FixedColor;
    property FixedCols;
    property RowCount;
    property FixedRows;
    ....

devient
    ....
    property FixedColor;
//    property FixedCols;
    property RowCount;
    property FixedRows;
    ....

voilà! c'est tout!

t'as un TDrawGrid sans la property FixedCols!

c'est clair maintenant j'éspère. :)

A+

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Messages postés
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009

C'est très clair, merci à toi
c'est vrai qu'au niveau programmation ce n'est pas des plus professionnel.....
A+
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
non, comme je l'avait dis en la proposant. c'est moche et pas toujours applicable. Mais ça dépanne des fois.

Si tu rencontres des problèmes, pose ta question ici.

bon code,

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
38
en fait, la plupart des classes possede toujours (la plupart du temps) un ancetre nomé TCustomMachin.

quand on ecrit une classe TCustomMachin, seule les zone Private et Protected sont utilisée. la plupart des methodes sont abstraite (cad il n'y a que la declaration de la methode, pas l'implementation).

il suffit de regarder l'exemple TStrings et TStringList.

l'ancetre de TStringGrid est TDrawGrid qui est lui meme descendant de TCustomDrawGrid descendant de TCustomGrid.

FixedRows appartient a TCustomGrid soit 3 niveau plus haut que TStringGrid.
si on veux cacher cette propriétée, la seule solution est de rederiver chaque ancetres  jusqu'a  TStringGrid.
assurement ce serait assé fastidieux a faire.

<hr size="2" width="100%" />Croc (click me)
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
L'héritage ? Pourquoi bien souvent en matière de POO on pense uniquement héritage ?
Seriez-vous des rentiers qui s'ignorent ?

Et la composition dans tout cela ?

En reprenant les propos de Foxi ci-dessus, créez un descendant de TCustomGrid qui posséde, en interne un membre privé du type TStringGrid. Pour ce composant, ne publiez que les propriétés et méthodes que vous souhaitez. De toutes façons, ces méthodes ne feront que faire appel au vrai composant (TStringGrid) et puis c'est tout.
Les connaisseurs devraient reconnaitre là un pattern de base en POO : le pattern adptateur.

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net/
Messages postés
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009

Je vois que le débat s'anime, il ne peut en sortir que quelque chose de constructif.
J'ai appliqué la méthode de Loda, dite méthode "moche", mais celà fonctionne.
Par contre, est_ce un effet perverse de la méthode, je voudrais utilisé la propriété
ColWidth[n] dans le composant que je crée. J'ai une erreur "Valeur non déclaré".
Si je pose mon composant sur une Form et que j'utilise ColWidth[n] dans le programme,
celà fonctionne.
Celà vient-il que ColWidth[n] soit une méthode virtuelle de TCustomGrid ?
A+
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
4
Salut gebu34.

ColWidths est une propriété déclarée dans la section protected de TCustomGrid, donc accessible aux classes dérivées. Ton problème ne vient pas de là.

A +
Thierry
Messages postés
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009

Salut à tous,
Effectivement ColWidths vient de TCustomGrid Protected Property.
Pour redessiner mon composant, j'utilise une méthode qui fonctionne très
bien pour d'autres composants (moins compliqués certe).
Je déclare la propriété Paint en override pour la surchager.
Dans une proc je définis ou passe mes variables et lance Invalidate pour
provoquer l'activation de Paint.
Dans Paint, j'exécute les actions nécessaires (dans mon cas ColWidths qui
prends une valeur 1 pour masquer la colonne ou DefaultWidth pour la voir.
J'ai tenté une foule de combinaisons sans succès.
Si une idée géniale surgit, je serais ravis....
A+
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
attend, je suis pas sur de comprendre... tu modifie des prorités de ton composant DANS la méthode pain?!?

Dans ton setter, tu appel invalidate, c'est juste. Mais si tu dois modifier des valeurs liée à la propriétésque tu viens de changer, fait le dans le setter. pas dans le paint!

Le paint est appelé un nombre incalculable de fois, il doit être le plus rapide (et compact) possible. évite tout test/calcul inutile!

A+

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.