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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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