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 :

TImageIndex et Editeur de propriété


Sujet :

Composants VCL Delphi

  1. #1
    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 TImageIndex et Editeur de propriété
    Bonjour à tous

    Je suis en train d'essayer de régler un petit problème sans réelle gravité mais ça me turlupine.
    Dans une même unité, j'ai une dizaine de composants. En particulier 2:

    • Un simple dérivant de TGraphicControl
    • Un plus complexe contenant une TOwnedColletion et des Items dedans.

    Dans le premier cas, le composant a des propriétés Images: TCustomImageList et ImageIndex: TImageIndex.
    Dans le second cas, le composant "parent" a une propriété Images: TCustomImageList et l'Item a une propriété ImageIndex: TImageIndex.


    Je voudrais qu'en Design-time, dans l'inspecteur d'objets, ImageIndex m'affiche la liste des images disponibles pour chacun de ces objets.


    Eh bien, contrairement à ce que l'on pourrait penser, dans le premier cas, ça ne fonctionne pas (il m'affiche une liste vide) alors que le second cas, Delphi arrive sans intervention de ma part (je n'ai fait aucune nouvelle propriété d'éditeur) à trouver ses petits et les images (de l'item contenu dans la collection contenue dans le composant qui détient le TImageList) s'affichent correctement...


    Quel est ce mystère ?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    le composant "parent" c'est ton composant complexe ?

    ton composant complexe est aussi un TGraphicControl ou un TWinControl ou même un TCustomPanel ?

    Comme TCustomImageList et TImageIndex sont des types standards, faut-il nécessairement utilise un RegisterEditorProperty explicite ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    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 Shai
    Citation Envoyé par ShaiLeTroll Voir le message
    le composant "parent" c'est ton composant complexe ?
    Exactement, c'est celui qui contient la collection qui elle-même contient les Items.
    Citation Envoyé par ShaiLeTroll Voir le message
    ton composant complexe est aussi un TGraphicControl ou un TWinControl ou même un TCustomPanel ?
    Aucun de ceux-là: c'est un TCustomControl à la base
    Citation Envoyé par ShaiLeTroll Voir le message
    Comme TCustomImageList et TImageIndex sont des types standards, faut-il nécessairement utilise un RegisterEditorProperty explicite ?
    C'est justement la question que je me pose. Si Delphi arrive à retrouver tout seul le "lien" entre ImageIndex d'un Item et Images du parent de son parent, c'est étonnant qu'il n'arrive pas à retrouver la même chose lorsque les propriétés sont au même "niveau".

    D'où mon étonnement...

    [EDIT]
    Un de mes tests a d'ailleurs été de faire hériter mon objet simple depuis un TCustomControl comme l'autre sans résultat...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  4. #4
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Bonjour,

    Je relance ce sujet qui me pose également problème.
    Quelqu'un a t il réussi à incorporer la gestion des propriétés TImageIndex dans un composant dérivé d'un parent n'en étant pas pourvu ?

    L'objectif étant d'avoir la liste déroulante des Index d'image avec l'image d'affichée, dans l'éditeur de propriété.

    Pour être plus clair, si je pars d'un composant possédant ces propriétés, par exemple un TButtonEdit et que je le dérive en TMyButtonEdit,
    tel que
    TMyButtonEdit = class(TButtonEdit)

    Pas de problème, je récupère correctement et sans difficulté la liste déroulante, puisque tout est Issu du TButtonEdit.

    Mais si je dérive de son Parent TCustomButtonedEdit, qui lui ne possède pas les éléments TImageIndex et TCustomImageList, que je rajoute dans le code à l'identique d'un TButtonEdit...NADA, pas de liste déroulante.

    Si l'un d'entre vous a trouvé la solution, je veux bien un coup de main,


    Merci
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    je dérive de son Parent TCustomButtonedEdit
    Ce dernier a une propriété Images public (dans l'aide de Delphi 10.4) ; la passer en published est pê nécessaire ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    Je n'ai jamais fait ça mais en suivant le code dans cette discussion je suis parvenu a créer un petit exemple avec propriété de type TImageIndex sous Delphi 10.2 .. n'oubliez pas d'ajouter DesignIde dans votre package c'est très important.

    https://www.developpez.net/forums/d1...esourcestring/

    Nom : img.png
Affichages : 205
Taille : 13,2 Ko

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     unit Component1;
     
    interface
     
    uses
      System.SysUtils, System.Classes,System.UITypes , Vcl.controls;
     
    type
      TCImgListp = class(TComponent)
      private
        { Déclarations privées }
      protected
        FImages: TImageList;
        FImageIndex:TImageIndex;
      public
        { Déclarations publiques }
      published
        property Images: TImageList read FImages write FImages;
        property ImageIndex: TImageIndex read FImageIndex write FImageIndex;
      end;
     
     
    implementation
     
     
    end.
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    unit opp;
     
    interface
     
    uses
      System.SysUtils, System.Types,System.Classes, DesignIntf, DesignEditors, VCLEditors,
      Vcl.ImgList, System.UITypes, Vcl.Graphics;
     
    type
      TImageIndexProperty = class(TIntegerProperty, ICustomPropertyListDrawing)
      protected
        function GetImages: TCustomImageList;
      public
        function GetAttributes: TPropertyAttributes; override;
        procedure GetValues(Proc: TGetStrProc); override;
        function GetValue: string; override;
        procedure SetValue(const Value: string); override;
     
        // ICustomPropertyListDrawing
        procedure ListMeasureHeight(const Value: string; ACanvas: TCanvas;
          var AHeight: Integer);
        procedure ListMeasureWidth(const Value: string; ACanvas: TCanvas;
          var AWidth: Integer);
        procedure ListDrawValue(const Value: string; ACanvas: TCanvas;
          const ARect: TRect; ASelected: Boolean);
      end;
     
    procedure Register;
     
    implementation
     
    uses
      TypInfo,Component1;
     
    procedure Register;
    begin
      RegisterComponents('Samples', [TCImgListp]);
      RegisterPropertyEditor(TypeInfo(TImageIndex), TCImgListp, 'ImageIndex', TImageIndexProperty);
     
    end;
     
    { TImageIndexProperty }
     
    function TImageIndexProperty.GetAttributes: TPropertyAttributes;
    begin
      Result := [paValueList, paRevertable];
    end;
     
    function TImageIndexProperty.GetImages: TCustomImageList;
    begin
      Result := GetObjectProp(GetComponent(0), 'Images') as TCustomImageList;
    end;
     
    function TImageIndexProperty.GetValue: string;
    begin
      Result := IntToStr(GetOrdValue);
    end;
     
    procedure TImageIndexProperty.GetValues(Proc: TGetStrProc);
    var
      I: Integer;
    begin
      Proc('-1');
      if GetImages <> nil then
        for I := 0 to GetImages.Count - 1 do
          Proc(IntToStr(I));
    end;
     
    procedure TImageIndexProperty.ListDrawValue(const Value: string;
      ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
    var
      ImgWidth: Integer;
    begin
      with ACanvas do
      begin
        if GetImages <> nil then
        begin
          FillRect(ARect);
          if ASelected then
            DrawFocusRect(ARect);
          ImgWidth := GetImages.Width + 2 * 2;
          GetImages.Draw(ACanvas, ARect.Left + 2,
            (ARect.Top + ARect.Bottom - GetImages.Height) div 2, StrToInt(Value));
        end
        else
          ImgWidth := 0;
        TextOut(ARect.Left + ImgWidth + 2,
          (ARect.Top + ARect.Bottom - TextHeight(Value)) div 2, Value);
      end;
    end;
     
    procedure TImageIndexProperty.ListMeasureHeight(const Value: string;
      ACanvas: TCanvas; var AHeight: Integer);
    var
      ImgList: TCustomImageList;
      ImgHeight, StrHeight: Integer;
    begin
      ImgList := GetImages;
      if Assigned(ImgList) then
        ImgHeight := ImgList.Height + 2 * 2
      else
        ImgHeight := 0;
     
      StrHeight := ACanvas.TextHeight(Value);
      if StrHeight > ImgHeight then
        AHeight := StrHeight
      else
        AHeight := ImgHeight;
    end;
     
    procedure TImageIndexProperty.ListMeasureWidth(const Value: string;
      ACanvas: TCanvas; var AWidth: Integer);
    var
      ImgList: TCustomImageList;
      ImgWidth, StrWidth: Integer;
    begin
      ImgList := GetImages;
      if Assigned(ImgList) then
        ImgWidth  := ImgList.Width + 2 * 2
      else
        ImgWidth := 0;
      StrWidth := ACanvas.TextWidth(Value) + 2 * 2;
      AWidth := ImgWidth + StrWidth;
    end;
     
    procedure TImageIndexProperty.SetValue(const Value: string);
    begin
      SetOrdValue(StrToInt(Value));
    end;
     
    end.

  7. #7
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Bonjour,

    Wheel, merci pour ce bout de code, explicite !

    Tu as donc créé un éditeur de prop et tu l'as register pour ton composant.

    J'avais cherché dans les sources, il existe un éditeur de propriété pour ImageList, l'as tu essayé TImageListEditor ?
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  8. #8
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Hello

    On a vu ça la semaine dernière sur mes live Twitch liés à la création d'une boite de dialogue "à propos" sous forme de composant : par défaut l'inspecteur de propriété a un wizard qui s'applique aux composants ayant une propriété publiée "Images" (TCustomImages) à toutes ses propriétés finissant par ImageIndex (de type TImageIndex) et ImageName (de type TImageName).

    En FMX il n'y a pour le moment seul l'index qui est géré.

    En VCL on peut se contenter de l'index, mais depuis la 10.4 on peut aussi utiliser le nom des images avec ImageName si on passe par les TVirtualImageList et TImageCollection.

    Pas besoin de faire nous-même un assistant pour les gérer, ni d'avoir un ancêtre graphique. Ca passe même sur un descendant de TComponent (non visuel). C'est référencé dans l'IDE sur le TCustomImageList.

  9. #9
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Pprem,

    merci pour ta contribution, mais je suis en XE7... donc pas d'imagename.

    En tout cas un grand merci à wheel, car son bout de code très simple et bien ciblé m'a permis de mettre en œuvre très rapidement.
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  10. #10
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par castorcharly Voir le message
    merci pour ta contribution, mais je suis en XE7... donc pas d'imagename.
    ok, donc fais sans, juste ImageIndex et Images devrait fonctionner depuis que Delphi a un assistant sur les propriétés.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. XN Resource Editor : Editeur de ressources et de propriétés de composants
    Par forum dans le forum Outils à télécharger
    Réponses: 5
    Dernier message: 18/01/2013, 14h52
  2. l'editeur vb ne me propose pas les propriétés pour les objet
    Par abj8077 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 10/10/2010, 14h58
  3. Editeur de propriété pour champs de BDD
    Par Teaniel dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/07/2010, 14h26
  4. [composant] Reutiliser un editeur de propriété
    Par pirbd dans le forum Delphi
    Réponses: 2
    Dernier message: 31/05/2006, 10h27
  5. editeur de propriétés
    Par naïla dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/06/2003, 23h40

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