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 :

[DXE] Composant : Utilisation dans l'inspecteur d'objet de resourcestring ?


Sujet :

Composants VCL Delphi

  1. #1
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut [DXE] Composant : Utilisation dans l'inspecteur d'objet de resourcestring ?
    Est il possible d'utiliser des resourcesstring avec les propriétés d'un composant dans l'inspecteur d'objet ?

    Par exemple j'ai les resourcestring suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MaRes1 = 'Toto';
    MaRes2 = 'Titi';
    Puis dans l'inspecteur d'objet j'aimerai pouvoir soit sélectionner (La j'ai un doute sur la faisabilité) ou soit saisir le resourcestring dont j'aurais besoin pour diverses actions.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    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 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Utilise une énumération en définissant tes propres IntToIdent\IdentToInt
    Ensuite tu enregistre via RegisterIntegerConsts les méthodes que tu as définie
    RegisterPropertyEditor lui te permettra de définir un editeur plus avancé au besoin
    voir l'unité DesignEditors

    Regarde TColor, IdentToColor et ColorToIdent, cela te donnera un bon exemple !
    Je ne l'ai jamais essayé mais j'avais regardé ce problème pour répondre au sujet Enumération ET entier correspondant

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Utilise une énumération en définissant tes propres IntToIdent\IdentToInt
    Ensuite tu enregistre via RegisterIntegerConsts les méthodes que tu as définie
    RegisterPropertyEditor lui te permettra de définir un editeur plus avancé au besoin
    voir l'unité DesignEditors

    Regarde TColor, IdentToColor et ColorToIdent, cela te donnera un bon exemple !
    Je ne l'ai jamais essayé mais j'avais regardé ce problème pour répondre au sujet Enumération ET entier correspondant
    Merci pour tes infos

    Petite question dans la continuité : Est ce que ce système fonctionnerai pour le ImageIndex pour les images ?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    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 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Si tu définie une propriété ImageIndex de type Enumération (au lieu de Integer) dans ton nouveau control
    Je suppose que ce ImageIndex servirait avec une TImageList associée à ton control
    Dans le Setter, tu peux affecter un ImageIndex d'une TImageList associé la valeur entière Ord(ValeurEnumérée)
    Je ne sais pas ce que tu veux faire exactement, mais cela me semble cohérent

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Si tu définie une propriété ImageIndex de type Enumération (au lieu de Integer) dans ton nouveau control
    Je suppose que ce ImageIndex servirait avec une TImageList associée à ton control
    Dans le Setter, tu peux affecter un ImageIndex d'une TImageList associé la valeur entière Ord(ValeurEnumérée)
    Je ne sais pas ce que tu veux faire exactement, mais cela me semble cohérent
    En fait j'ai deux choses dont j'ai besoin au niveau d'un nouveau composant que je suis en train de faire pour ma boite.

    - Gérer dans les propriétés du composants des resourcestring (mais pour cela tu m'as fourni une solution possible plus haut)
    - Gérer les imageIndex commme dans certain composant qui affiche l'image dans l'inspecteur d'objet mais n'inscrive que l'index dans le dfm.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    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 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Pour l'affichage de l'Image, tu peux utiliser ton propre editeur qui tu recenses avec RegisterPropertyEditor
    Tu peux faire des ecrans assez complet, regarde les Items d'un TListView ou TImageList, c'est un bel exemple d'éditeur avancé !

    Peut-être, si l'image n'est pas trop grosse, tu pourrais faire comme celui de TColor, un combo avec l'image

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Peut-être, si l'image n'est pas trop grosse, tu pourrais faire comme celui de TColor, un combo avec l'image
    C'est exactement ce que je cherche à faire mais en regardant divers composants je n'ai pas compris comment il faisait ça (MenuItem par exemple)
    Sinon les images seront en 16x16, 24x24, 32x32 ou 48x48.

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par Rayek Voir le message
    - Gérer les imageIndex comme dans certain composant qui affiche l'image dans l'inspecteur d'objet mais n'inscrive que l'index dans le dfm.
    Je savais bien que j'avais ça en stock.

    Cela est faisable mais il faut que tu implémentes ta propre classe héritant de TIntegerProperty ainsi que l'interface ICustomPropertyListDrawing (définie dans VCLEditors).
    Tu obtiens une liste déroulante avec l'image et l'index correspondant, dont la hauteur s'adapte automatiquement en fonction des images du TImageList (propriété Images).

    Cela donne ceci:
    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
    unit uRayekCompoReg;
     
    interface
     
    uses
      SysUtils, Classes, Types, DesignIntf, DesignEditors, VCLEditors,
      ImgList, Graphics, uRayekCompo;
     
    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;
     
    procedure Register;
    begin
      RegisterPropertyEditor(TypeInfo(TImageIndex), TRayekCompo, 'ImageIndex', TImageIndexProperty);
      RegisterComponents('Ta palette', [TRayekCompo]);
    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.
    @+ Claudius

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Nikel, ça fonctionne parfaitement.

    unit uRayekCompoReg;


    [Edit]
    En fait je me retrouve avec un petit problème.

    J'ai deux packages pkgPanel et dclPkgPanel.
    Dans les deux j'ai mis designide dans les requires
    Je compile les deux packages sans soucis et j'installe dclpackage sans problème.
    Mais lorsque je veux utiliser le composant dans un programme, je me retrouve avec l'erreur "Fichier Introuvable : Designintf.dcu"
    En recherchant je trouve qu'il se trouve dans ToolsApi.
    Je rajoute donc le chemin vers le répertoire ToolsApi et la autre erreur après compilation du projet : "Fichier introuvable : DockForm.dcu" et la le drame impossible de trouver un .pas correspondant.

    Une idée pour la suite ?

    [Edit 2 le retour du comeback]
    C'est bon en fait :
    - Ne mettre designide que dans les requires de la partie designtime (le package dcl ^^)
    - Virer les résidus vers les unites utilisants ce Designide

    Merci a tous pour vos codes et conseils

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 01/03/2013, 00h50
  2. Problème d'affichage de Propriété dans l'inspecteur d'objet
    Par saidus dans le forum Composants VCL
    Réponses: 8
    Dernier message: 06/04/2008, 17h36
  3. Réponses: 0
    Dernier message: 18/12/2007, 13h59
  4. Réponses: 19
    Dernier message: 29/05/2007, 16h21
  5. Retour chariot dans l'inspecteur d'objet
    Par All Jinx dans le forum Composants VCL
    Réponses: 3
    Dernier message: 20/10/2004, 01h28

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