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 :

Record en Array of StringList


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut Record en Array of StringList
    bonjour à toutes et à tous

    Est-il possible de faire une TStringList de Record ?

    voilà ce que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type
      TJournal = record
          Code   : String[8];
          Libelle    : String[30];
      end;
    
    Journal : Tjournal of Stringlist ???
    Le but est de remplir le stringlist au départ par une boucle sur une table access
    Donc j'aimerais pouvoir faire :
    ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    While not eof do
      Journal.Add(FieldByName('Code').AsString).Code;
      Journal.Add(FieldByName('Libelle').AsString).Libelle;
    next;
    end;
    Et ensuite le but final et la recherche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function retournelibelle(CodeJournal: String): String;
    begin
      return := Journal.Indexof(CodeJournal).Code
    end;
    Est-ce possible de faire tout cela ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Regarde soit la TList mais en réalité, tu veux faire une table associative, j'ai fait un truc approchant THashStringList
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    uses Generics.Collections;
     
     
    type
      TJournalList = TList<TJournalItem>;

    ben alors buzz ... ? aurait tu déjà oublié ?
    bon bien sur, avec ça ton code n'est plus valide que pour D2009 et +
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Bonjour,

    Merci Shail pour ta proposition mais un Hash est trop volumineux pour gérer ce que je souhaite.
    Salut Dr. Who, si pour toi cela te semble simple de gérer des Generics, maleureusement j'y comprends que dalle !! lol

    Bref je suis resté à un record et ensuite je le parcours pour testé.
    Donc je déclare cela dans un fichier PAS (general.pas)

    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
    41
     
     
    interface
     
    uses
      Windows, Graphics, SysUtils, Math, Dialogs, classes, StdCtrls;
     
      procedure ArrayOfJournal;
     
    type
      TJournal = record
          Code     : String[8];
          Libelle    : String[30];
      end;
     
    Var
       Journal  : Array of TJournal;
     
     
    procedure ArrayOfJournal;
    var
      n : Integer;
    begin
      With FData.QryTravail2 do
      begin
        Sql.Clear;
        Sql.Add('Select * From Journal');
        try
          Active := True;
          SetLength(Journal,Recordset.RecordCount);
          for n := 0 to High(Journal) do
          begin
            Journal[n].Code   := FieldByName('Code').AsString;
            Journal[n].Libelle  := FieldByName('Libelle').AsString;
            next;
          end;
        finally
          Close;
        end;
      end;
    end;
    Ensuite dans ma form principal
    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
     
    implementation
     
    uses
      general.pas
     
     
    function TFPrincipal.FLtrait(CodePiece: string): String;
    Var
      nJournal: integer;
    begin
       njournal := -1;
     
       ArrayOfJournal; // On alimente le tableau
     
      With FData.QryTravail1 do
      begin
        Sql.Clear;
        Sql.Add('Select * From Ecriture Where CodePiece= :xPiece');
        Parameters.ParamByName('xPiece').Value := CodePiece;
        try
          active := True;
          for i := low(Journal) to High(Journal) do
            if Journal[i].Code = FieldByName('CodeJournal').AsString then Begin nJournal :=i; break; end;
     
            // ... divers traitement
            if nJournal <> - 1 then result := result + Journal[nJournal].Libelle;
        finally
           Close;
        end;
    end;

    Voilà trés réduit mon utilisation. Est-elle améliorable ?
    Merci

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    En fait, je ne fais pas un Hash, c'est un vilain abus de langage, c'est juste une TStringList encapsulé ... tu devrais regarder un peu plus, tu verras ce n'est pas si énorme que tu le pense ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre émérite Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Bonjour,
    Salut Dr. Who, si pour toi cela te semble simple de gérer des Generics, maleureusement j'y comprends que dalle !! lol
    Peut être que tu bloques sur le sujet, il y a une nouvelle syntaxe, il faut s'y habituer.

  7. #7
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Salut Dr. Who, si pour toi cela te semble simple de gérer des Generics, maleureusement j'y comprends que dalle !! lol
    Si tu es en D2009 et +, tu devrais faire un petit effort d'apprentissage, car non seulement c'est exactement ce que tu veux, mais en plus, c'est une vrai merveille.
    D'autant plus que dans les generics Delphi, tu dois avoir une classe dictionnaire.

    Je suis encore en BDS2006, et c'est bien ce qui me manque le plus...

  8. #8
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    alors buzz, je te fait un petit cours de vulgarisation vite fait sur les Generics qui sont vraiment un gros plus dans Delphi !

    à quoi sert un generique ?

    un type generique permet de reutiliser un code ecrit pour n'importe quel type.
    cela permet d'aller plus vite, même si l'ecriture d'un generique peut être un peu plus complexe au premier abord.

    concrètement ça donne quoi ?

    admettons le type TPoint, trés utile. le type TPoint est decliné egalement en TSmallPoint qui utilise le type SmallInt.
    pour les deux type TPoint et TSmallPoint nous devont ecrire deux fois le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TPoint = record X, Y: integer end;
    TSmallPoint = record X, Y: SmallInt end;
    avec delphi 2009, nous avont la possibilité de créer un type TPoint generique, qui permettra une déclinaison plus rapide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TGenericPoint<T> = record X, Y: T end;
    Easy!

    ensuite on pourra decliner ce nouveau type comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TPoint = TGenericPoint<integer>;
    TSmallPoint = TGenericPoint<SmallInt>;
    TUPoint = TGenericPoint<LongWord>;
    TBigPoint = TGenericPoint<int64>;
    TFloatPoint = TGenericPoint<single>;
    TBigFloatPoint = TGenericPoint<extended>;
    Easy! on viens de créer 6 nouveaux type rapidement, sans tout réécrire.

    et pour les methodes ?

    même principe, ajoutons une methode d'initialisation pour notre type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type
      TGenericPoint<T> = packed record
        X, Y : T;
        procedure Assign(const aX, aY: T);
      end;
     
      PIntPoint = ^TIntPoint;
      TIntPoint = TGenericPoint<integer>;
      PFltPoint = ^TFltPoint;
      TFltPoint = TGenericPoint<single>;
    et l'implementation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    { TGenericPoint<T> }
     
    procedure TGenericPoint<T>.Assign(const aX, aY: T);
    begin
      X := aX;
      Y := aY;
    end;
    pas besoin de réécrire la methode Assign pour TIntPoint et TFltPoint!
    genial!


    tu peux m'en faire plus ?

    bien sur, ajoutons encore une methode, mais cette fois, une methode statique!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type
      TGenericPoint<T> = packed record
        X, Y : T;
        procedure Assign(const aX, aY: T);
        class function Create(const aX, aY: T): TGenericPoint<T>; static;
      end;
     
      PIntPoint = ^TIntPoint;
      TIntPoint = TGenericPoint<integer>;
      PFltPoint = ^TFltPoint;
      TFltPoint = TGenericPoint<single>;
    la nouvelle methode permet de créer remplir une structure TGenericPoint<T> ou T sera le type choisis pour les nouveaux type (integer ou single dans l'exemple).
    note qu'il faut remettre le <T> à la fin du retour.

    et l'implementation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    { TGenericPoint<T> }
     
    procedure TGenericPoint<T>.Assign(const aX, aY: T);
    begin
      X := aX;
      Y := aY;
    end;
     
    class function TGenericPoint<T>.Create(const aX, aY: T): TGenericPoint<T>;
    begin
      result.X := aX;
      result.Y := aY;
    end;
    Easy! encore une fois.
    TIntPoint et TFltPoint possèderont les deux methodes Assign et Create avec bon type!!! genial non ?
    on as ecris le code une fois pour toute et hop, tout nouveau type originaire de TGenericPoint<T> possèderont les mêmes capacités!

    c'est comme quand on dérive une classe sans avoir à faire des override et inherited de partout pour adapter au type voulus.
    encore une fois ici, l'expression Rapide Application Développement (RAD) prend tout son sens.

    Existe t'il des types generiques predefinie dans Delphi ?

    oui, dans l'unité Generics.Collections nous avons quelques types generique bien pratique.
    TArray, TEnumerator, TEnumerable, TList, TQueue, TStack, TPair et TDictionary, TObjectList, TObjectQueue, TObjectStack et TObjectDictionary.

    TList ? TArray ? TObjectList ? ho ?
    oui ces deux type G sont trés pratique! plus besoin d'ecrire pleins de truc embêtant, voila comme faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TIntArray = TArray<integer>;
    TIntList = TList<integer>;
     
    TPointArray = TArray<TPoint>;
    TPointList = TList<TPoint>;
     
    TEditList = TObjectList<TEdit>;
    TButtonList = TObjectList<TButton>;

    et voila.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

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

Discussions similaires

  1. record et array
    Par Mordokkai dans le forum Ada
    Réponses: 5
    Dernier message: 26/09/2014, 18h56
  2. Tableau Array record
    Par tintin62 dans le forum Débuter
    Réponses: 7
    Dernier message: 24/08/2010, 22h03
  3. Réponses: 1
    Dernier message: 23/05/2009, 13h35
  4. low d un array of record : pb ds boucle FOR
    Par sp2308 dans le forum Débuter
    Réponses: 9
    Dernier message: 24/01/2009, 19h09
  5. [LG] Array to packed record
    Par Nomiss dans le forum Langage
    Réponses: 4
    Dernier message: 16/12/2005, 22h28

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