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
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009

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+
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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)
Messages postés
93
Date d'inscription
mardi 11 avril 2006
Statut
Membre
Dernière intervention
4 mars 2009

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

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 ??
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
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.
Messages postés
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009

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+
Messages postés
93
Date d'inscription
mardi 11 avril 2006
Statut
Membre
Dernière intervention
4 mars 2009

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+
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
@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.
Messages postés
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009

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+
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
@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.

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.
Messages postés
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009

Merci pour toutes ces réponses....
Maintenant je me mets au clavier....
A+
Messages postés
93
Date d'inscription
mardi 11 avril 2006
Statut
Membre
Dernière intervention
4 mars 2009

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
Messages postés
93
Date d'inscription
mardi 11 avril 2006
Statut
Membre
Dernière intervention
4 mars 2009

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+
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
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 
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
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.
Messages postés
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009

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+
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
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.
Messages postés
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009

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+
Messages postés
118
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
17 novembre 2009

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+