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

Delphi Discussion :

Récupérer le contenu d'un ensemble


Sujet :

Delphi

  1. #1
    Membre expérimenté

    Profil pro
    Enseignant
    Inscrit en
    Juillet 2003
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2003
    Messages : 296
    Par défaut Récupérer le contenu d'un ensemble
    Bonjour,

    Voici mon problème : je travaille avec des ensembles (set of char, set of integer,...) pour effectuer diverses opérations. L'utilisateur peut entrer les éléments du set via un TEdit. Pour éviter que l'utilisateur rentre à chaque fois une série, je voudrais faire un système de sauvegarde.
    Malheureusement, je ne trouve pas le moyen de lire chaque élément du set, afin de les mettre dans une string, par exemple.

    J'ai essayé la plupart des fonctions utilisables pour les tableaux, sans succès.

    Comment puis-je faire ?

    Merci d'avance,

  2. #2
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Voici la structure que je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Type
      TElements=(element1,element2,element3,...,elementN);
      TEnsemble=set of TElements; 
    //......
    var ensemble:TEnsemble;
    begin
      memo1.Clear;
      ensemble:=[element2, elementN, element5];
      for i:=ord(element1) to ord(elementN) do
         if (TElement(i) in ensemble) 
         then memo1.Lines.add('L''élément n° '+IntToStr(i)+' est dans l''ensemble);
    end;
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Type
      TJours=(Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche);
      T_Pas_d_Ecole_Pour_Les_Enfants=set of TJours;
    //......
    var ensemble:T_Pas_d_Ecole_Pour_Les_Enfants;
    begin
      memo1.Clear;
      ensemble:=[Mercredi, Samedi, Dimanche];
      for i:=ord(Lundi) to ord(Dimanche) do
         if (TJours(i) in ensemble) //transforme i en TJours et teste si l'élément est dans l'ensemble
         then memo1.Lines.add('L''élément n° '+IntToStr(i)+' est dans l''ensemble);
    end;
    Avec ça, tu devrais t'en sortir, bon dev

  3. #3
    Membre expérimenté

    Profil pro
    Enseignant
    Inscrit en
    Juillet 2003
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2003
    Messages : 296
    Par défaut
    merci, mais dans mon cas, ça s'applique mal..
    Voici ce que j'ai :

    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
     
    TCharset: set of char;
    TIntegers: set of Integer;
    ...
     
    function Put(str: String): TCharSet;
    var
      tmp: TCharset;
      i: integer;
    begin
      tmp := [];
      for i:=0 to Length(str) do Include(tmp,str[i]);
      if #0 in tmp then Exclude(tmp,#0);
     Result :=tmp;
    end;
     
    function Put(str: String): TIntegers;
    var
      tmp: TIntegers;
      i: integer;
    begin
      tmp := [];
      for i:=0 to Length(s) do Include(tmp,CharToInt(str[i]));
      if #0 in tmp then Exclude(tmp,#0);
      Result:=tmp;
    end;
     
    ...
    En fait, je voudrais les fonctions Get
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    function get(TCharset):string ; override;
    function get(TIntegers):String; override;
    Je ne connais pas à l'avance le contenu des ensembles.

  4. #4
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Tu es sur que Delphi accepte l'expression "Set of Integer" sans broncher ?
    Parce que nor malement, Delphi n'accepte pas un type possédant plus de 256 valeurs de base (en toout cas celui que j'ai ).

    Set of char, d'accord, mais Set of integer, niet

    En tout cas voici l'une des deux fonctions que tu cherches, et dans ton cas ça s'applique très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function get(Chars:TCharset):string ; 
    var i:integer;
         s:string;
    begin
        s:='';
        for i:=0 to 255 do 
            if (chr(i) in chars) then s:=s+chr(i);
        result:=s;
    end;

  5. #5
    Membre expérimenté

    Profil pro
    Enseignant
    Inscrit en
    Juillet 2003
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2003
    Messages : 296
    Par défaut
    oups, l'habitude
    J'ai mis byte, et non integer. Car en effet, delphi a piqué une gueulante quand j'ai mis integer...

    Je vais implémenter ta solution en attendant, mais je croyais qu'il existait un moyen plus rapide.

    Merci !

  6. #6
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Avec un Set Of byte, celà va donner (au passage, il faut utiliser overload, pas override pour avoir des fonctions et procédures polymorphes):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function get(Bytes:TByteset):string ; overload; //overload, pas override...
    var i:integer;
         s:string;
    begin
        s:='';
        for i:=0 to 255 do 
            if (i in Bytes) then s:=s+IntToStr(i)+',';
        //remplace la dernière virgule par un point
        if s<>'' then s[length[s]]:='.';
        result:=s;
    end;
    Ou bien, pour que ce soit plus facilement exploitable, tu peux construire un tableau dynamique :

    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
     
    type TByteArray=array of byte;
     
    function SetToArray(Bytes:TByteset; var ByteArray:TByteArray):integer; overload; //overload, pas override...
    var i:integer;
         s:string;
         cardinalite,count:integer;
    begin
        //Compte le nombre d'éléments de l'ensemble
        cardinalite:=0;
        for i:=0 to 255 do 
            if (i in Bytes) then Inc(Cardinalite);
     
        //dimensionne le tableau
        SetLength(ByteArray,Cardinalite);
     
        count:=0;
        //remplissage du tableau
        for i:=0 to 255 do 
            if (i in Bytes) then begin
                                        ByteArray[count]:=i;
                                        Inc(count);
                                     end;
       result:=cardinalite;
    end;
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var UnTableau:TByteArray;
         MonEnsemble:TByteSet;
         n,i:integer;
    begin
      ....
      n:=SetToArray(MonEnsemble,UnTableau);
     
      Memo1.Clear;
      for i:=0 to n-1 do
          Memo1.lines.add(IntToStr(UnTableau[i]));
      ....
    end;
    Je crois que c'est tout...

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

Discussions similaires

  1. [Servlet]Récupérer le contenu d'une page web
    Par Jarodnet dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 06/10/2005, 15h47
  2. Récupérer le contenu de la balise title
    Par roots dans le forum Langage
    Réponses: 2
    Dernier message: 11/09/2005, 16h17
  3. Récupérer le contenu d'un select
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/08/2005, 15h38
  4. [ethereal] récupérer le contenu d'un fichier envoyé ?
    Par in dans le forum Développement
    Réponses: 1
    Dernier message: 19/06/2005, 15h44
  5. [Balise XML] Comment récupérer le contenu entre 2 balise?
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 5
    Dernier message: 05/03/2004, 16h36

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