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

Lazarus Pascal Discussion :

Utilisation de RadioGroup.Items.AddObject [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut Utilisation de RadioGroup.Items.AddObject
    Bonjour,

    j'essaie de reproduire l'exemple pour Delphi situé ici qui consiste à remplir automatiquement un RadioGroup avec les valeurs possibles de la propriété ViewStyle du contrôle ListView.

    Dans cette partie,

    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
    Procedure TForm1.FormShow(Sender: TObject);
    //List ListView VievStyle's in a Radio Button List
    var
      vs : TViewStyle;
      vss : string;
    begin
    for vs in [Low(TViewStyle) .. High(TViewStyle)] do
      begin
        //get enum name as string
        vss := GetEnumName(TypeInfo(TViewStyle), integer(vs)) ;
     
        //add enum to a radio button list
        RadioGroup1.Items.AddObject(vss, TObject(vs));
      end;
    end;
    la ligne RadioGroup1.Items.AddObject(vss, TObject(vs)); est en erreur :

    unit1.pas(47,39) Error: Illegal type conversion: "<enumeration type>" to "TObject"

    Je ne vois pas comment passer cette erreur.

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    A priori delphi doit avoir un mecanisme qui permet la conversion d'un enum en un objet par TObject(vs) et la conversion inverse. Ce mecanisme qui ressemble à l'autoboxing de java n'existe pas en FreePascal. Tu vas donc devoir creer toi même une classe pour contenir un TViewStyle. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    type 
      TViewStyleClass = class
        private
          FValue: TViewStyle;
        public
          constructor Create(Value: TViewStyle);
     
          function GetValue: TViewStyle;
       end;
    Je ne detaille pas l'implémentation elle doit être assez evidente. Avec cette classe ton exemple devient donc quelque chose comme ça :

    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
     
    Procedure TForm1.FormShow(Sender: TObject);
    //List ListView VievStyle's in a Radio Button List
    var
      vs : TViewStyle;
      vss : string;
      vsobject : TViewStyleClass;
    begin
    for vs in [Low(TViewStyle) .. High(TViewStyle)] do
      begin
        //get enum name as string
        vss := GetEnumName(TypeInfo(TViewStyle), integer(vs)) ;
     
        vsobject:=TViewStyle.Create(vs);
     
        //add enum to a radio button list
        RadioGroup1.Items.AddObject(vss, vsobject);
      end;
    end;
    La récupération de la valeur devrait ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TForm.RadioGroupClick(Sender: TObject) ;
     var
       vs : TViewStyle;
       vsobject : TViewStyleClass;
     begin
       vsobject:=RadioGroup.Items.Objects[RadioGroup.ItemIndex];
     
       //get the enum value
       vs := vsobject.GetValue;
     
       //change the enumerated property of a control
       ListView1.ViewStyle := vs;
     end;
    J'ai fais ça un peu à l'arrache et sans tester donc c'est pas certain que ça marche...

    Enfin, en complement, à partir de FreePascal 2.4.0, on peu convertir un enum en chaîne de façon beaucoup plus elegante. A la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vss := GetEnumName(TypeInfo(TViewStyle), integer(vs)) ;
    on peut ecrire et pas besoin de 'uses TypInfo;'

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut
    Ah,

    merci pour les infos, j'avance mais j'ai un problème sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vsobject:=RadioGroup.Items.Objects[RadioGroup.ItemIndex];
    j'ai
    unit1.pas(59,25) Error: Incompatible types: got "TObject" expected "TViewStyleClass"
    j'ai essayé de transtyper par
    vsobject := RadioGroup.Items.Objects[RadioGroup.ItemIndex] as TViewStyleClass;

    mais j'ai un SIGSEGV sur la même ligne en sortie de /lcl/include/radiogroup.inc/TCustomRadioGroup.GetItemIndex (FItemIndex a bien la valeur 1 2 etc selon le cas):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function TCustomRadioGroup.GetItemIndex : integer;
    begin
      //debugln('TCustomRadioGroup.GetItemIndex ',dbgsName(Self),' FItemIndex=',dbgs(FItemIndex));
      Result := FItemIndex;
    end;

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Effectivement il faut un transtypage.

    J'ai testé sur un petit projet exemple et tout semble fonctionner (lazarus 9.28.2 + fpc 2.4.0 + linux).

    Peut être que si tu postais ton projet ici...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut
    eh bien dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.RadioGroupClick(Sender: TObject);
    var
      vs : TViewStyle;
      vsobject : TViewStyleClass;
    begin
      --->> vsobject := RadioGroup.Items.Objects[RadioGroup.ItemIndex] as TViewStyleClass;
     
      //get the enum value
      vs := vsobject.GetValue;
     
      //change the enumerated property of a control
      ListView1.ViewStyle := vs;
    end;
    Dès qu'il rentre sur la ligne incriminée, en debug détaillé il rentre dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function TCustomRadioGroup.GetItemIndex : integer;
    begin
      //debugln('TCustomRadioGroup.GetItemIndex ',dbgsName(Self),' FItemIndex=',dbgs(FItemIndex));
      Result := FItemIndex;
    end;
    dès qu'il passe sur le end de cette fonction j'ai l'erreur.

  6. #6
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    J'ai bien compris ton problème mais, avec le même code, chez moi, avec les versions de lazarus et fpc que je t'ai indiqué, ça marche. Tu peux essayer de poster ton projet ici et je regarderai si j'ai le même problème que toi.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut
    OK,

    ci-joint
    Fichiers attachés Fichiers attachés

  8. #8
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    J'ai corrigé 2 méthodes dans ton projet :

    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
     
    constructor TViewStyleClass.Create(Value: TViewStyle);
    begin
      FValue:=Value;   { <=== }
      inherited Create;
    end;   
     
    procedure TForm1.RadioGroupClick(Sender: TObject);
    var
      vs : TViewStyle;
      vsobject : TViewStyleClass;
    begin
      vsobject := RadioGroup.Items.Objects[RadioGroup.ItemIndex] as TViewStyleClass;
     
     
      //get the enum value
      vs := vsobject.GetValue;
     
      //change the enumerated property of a control
      ListView1.ViewStyle := vs;
     
      // debug fpc >= 2.4.0
      WriteLn('RadioGroup.ItemIndex=', RadioGroup.ItemIndex);
      WriteLn('Style=', vs);
    end;
    Avec ça ça marche.

    PS: J'allais oublié j'ai aussi du changer le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for vs in [Low(TViewStyle)..High(TViewStyle)] do
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for vs:=Low(TViewStyle) to High(TViewStyle) do

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut
    Merci,

    mais j'ai toujours la même erreur Tu as juste fais les deux modifs rien d'autre ? J'ai essayé avec la dernière version de Lazarus et FPC 2.4,1, et Lazarus 0.9.28.3 et FPC 2.4.0.

    Pour le champ FValue, mea culpa, pour la syntaxe de la boucle, qu'est-ce qui ne va pas avec l'ancienne ?

  10. #10
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Oui j'ai juste fait les modifications indiquées. Mais j'utilise Lazarus 9.28.2 et fpc 2.4.0.

    Pour la syntaxe de la boucle mon fpc 2.4.0 n'en voulait pas. Peut être que la boucle 'for X in [ .. ]' est une nouveauté de la version 2.4.1.

  11. #11
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Je viens de vérifier et je me suis effectivement trompé dans les modifications que je t'ai donné.

    Les bonnes modifications sont :
    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
     
    constructor TViewStyleClass.Create(Value: TViewStyle);
    begin
      inherited Create;
      FValue:=Value; { <== }
    end;   
     
    procedure TForm1.FormShow(Sender: TObject);
     //List ListView VievStyle's in a Radio Button List
     var
       vs : TViewStyle;
       vss : string;
       vsobject : TViewStyleClass;
    begin
    for vs:=Low(TViewStyle) to High(TViewStyle) do
      begin
        //get enum name as string
        vss := GetEnumName(TypeInfo(TViewStyle), integer(vs)) ;
     
        vsobject:=TViewStyleClass.Create(vs); { <== }
     
        //add enum to a radio button list
        //RadioGroup.Items.AddObject(vss, TObject(vs));
        RadioGroup.Items.AddObject(vss, vsobject);
      end;
    end;
    Pour éviter une nouvelle erreur je joins une version modifiée de ton projet.

    J'ai testé sous Lazarus 9.28.2 + FPC 2.24 sous windows et ça marche aussi.
    Fichiers attachés Fichiers attachés

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut
    Oui çà marche, super.

    Se lance sans erreur avec le même code et en plus à la fois en 2.2.5 et 2.4, à la différence pres que les clics sur les radiobox n'ont aucun effet en 2.2.5.

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

Discussions similaires

  1. Charger une combobox avec Items.AddObject
    Par Delphi-ne dans le forum Composants VCL
    Réponses: 5
    Dernier message: 02/04/2015, 14h25
  2. [Lazarus] [Ubuntu 64 bits] Problème avec Tcombobox.Items.AddObject
    Par pomalo dans le forum Lazarus
    Réponses: 1
    Dernier message: 20/08/2009, 22h35
  3. Utilisation de chart Item
    Par moezsokrati dans le forum Forms
    Réponses: 2
    Dernier message: 19/11/2008, 14h17
  4. Réponses: 2
    Dernier message: 27/08/2008, 10h58
  5. [C#] Utiliser un ListViewItem Item
    Par todier dans le forum C#
    Réponses: 1
    Dernier message: 19/05/2007, 15h25

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