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 :

function générique exploitant un TDictionary à éléments classe propriétaire


Sujet :

Delphi

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2021
    Messages : 1
    Points : 1
    Points
    1
    Par défaut function générique exploitant un TDictionary à éléments classe propriétaire
    Bonjour,

    Je suis bien en mal de définir le prototype de ma fonction générique de classe pour l'exploitation de TDictionary qui ont des types d'éléments différents.

    1/ Une classe DataSources :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     type CLS_DataSources = class(TDictionary<String, CLS_DataSource>)
    //  Class Body
      end;
    2/ Une classe Projects
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type CLS_Projects = class(TDictionary<String, CLS_Project>)
    //  Class Body
      end;
    3/ Les classes éléments (celles qui sont au singulier : sans le S à la fin du nom) : CLS_DataSource & CLS_Project
    contiennent toutes la propriété "Name".

    L'objectif :
    Ecrire une fonction de type
    class function TUtils.ListToDisplay
    qui quelque soit le TDictionary passé en paramètre sortira une string avec la concaténation des noms (issus de la propriété Name)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class function TUtils.ListToDisplay<TKey,TValue>(Dict: TEnumerable<TPair<TKey,TValue>>): String;
    var
      ItemName:  String;
      Sep: String;
     
    begin
      Result := '';
      Sep := '';
      for ItemName in SortDictionaryKeys(Dict) do
      begin
        Result := Result + Sep + Dict[ItemName].Name;
        Sep := ' , ';
      end;
    end;
    et SortDictionaryKeys :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function SortDictionaryKeys(Keys: TEnumerable<String>): TArray<String>;
    begin
      Result := Keys.ToArray;
      TArray.Sort<String>(Result);
    end;
    le compilo dit :
    E2010 Types incompatibles : 'System.Generics.Collections.TEnumerable<System.string>' et 'System.Generics.Collections.TEnumerable<System.Generics.Collections.TPair<MOD_3LS_Unit.TUtils.ListToDisplay.TKey,MOD_3LS_Unit.TUtils.ListToDisplay.TValue>>'
    (sur la ligne du for ItemName in SortDictionaryKeys(Dict) do)

    Mais le plus problématique est :
    E2149 La classe n'a pas de propriété par défaut
    (sur la ligne Result := Result + Sep + Dict[ItemName].Name

    Ce que je comprends;
    Mais je ne vois pas comment solutionner ces 2 problèmes

    Une idée ?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 114
    Points : 41 244
    Points
    41 244
    Billets dans le blog
    63
    Par défaut
    Bonjour et bienvenue,

    Je suis vraiment "tombé" sur ce post par hasard !
    N'étant pas modérateur de ce forum et je ne peux donc déplacer la question vers le forum Delphi qui serait plus adéquat.

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 730
    Points : 5 391
    Points
    5 391
    Par défaut
    La première erreur est due au fait que SortDictionaryKeys attend une TEnumerable<String> et que tu l'appel avec Dict que tu as déclaré de type TEnumerable<TPair<TKey,TValue>>.
    TEnumerable<String> n'est pas TEnumerable<TPair<TKey,TValue>>.

    Si tu veux trier sur les clés, il faut lui passer les clés et nonDict en entier.


    La deuxième erreur semble être due au fait le type TValue issu de TEnumerable<TPair<TKey,TValue>> ne possède de propriété Name.
    Je suggère de déclarer un ancêtre commun CLS_Common à CLS_DataSource et CLS_DataProject et de remplacer TValue par CLS_Common.

    Et même là je ne suis pas certain que ça compile car d'un coté tu auras un TDictionary<String, CLS_Common> et de l'autre un TEnumerable<TPair<TKey,TValue>>.
    Bref, tu as un véritable bazar dans les types que tu utilises, et il faut en premier lieu uniformiser tout ça.

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/11/2010, 11h30
  2. exploiter this d'une classe superieure
    Par subzero01 dans le forum Langage
    Réponses: 3
    Dernier message: 01/07/2009, 11h27
  3. Sélecteur particulier élément.classe#id
    Par BnA dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 15/03/2007, 11h08
  4. [IDE][C#] Comment exploiter une bibliotheque de classe ?
    Par qwertz dans le forum EDI/Outils
    Réponses: 6
    Dernier message: 29/05/2006, 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