Propriété d'un composant

Résolu
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009 - 6 mars 2007 à 12:16
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009 - 10 mars 2007 à 19:40
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

gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009
10 mars 2007 à 19:40
Tu as totalement raison,
je n'avais pas vus l'aspect rapidité (je vais même modifier mes autres composant,
celà fera plus propre)
Merci à toi Loda, et en plus celà fonctionne.....
Je me mets au clavier, pour finir ce composant
A+
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 34
6 mars 2007 à 12:36
En  derivant un composants, les propriétés et methodes ne peuvent que passer de Protected a public ou published.
pour supprimer ou cacher une propriétés ou une methodes d'un objet il faut deriver sont ancetre.

<hr size="2" width="100%" />Croc (click me)
0
sylvunix Messages postés 93 Date d'inscription mardi 11 avril 2006 Statut Membre Dernière intervention 4 mars 2009
6 mars 2007 à 12:53
Bonjour f0xi,

C'est une question que je me suis déjà posée.

Néanmoins je ne vois pas bien comment tu peux faire cela ! Pourrais-tu nous donner un exemple afin de nous éclairer ?

sylvunix
0
Utilisateur anonyme
6 mars 2007 à 13:26
Salut


 


Sylvunix : Si Gebu34 veut que son composant ne contienne pas sa propriété "FixedRow", il suffit qu'il ne le "dérive" pas du DBGrid mais d'un composant "hiérarchiquement au-dessus" qui ne contient pas cette propriété.

Exemple de delphipage

unit LabelLien;




interface






uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ShellAPI;






type
  TTypeLien = (URL,MAIL);
  TLabelLien = class(TLabel)
  private
    { Déclarations privées }
    FAdresse:string;
    FTypeLien:TTypeLien;
  protected
    { Déclarations protégées }
    procedure Click; override;
  public
    { Déclarations publiques }
    constructor Create(AOwner:TComponent); override;
  published
    { Déclarations publiées }
    property Adresse:string read FAdresse write FAdresse nodefault;
    property TypeLien:TTypeLien read FTypeLien write FTypeLien default URL;
  end;






procedure Register;






implementation






constructor TLabelLien.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
Font.Color:=clBlue;
Font.Style:=[fsUnderline];
Cursor:=crHandPoint;
end;






procedure TLabelLien.Click;
var St:string;
begin
inherited;
case TypeLien of
URL: St:=FAdresse;
MAIL: St:='mailto:'+FAdresse;
end;
ShellExecute(GetDesktopWindow,'open',PChar(St),nil,nil,SW_SHOWNORMAL);
end;






procedure Register;
begin
RegisterComponents('Delphipage', [TLabelLien]);
end;






 

Si tu veux créer un composant de type TLabel qui ne contient pas la propriété TypeLien bien au lieu de dériver le composant que tu veux faire à partir de TLabelLien bien tu le feras à partir du TLabel.

Pas besoin de faire un exemple pour comprendre ca : n'est ce pas ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
6 mars 2007 à 13:45
salut,

j'ajouterais que la pluspart des compos de a VCL dérive d'un TCustomXxx ou TBaseXxx qui n'as aucun proprité published.

regarde dans forms.pas:
 TForm = class(TCustomForm)

c'est un bon exemple je pense.

A+

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009
6 mars 2007 à 13:53
Merci à tous pour ces réponses très éclairés.
Je vais de suite faire quelques essais en dérivant de TCustomGrid qui est la base..
A+
0
sylvunix Messages postés 93 Date d'inscription mardi 11 avril 2006 Statut Membre Dernière intervention 4 mars 2009
6 mars 2007 à 14:19
Gardez vos tomates pour plus tard ...

Si tu crées un composant à partir de TLabel, tu perds la propriété TypeLien comme également tout ce qui est spécifique à TLabelLien. Mais si le reste t'intéresse, tu dois tout réécrire !

Merci de m'éclairer car j'envisable sérieusement de ressortir mon Microsoft Basic 80 ...

A+
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
6 mars 2007 à 14:35
@Sylvunix:

hello!

si je te comprend bien, tu voudrais dériver une class en ayant tout le code de celle si, mais en reduissant la visibilité d'un des champs / property.

Ceci n'est PAS possible. (la visibilité ne peut PAS être réduite. seulement augmenté. cela vient des concept de POO. Pas de Delphi)

MAIS, les class borland ont une class de base qui implement TOUT les comportement, mais qui ne publie RIEN. Donc dérive la et ne rend publique que ce que tu veux.

Une autre solution pour "supprimer" une methode d'une class (très moche et pas toujours valable) consite à faire un override qui ne fait rien (ie: qui n'appel pas le inherited et sans code)

si j'ai répondu à côté, re demande.

A+

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009
6 mars 2007 à 15:06
ReSalut,
Je vais voir du coté de l'override, mais ce n'est pas très élégant....
J'ai essayé de dérivé un TCustomGrid pour voir ces propriétés de base, mais très dépouillé, je n'est que Register et Destructor.
Le composant s'installe sans problème, mais si je le place sur une Form j'ai un message d'erreur "Erreur abstraite" (celle là je ne la connaissait pas) mais le composant se place quand même sur la Form, avec des propriétés très réduites. Celà me conviendrait pas mal et il suffirait de reproduire les propriétés que l'on désire (à voir dans les sources), mais ce qui me gêne, c'est le message d'erreur qui ce produit à chaque fois que l'on clique sur le composant.(Erreur abstraite)
A+
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
6 mars 2007 à 15:21
@gebu34:



dsl pour l'incompréhension. je m'adressais à Sylvunix qui semble ne pas être satisfait des réponses fournies.

IMHO, dérivé un TCustomXxx est la meilleur solution pour ton problème.

Erreur abstraite : une methode abstrate de la class de base n'est pas implémenté dans la class descendante. (trouvable en 2sec dans l'aide de Delphi)

au cas ce n'est pas clair: tu n'as pas besoin de REPRODUIRE les proprieté. seulement de les mettre en published. Lit l'aide sur Published, protected, public et private.

bon code,

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
Utilisateur anonyme
6 mars 2007 à 15:25
Oh la je suis fatigué moi : je redis ca correctement

@Sylvinux : faut pas faire la tête, il n'y avait rien de méchant dans mes mots. J'ai juste souligné qu'il s'agit de créer classiquement un composant et que  la seule spécificité réside dans le choix de l'ancêtre : pas de quoi faire un tuto/exemple.
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009
6 mars 2007 à 15:49
Merci pour toutes ces réponses....
Maintenant je me mets au clavier....
A+
0
sylvunix Messages postés 93 Date d'inscription mardi 11 avril 2006 Statut Membre Dernière intervention 4 mars 2009
6 mars 2007 à 16:01
Désolé de perturber la question initiale de gebu34 mais suite la réponse de f0xi m'inquiétait beaucoup dans le mesure où je pensais avoir manqué quelque chose sur le concepts des objets en Delphi.

Merci à toi Loda pour ces éclaircissements. Je n'avais jamais accroché sur le fait que toutes les classes de base de Borland ne publiaient rien.

sylvunix
0
sylvunix Messages postés 93 Date d'inscription mardi 11 avril 2006 Statut Membre Dernière intervention 4 mars 2009
6 mars 2007 à 16:37
Francky23012301,

Rassures-toi, je ne fais pas la tête ... J'essayais simplement de comprendre !

Cette discussion a été très bénéfique ... pour moi ...

a+
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
6 mars 2007 à 18:33
Salut gebu34.

En dérivant ton grid de TCustomGrid, l'erreur abstraite que tu rencontres vient de la procedure DrawCell qui est déclarée dans TCustomGrid mais non implémentée (comme l'a précisé Loda).
Tu dois donc la redéclarer dans la section protected de ton composant et puis l'implémenter.

TMyGrid = class(TCustomGrid)
protected
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;

procedure TMyGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
begin
  // ton code de dessin des cellules
end;

A +
Thierry 
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
6 mars 2007 à 18:44
Une précision, mais elle est importante.
TCustomGrid ne "mémorise" pas le contenu d'une cellule (ce que fait TStringGrid : propriété Cells).
Tu vas donc devoir gérer cela.
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009
6 mars 2007 à 19:22
Merci à toi ThWilliam,
Je me posais la question sur TCustomGrid, car je comptais le remplir via une base de données et j'en suis arrivé à ta conclusion qu'il ne mémorisait pas le contenu, ce qui est gênant. Je vais voir du coté d'un TStringGrid. Merci pour ton explication de l'erreur abstraite, ça je ne le savais malgrès mes recherche dans l'aide de delphi qui n'est pas très limpide....
A+
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
6 mars 2007 à 22:20
re,

il existe des compos spéciaux pour les base de données! Vu que je ne m'en sert jamais, je ne peux pas d'en dire tellement plus. mais regarde genre TDBGrid. Ne reinvente pas la roue si tu peux l'éviter ;-)

A+

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009
7 mars 2007 à 07:54
Bonjour à tous,
Je reviens sur cette discussion très enrichissante, et la nuit portant conseil, je vais finalement dériver un TStringGrid qui m'apporte plus que TCustomGrid.
Mais je veux quand même masquer certaine propriétés.
Sur le fond j'ai bien compris les conseils de Loda (override) mais je bloque sur l'écriture.
Pour exemple je voudrais masquer la propriété FixedCols :
La variable et la procédure (SetFixedCols) sont déclarés dans TCustomGrid.
La "property FixedCols" est déclarée dans TDrawGrid (ancêtre directe).
Malgrès moulte recherche et essai je suis toujours dans le potage....
Je suis consciens qu'écrire une proc pour ne pas s'en servir n'est pas très sain.......
A+
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009
7 mars 2007 à 08:11
Bonjour Loda,
Ma première intension était de partir sur un TDBGrid, mais en vérité je veux créer un composant ListBox multi colonnes ou je pourrait masquer la premièrere colonne, aligner le texte, changer la couleur suivant le texte.........La ListBox ne doit pas être reliée à une base de donnée, car elle me sert simplement de visuel pour recherche ou imprimer. Je la remplis en fonction d'unr requête SQL sur ma base.
A+
0
Rejoignez-nous