IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

[TListColumn] Comment le surcharger notemment pour l'IDE ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut [TListColumn] Comment le surcharger notemment pour l'IDE ?
    Bsr,

    Je pose la question à tout hasard :

    existe-t-il un moyen de surcharger (surtout de rajouter des propriétés à l'objet TListColumn) utilisé par le TListView sans avoir à tout recoder ?

    Evidemment il faudrait que ce fonctionne dans l'IDE .


    Si quelqu'un à un idée géniale je suis preneur

    @+
    php

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    surcharger quoi?

  3. #3
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Bien sûr que tu peux surcharger TListColumn. Qu'est-ce qui te gène ?

  4. #4
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Bsr,

    Je m'explique.

    Je veux pouvoir faire ceci.

    Je créé un nouveau composant TBOListView dérivé de TListView : ok


    Je créé un nouvelle classe TBOListColumn dérivée de TListColumn mais avec en plus la propriété publiée DisplayFormat

    Je dépose un composant TBOListView sur une fiche.
    Ds l'inspecteur d'objets je clique dans sa propriété Columns ce qui lance l'éditeur de collection.

    Je veux que ma collection Columns contienne des élts de type TBOListColumn et pas simplement TListColumn : bref je veux voir apparaître dans l'inspecteur d'objets toutes les propriétés du TListColumn avec en plus ma propriété DisplayFormat .

    Je veux surtout que mes nouvelles propriétés "suivent" lorsqu'on modifie l'ordre de colonne.


    Comment faire ?

    @+
    Php

  5. #5
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    De quel type est TListColumn? TObjectList? TCollection?

  6. #6
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Good morning ...

    Et bien en fait un TListColumn dérive de TCollectionItem et TListColumns de TCollection.

    Ces 2 classes font parties de la VCL et se trouvent dans l'unité ComCtrls.
    Elles sont utilisées par le TLisTView.

    Voilà

    @+
    Php

  7. #7
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    OK ben il ne te reste plus qu'à créer une TBOCollection et une TBOCollectionItem qui répond à tes attentes

  8. #8
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Qu'est-ce qui te bloque alors?
    cf :http://www.developpez.net/forums/viewtopic.php?t=346422

  9. #9
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Le TListView se base en interne sur la variable
    FListColumns: TListColumns;

    Cette variable est créé ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    constructor TCustomListView.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      ...   
      FListColumns := TListColumns.Create(Self);
      ...
    end;
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    constructor TListColumns.Create(AOwner: TCustomListView);
    begin
      inherited Create(TListColumn);
      FOwner := AOwner;
    end;

    Le pb est que le constructeur de TListColumns !

    Autrement dit lorsque je dérive ma classe TBOListColumns de TListColumns je ne peux pas faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    constructor TBOListColumns.Create(AOwner: TCustomListView);
    begin
      inherited Create(TBOListColumn);   <-- Impossible 
      FOwner := AOwner;
    end;

    En fait inherited Create correspond à TListColumns.Create(AOwner: TCustomListView);


    Maintenant si j'écris :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    constructor TBOListColumns.Create(AOwner: TCustomListView);
    begin
      TCollection(Self).Create(TBOListColumn);   
      FOwner := AOwner;
    end;
    Qu'est-ce que ca fait ?

    @+
    Php

  10. #10
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Ben et le cast ça sert à quoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      inherited Create(TBOListView(AOwner));   <-- C'est possible
      FOwner := AOwner;
    Voila
    Sinon, si tu fais:
    Citation Envoyé par phplive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    constructor TBOListColumns.Create(AOwner: TCustomListView); 
    begin 
      TCollection(Self).Create(TBOListColumn);    
      FOwner := AOwner; 
    end;
    Déjà, le cast de TCollection ne sert à rien puisque self descend d'un TCollection... Et puis tu crées quelque chose mais tu n'as plus aucun moyen de le retrouver... Ce n'est pas la bonne méthode...
    Si tu as DelphiX, je te conseille d'aller voir les sources de TDXImageList qui utilise un descendant de TCollection et de TCollectionItem... C'est de cette source que je me suis inspiré pour mes composants...
    Bon dev'

  11. #11
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Pedro204
    Ben et le cast ça sert à quoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      inherited Create(TBOListView(AOwner));   <-- C'est possible
      FOwner := AOwner;

    Par TBOListView tu entends TBOListColumn je suppose ...

    Là je ne vois pas à quoi un cast de AOwner peut bien me servir ?
    AOwner contient la listview ca n'a rien à voir

  12. #12
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Houla attends je crois qu'on se mélange les pinceaux là...
    Reprenons du début:
    - L'objet de départ est un TListView
    - Il contient un descendant de TCollection avec un Create(AOwner:TComponent)
    - Dans ce TCollection, il y a des TCollectionItems qui ont leur Create(Collection:TCollection)...
    Donc tu as uniquement à caster dans le Create du TCollectionItems avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    constructor TBOCollectionItems.Create(Collection: TBOCollection); 
    begin 
      inherited Create(TCollection(AOwner));
      FOwner := AOwner; 
    end;
    Et quand tu crées un TBOCollectionItems, tu mets le TBOCollection qui la contient...

  13. #13
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Oui d'accord

    Mais je crois qu'on est pas en phase

    Ici TListColumns (avec un s) est l'objet TCollection !
    TListColumn (sans s) lui est l'item !

    En fait le code complet tiré de la VCL est :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      TListColumns = class(TCollection)
      private
        FOwner: TCustomListView;
        function GetItem(Index: Integer): TListColumn;
        procedure SetItem(Index: Integer; Value: TListColumn);
        procedure UpdateCols;
      protected
        function GetOwner: TPersistent; override;
        procedure Update(Item: TCollectionItem); override;
      public
        constructor Create(AOwner: TCustomListView);
        function Add: TListColumn;
        function Owner: TCustomListView;
        property Items[Index: Integer]: TListColumn read GetItem write SetItem; default;
      end;
    C'est Delphi qui va créer automatiquement les éléments TListColum de le listview (et pas moi !) lors de la lecture du DFM on est bien d'accord en s'appuyant sur la propriété Columns qui elle est LA collection.

    La collection Columns, elle, sait comment créer ses éléments grâce à sa propriété FItemClass qui contient TListColum (sous entendu item)


    Mon pb se résume donc à parvenir à initialiser FItemClass dans la collection avec TBOListColumn

    j'vais jamais y arriver

  14. #14
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par phplive
    Ici TListColumns (avec un s) est l'objet TCollection !
    TListColumn (sans s) lui est l'item !
    Ca j'avais bien compris
    Je disais ça pour résumer

    En fait si tu regarde bien, Dans ton TListView, tu n'accède pas directement à son TListColumns mais à une propriété Columns qui est juste une TStrings...
    En modifiant cette propriété, le composants crée et détruit les TListColumn... Il ne tient donc qu'à toi d'intercepter le changement de cette propriété...

    Citation Envoyé par phplive
    j'vais jamais y arriver
    Meuh si

  15. #15
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Bon,

    ben j'essairai de créer un compo à partir de tout ca

    si ca marche je le mettrais en ligne

    Merci

    @+
    Php

Discussions similaires

  1. Comment faire des etats pour une application web ?
    Par ovh dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 06/07/2021, 04h25
  2. Réponses: 7
    Dernier message: 21/10/2004, 10h13
  3. [PowerAMC] Comment s'en servir pour creer une base?
    Par Elmilouse dans le forum Access
    Réponses: 2
    Dernier message: 27/07/2004, 10h53
  4. [JSP]comment créer un listener pour ma base de données
    Par Ekimasu dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 10/05/2004, 15h49
  5. Comment créé une "interface" pour mes programmes??
    Par alcazar dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 09/02/2004, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo