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 :

Recherche type désespérément


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut Recherche type désespérément
    Bonjour

    Je sèche sur une question basique
    J'ai besoin de créer un nouveau type de variable, qui admettrait par exemple les valeurs entières 1,2,5,10,15,20 et seulement celles là

    ne convient pas : je ne veux pas des valeurs 3,4,6,7 etc.

    est incorrect

    Si qqn a une idée

    Merci d'avance
    Choisir, c'est renoncer...

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Heuu juste comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMonType = (mt1, mt2, mt5, mt10, mt15, mt20);
    Avec les fonctions IntToMonType et MonTypeToInt qui vont bien ca peut le faire ...

    Sinon tu peux utiliser d'autres solutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Var ValidNumber : Array[1..6] of Integer = (1, 2, 5, 10, 15, 20);
    Avec des fonction IsValidNumber qui verifie si elle fait partie des valeurs du tableau.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kio,

    La solution plus simple est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Type
      monType = (a1=1,a2=2,a5=5,a10=10,a20=20);
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    En effet. Je ne savais pas que l'on pouvait avvecter une valeur precise a des constantes enumérés.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  5. #5
    Membre émérite
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Points : 2 883
    Points
    2 883
    Par défaut
    Citation Envoyé par droggo Voir le message
    Kio,

    La solution plus simple est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Type
      monType = (a1=1,a2=2,a5=5,a10=10,a20=20);
    C'est certainement la solution la plus simple mais ça ne répond pas tout à fait à la question de départ à laquelle la réponse est tout simplement "non, c'est pas possible directement sous Delphi".
    En effet, même avec un type énuméré dans lequel tu forces les valeurs comme dans ton exemple, rien n'interdit une variable de type "monType" de prendre la valer 12 (interdite pourtant) selon comment le code touche à cette variable et selon les éventuels contrôles / optimisations de compilation.

    De fait, la réponse à est non, c'est pas possible car Delphi ne permet pas de créer de vrais types similaires aux types scalaires (entiers, chaînes, etc) à la différences de langages plus objets comme Java ou C#.

    La seule façon de réponse proprement à la question est de créer une classe "monType", et non un énuméré, classe qui possède une property "LeNombre" qui, grace aux setter/getter va permettre de s'assurer que la valeur est toujours correcte.
    Bien entendu, une variable de type "monType" ne sera pas directement utilisable comme un entier dans un calcul, il faudra ajouter une méthode du type AsInteger par ex qui retournera la valeur.
    Tout le code s'en trouvera alourdi, mais c'est bien la seule solution qui répond au besoin fonctionnel (en partant du fait qu'on parle de delphi win32).

  6. #6
    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
    Je suis assez d'accord avec Merlin. D'ailleurs, ceux qui ont lu mes interventions savent que je désapprouve le type de données pseudo-énuméré dans lequel on affecte des valeurs particulières.

    En revanche, avec Delphi 2006 et plus, je complète la solution donnée par Merlin par l'utilisation de record avancé. Pour lequel on rend privée la donnée interne, et où l'on surcharge les conversions implicites et explicites vers le type entier.
    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
    type
      TValueType = Byte; // modifie ça comme tu veux
     
      TRestrictedValue = record
      private
        Value: TValueType;
      public
        class operator Implicit(AValue: TValueType): TRestrictedValue;
        class operator Implicit(const AValue: TRestrictedValue): TValueType; inline;
      end;
     
    implementation
     
    class operator TRestrictedValue.Implicit(AValue: TValueType): TRestrictedValue;
    begin
      if not (AValue in [1, 2, 5, 10, 20]) then
        raise Exception.Create('Invalid value for TRestrictedValue');
      Value := AValue;
    end;
     
    class operator TRestrictedValue.Implicit(const AValue: TRestrictedValue): TValueType;
    begin
      Result := AValue.Value;
    end;
    Code non testé.

    Avec ça, les données de type TRestrictedValue s'utilisent exactement comme le type TValueType.
    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.

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Jio,

    Oui, je sais tout cela.

    Dans tous les cas, quelle que soit la solution choisie, il faut implémenter des méthodes si on veut manipuler tout cela correctement, c'est à dire sans faille quel que soit le code (enfin, tant qu'il est logique !)).
    Si les cons volaient, il ferait nuit à midi.

  8. #8
    Membre émérite
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Points : 2 883
    Points
    2 883
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Je suis assez d'accord avec Merlin. D'ailleurs, ceux qui ont lu mes interventions savent que je désapprouve le type de données pseudo-énuméré dans lequel on affecte des valeurs particulières.

    En revanche, avec Delphi 2006 et plus, je complète la solution donnée par Merlin par l'utilisation de record avancé.
    ...
    Depuis D2006 la personnalité win32 permet en effet la surcharge des opérateurs par le biais du type "record" qui a été modifié.
    Il y a un tuto de laurent dardenne sur ce sujet :
    http://laurent-dardenne.developpez.c...rgeOperateurs/

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    il existe une possibilité simple.
    C'est moyennement propre mais c'est efficace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Type
    Type
      TmonType = (a1,a2,a5,a10,a20);
    Const
    Type
      TmonTypeString : Array [TmonType] of Integer = (1, 2, 5, 10, 20);
    en fait il s'agit d'établir une table de conversion entre TMonType et la valeur de TMonType

    a1 = 1
    TmonTypeString[a1] = 1

    a2 = 2
    TmonTypeString[a2] = 2

    a3 = 3
    TmonTypeString[a3] = 3

    a5 = 4
    TmonTypeString[a5] = 5

    a10 = 5
    TmonTypeString[a10] = 10

  10. #10
    Membre émérite
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Points : 2 883
    Points
    2 883
    Par défaut
    Citation Envoyé par Tardiff Jean-François Voir le message
    Bonjour,
    il existe une possibilité simple.
    C'est moyennement propre mais c'est efficace.
    Cela ne répond pas réellement à la demande. Un astuce pour faire correspondre un énuméré à un integer, il y a même beaucoup plus simple que ta solution, cela a été proposé dans le fil ici (en assignant directement les integer à chaque élément lors de la déclaration de l'énuméré).
    Mais tout cela n'est que bricolage puisque le but d'un type dans un langage fortement typé, ce que revendique Delphi, et ce que souhaitait notre ami au départ, c'est bien qu'il soit impossible par code d'écrire variable := 12 si la valeur 12 est interdite, et que cette détection ne soit pas seulement une erreur runtime (ce qui serait possible avec les solutions d'une classe ou celle d'un record aussi proposées) mais bien une erreur de compilation. De la même façon que l'affectation d'un string à une variable integer ne passe pas la compilation.
    Là on retrouverait la notion de type dans un environnement fortement typé. Mais cela reste impossible sous Delphi en tout cas.

Discussions similaires

  1. Recherche type LONG
    Par franfr57 dans le forum SQL
    Réponses: 2
    Dernier message: 13/10/2008, 12h04
  2. Moteur de recherche type Google Desktop
    Par GSXRider dans le forum C#
    Réponses: 2
    Dernier message: 04/01/2008, 16h33
  3. Recherche requête désespérément
    Par pas85 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/12/2007, 17h23
  4. Recherche codeur désespérément
    Par laurentol dans le forum Autres
    Réponses: 0
    Dernier message: 16/11/2007, 17h07

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