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

Langage Delphi Discussion :

Type "set" et variable "set of" en string ?


Sujet :

Langage 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 Type "set" et variable "set of" en string ?
    Bjr

    j'aimerais pouvoir convertir des types énumérés ainsi que des variables de type ensemble en chaîne

    Bref si j'écris

    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
    type
      TState = ();
      TStates = set of TState;
     
     
    var
      States : TStates;
      Txt : String;
    begin
      States := [sModified,sNew];
     
      Txt = convert(TState); 
      // convert() doit retourner "[sNew,sModified,sLoaded]"
     
      Txt = convert(States); 
      // convert() doit retourner "[sNew,sModified]"   
     
    end;
    Existe-t-il des fonctions en Delphi 7 ?

    Y'a bien SetToString dans TypInfo mais elle ne fonctionne pas comme je voudrais

    Merci
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    je en sais pas s'il y a plus simple, mais je me souviens avoir codé un truc générique pour cela...

    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
     
    function FlagsToString(Flag:cardinal; Names:array of string):string;
    var
     i : integer;
    begin
     Result:='';
     i:=0;
     while Flag <>0 do begin
      if (Flag and (1 shl i))<>0 then begin
       Result:=Result+','+Names[i];
       dec(Flag,1 shl i);
      end;
      inc(i);
     end;
     if Result='' then 
      Result:='[]' 
     else begin
      Result[1]:='[';
      Result:=Result+']';
     end;
    end;
     
    const
     StateNames:array[TState]=(
     'sNew','sModified','sLoaded'
     );
    begin
     Tx:=FlagsToString(ord(States),StateNames);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 428
    Points : 5 835
    Points
    5 835
    Par défaut
    salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    uses TypeInfo;
    ...
    begin
     for AState:=Low(TStates) to High(TStates) do
          if AState in States then
             st := st + GetEnumName(TypeInfo(TStates), Integer(AState)) + ' ';
    end;

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    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

    Dans le même esprit qu'anapurna, je verrais une fonction comme celle-ci:
    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
    uses
      TypInfo;
     
    function StatesToString(AStates: TStates): string;
    var
      AState: TState;
    begin
      Result := '';
      for AState := Low(TState) to High(TState) do
        if AState in AStates then
        begin
          if Result <> '' then
            Result := Result + ', ';
          Result := Result + GetEnumName(TypeInfo(TState), Ord(AState));
        end;
      Result := '[' + Result + ']';
    end;
    @+ Cl@udius

  5. #5
    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
    Low() et High() ne fonctionnent pas avec les types énumérés :
    erreur Types incompatibles

    Oups : autant pour moi ça fonctionne j'avais mis TStates au lieu de TState

    Par contre y'aurait pas un moyen de faire ça de façon générique valable quelquesoit le type ?
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

  6. #6
    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
    Re,

    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function EnumToString: string;
    var
      I: Integer;
    begin
      Result := '[';
      for I := Ord(Low(TState)) to Ord(High(TState)) do
        Result := Result + GetEnumName(TypeInfo(TState), I) + ', ';
      SetLength(Result, Length(Result) - 2);
      Result := Result + ']';
    end;
    @+

  7. #7
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Fonction EnumSetToStr de ma SCL

    C'est générique pour n'importe quel type à base de RTTI (même pour des set of Byte, d'ailleurs )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Str := EnumSetToStr(States, TypeInfo(TStates));
    // (ou TState à la place de TStates)
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    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 c'est bon

    Par contre y'aurait pas un moyen de faire ça de façon générique valable quelquesoit le type ?

    je sais je me répète

    Donc un mix de plusieurs solutions sans utiliser StateNames ni directement TState ?

    D'après le code trouvé dans TypInfo ça semble réalisable non ? Quitte à passer un PTypeInfo
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 428
    Points : 5 835
    Points
    5 835
    Par défaut
    salut

    pour la genericite il faut declarer le type ensemble du type
    typeinfo
    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
     
     
    uses
      SysUtils, TypInfo;
     
    function GetOrdValue(Info: PTypeInfo; const SetParam): Integer;
    begin
      Result := 0;
     
      case GetTypeData(Info)^.OrdType of
        otSByte, otUByte:
          Result := Byte(SetParam);
        otSWord, otUWord:
          Result := Word(SetParam);
        otSLong, otULong:
          Result := Integer(SetParam);
      end;
    end;
     
     
    function SetToString(Info: PTypeInfo; const SetParam; Brackets: Boolean): AnsiString;
    var
      S: TIntegerSet;
      TypeInfo: PTypeInfo;
      I: Integer;
    begin
      Result := '';
     
      Integer(S) := GetOrdValue(Info, SetParam);
      TypeInfo := GetTypeData(Info)^.CompType^;
      for I := 0 to SizeOf(Integer) * 8 - 1 do
        if I in S then
        begin
          if Result <> '' then
            Result := Result + ',';
          Result := Result + GetEnumName(TypeInfo, I);
        end;
      if Brackets then
        Result := '[' + Result + ']';
    end;

    utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str := function SetToString(TypeInfo(TState),State,true) ;
    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  10. #10
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par phplive Voir le message
    Oui c'est bon

    Par contre y'aurait pas un moyen de faire ça de façon générique valable quelquesoit le type ?

    je sais je me répète

    Donc un mix de plusieurs solutions sans utiliser StateNames ni directement TState ?

    D'après le code trouvé dans TypInfo ça semble réalisable non ? Quitte à passer un PTypeInfo
    Ben euh, c'est exactement ce que je proposais

    Edit : et c'est valable pour n'importe quelle taille d'ensemble. La version d'anapurna ne fonctionne pas pour les ensemble de plus de 32 bits.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 428
    Points : 5 835
    Points
    5 835
    Par défaut
    salut

    un ensemble ne peut pas depasser 255 si mais souvenir sont bon

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    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
    @sjrd

    Comment as-tu défini le type TSysByteSet ?

  13. #13
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Exact, mais à cause de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Integer(S) := GetOrdValue(Info, SetParam);
    Tu supposes que ton set fait la taille d'un Integer, ce qui n'est pas vrai. Déjà un TIntegerSet est stocké sur 32 octets (= 256 valeurs possibles / 8 bits par octet). Ensuite la taille de SetParam peut varier sensiblement entre 1 et 32 octets.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  14. #14
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    @sjrd

    Comment as-tu défini le type TSysByteSet ?
    Euh en fait c'est par analogie au TSysCharSet, c'est juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TSysByteSet = set of Byte;
    C'est le plus grand set possible, en fait.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  15. #15
    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
    Citation Envoyé par sjrd Voir le message
    C'est le plus grand set possible, en fait.
    Ah d'accord, merci.

  16. #16
    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
    Ha ben voilà !
    @+
    Php

    D7 Enterprise - XP sp2
    The Truth is Out There

  17. #17
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 428
    Points : 5 835
    Points
    5 835
    Par défaut
    salut

    la methode reprend 95% du code de la rtti
    la plus grosse modif est le GetOrdValue

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  18. #18
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par anapurna Voir le message
    la methode reprend 95% du code de la rtti
    RTTI <> l'unité TypInfo. Là tu parles de l'unité TypInfo.

    Et justement la routine SetToString de TypInfo ne gère pas les ensembles plus grands que 32 bits, c'est pour ça que j'ai récrit la mienne.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  19. #19
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 428
    Points : 5 835
    Points
    5 835
    Par défaut
    salut

    mais si j'ai bien lu ta methode tu ne dépasse pas non plus les 256 possibilité
    je vois pas bien la différence mis a part bien sur la façon dont c'est écrit

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  20. #20
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par anapurna Voir le message
    salut

    mais si j'ai bien lu ta methode tu ne dépasse pas non plus les 256 possibilité
    je vois pas bien la différence mis a part bien sur la façon dont c'est écrit

    @+ Phil
    ma méthode est la meilleur voila tout Surtout qu'elle permet d'utiliser des libellés indépendant des noms internes de la classe, elle fonctionne aussi pour des champs de bits qui ne sont pas des "set of"
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [SQL2k5][SSIS] Quotes générées dans mes variables dynamiques
    Par Ivynox dans le forum Développement
    Réponses: 0
    Dernier message: 09/08/2010, 10h45
  2. Réponses: 6
    Dernier message: 01/05/2009, 16h35
  3. [VBA-E] Erreur "Object variable or With block variable not set"
    Par @lex(is) dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/06/2006, 12h39
  4. [XSLT] 2.0 et variables node-set
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 24/01/2006, 17h01
  5. Réponses: 3
    Dernier message: 01/12/2004, 09h43

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