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

  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
    Points : 1 113
    Points
    1 113
    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 sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    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 éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    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
    Points : 1 113
    Points
    1 113
    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 sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    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 chevronné 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
    Points : 1 819
    Points
    1 819
    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
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    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
    Points : 4 170
    Points
    4 170
    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 éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    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!

  9. #9
    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
    Points : 1 113
    Points
    1 113
    Par défaut
    Dr. Who je te remercie beaucoup de ton explication pour la compréhension de list generics.
    Mais malheureusement, même si je passe pour un idiot !! je n'arrive pas a traduire se que tu explique avec mon besoin.

    Generics est-ce que cela signifie que je peux mettre mon Tjournal dans un Tlist ? est-ce un record de record ?

    Mais je veux absolument arriver à utiliser ce generic alors je vais t'assener jusqu'a ce que j'y arrive..lol.

    Admetons ces records inventés pour l'exemple :
    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
    type
      TSalarie = record
          Code   : String[8];
          Nom    : String[30];
      end;
     
    type
      TClient = record
          Code    : String[20];
          Nom     : String[50];
      end;
     
    type
      TCategorie = record
          Code    : String[8];
          Libelle : String[50];
     
     
      Salaries          : Array of TSalarie;
      Clients           : Array of TClient;
      Categories      : Array of TCategorie;
    Ensuite on peut l'alimenter comme 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
    SetLenght(Salaries,10)
    for i:=0 to High(Salaries) do
    begin
      Salaries[i].Code := <données x>
      Salaries[i].Nom := <données x>
    end;
     
    SetLenght(Clients,10)
    for i:=0 to High(Clients) do
    begin
      Clients[i].Code := <données x>
      Clients[i].Nom := <données x>
    end;
     
    SetLenght(Categories,10)
    for i:=0 to High(Categories) do
    begin
      Categories[i].Code := <données x>
      Categories[i].Nom := <données x>
    end;
    Et pour l'utilisation assez contraignant on parcours le array + divers test.

    Maintenant partant de ce constat, comment generics peut m'aider ? comment ensuite alimenter, comment l'utiliser ? quel gain en terme de mémoire, de rapidité ?

    Merci d'avance.

  10. #10
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    alors regarde la magie s'exercer :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    { INTERFACE }
     
    {$A8}
    {$ALIGN ON}
     
    uses Generics.Defaults, Generics.Collections;
     
     
    type
      TMyData<GTCode, GTNom> = packed record
        Code : GTCode;
        Nom  : GTNom;
        class function Create(const aCode: GTCode; const aNom: GTNom): TMyData<GTCode, GTNom>; static;
      end;
     
     
    { TSalarie }
    type
      TSalarie = TMyData<String[8], String[50]>;
     
      TSalarieListe = class(TList<TSalarie>)
      public
        procedure ToStringList(aList: TStrings);
      end;
     
     
    { TClient }
    type
      TClient = TMyData<String[8], String[50]>;
     
      TClientListe = class(TList<TClient>)
      public
        procedure ToStringList(aList: TStrings);
      end;
     
     
    { TCategorie }
    type
      TCategorie = TMyData<String[8], String[50]>;
     
      TCategorieListe = class(TList<TCategorie>)
      public
        procedure ToStringList(aList: TStrings);
      end;
     
     
    { IMPLEMENTATION }
     
    { TMyData<GTCode, GTNom> }
     
    class function TMyData<GTCode, GTNom>.Create(const aCode: GTCode; const aNom: GTNom): TMyData<GTCode, GTNom>;
    begin
      result.Code := aCode;
      result.Nom  := aNom;
    end;
     
    { TSalarieListe }
     
    procedure TSalarieListe.ToStringList(aList: TStrings);
    var N: integer;
        C: TSalarie;
    begin
      aList.BeginUpdate;
      try
        aList.Clear;
        for N := 0 to Count - 1 do
        begin
          C := items[N];
          aList.Add('<'+C.Code + '> '+ C.Nom);
        end;
      finally
        aList.EndUpdate;
      end;
    end;
     
    { TCLientListe }
     
    procedure TClientListe.ToStringList(aList: TStrings);
    var N: integer;
        C: TClient;
    begin
      aList.BeginUpdate;
      try
        aList.Clear;
        for N := 0 to Count - 1 do
        begin
          C := items[N];
          aList.Add('<'+C.Code + '> '+ C.Nom);
        end;
      finally
        aList.EndUpdate;
      end;
    end;
     
    { TCategorieListe }
     
    procedure TCategorieListe.ToStringList(aList: TStrings);
    var N: integer;
        C: TCategorie;
    begin
      aList.BeginUpdate;
      try
        aList.Clear;
        for N := 0 to Count - 1 do
        begin
          C := items[N];
          aList.Add('<'+C.Code+ '> '+ C.Nom);
        end;
      finally
        aList.EndUpdate;
      end;
    end;
     
     
     
    { TForm19 }
     
    var
      Salaries   : TSalarieListe;
      Clients    : TClientListe;
      Categories : TCategorieListe;
     
    procedure TForm19.FormCreate(Sender: TObject);
    begin
      Salaries   := TSalarieListe.Create;
        Salaries.Add(TSalarie.Create('123','Elmutt'));
        Salaries.Add(TSalarie.Create('124','Roger'));
        Salaries.Add(TSalarie.Create('125','Henri'));
      Salaries.ToStringList(ListBox1.Items);
     
      Clients   := TClientListe.Create;
        Clients.Add(TClient.Create('126','Mme Poulpe'));
        Clients.Add(TClient.Create('127','Mr Blublu'));
        Clients.Add(TClient.Create('128','Melle Jolie'));
      Clients.ToStringList(ListBox2.Items);
     
      Categories := TCategorieListe.Create;
        Categories.Add(TCategorie.Create('129','Bon payeurs'));
        Categories.Add(TCategorie.Create('130','Mauvais payeurs'));
        Categories.Add(TCategorie.Create('131','Raleurs'));
      Categories.ToStringList(ListBox3.Items);
    end;
     
    procedure TForm19.FormDestroy(Sender: TObject);
    begin
      Categories.Free;
      Clients.Free;
      Salaries.Free;
    end;
    [ 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!

  11. #11
    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
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    alors regarde la magie s'exercer :
    ....
    Bonjour Dr.Who, je viens donc de créer une form avec 3 listebox, effectivement cela fonctionne parfaitement.

    Mais j'ai quelque remarque :
    - Code et Nom qui sont des variables de TmyData décline donc les TSalaries, Tetc... mais quid si j'en est besoin d'autre et surtout qui ne conserne pas les autre record ?
    - J'ai essayé égalemen d'effectué une recherche. J'ai poser un TEdit avec un TButton, au click du boutton je n'ai pas réussi à toruver la bonne syntaxe.
    Voilà ce que j'ai essayé

    Salaries.Indexof(Edit1.text,'');

    Bon evidemment j'ai essayé 50 truc différent et toujours les même messages soit transtypage impossible, soit incompatible type.

    - Dans la même idée comme recherché plutot sur .nom d'un des record que sur .code ?

    Merci beaucoup de ton implication.


    PS : IL FAUT VRAIMENT QUE TU DORME... 4h34 ??? looooooool

  12. #12
    Membre chevronné 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
    Points : 1 819
    Points
    1 819
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    - Dans la même idée comme recherché plutot sur .nom d'un des record que sur .code ?
    Une façon faire est d'utiliser les méthodes anonymes ...

    L'exemple de Dr who est superbe pour illustrer les génériques.

  13. #13
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    IndexOf renvois l'instance d'une variable recherchée.

    en gros il cherche si un pointeur est present dans la liste et renvois l'index de ce dernier s'il est effectivement dans cette liste.

    il faudrait donc ecrire un methode "find" prevue pour nos types.

    exemple pour TSalarie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    { TSalarie }
    type
      TSalarie = TMyData<String[8], String[50]>;
     
      TSalarieListe = class(TList<TSalarie>)
      public
        procedure ToStringList(aList: TStrings);
        function FindCode(const Code: string; const FromIndex: integer= 0): integer;
        function FindName(const Nom: string; const FromIndex: integer= 0): integer;
        function Find(const Code, Nom: string; const FromIndex: integer= 0): integer;
      end;
    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
    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
     
    function TSalarieListe.FindCode(const Code: string; const FromIndex: integer= 0): integer;
    var N,C : integer;
    begin
      assert(FromIndex >= 0, 'Find error : FromIndex must be greater than or equal Zero.');
     
      result := -1;
      C := Count-1;
      for N := FromIndex to C do
        if Code = Items[N].Code then
           exit(N);
    end;
     
    function TSalarieListe.FindName(const Name: string; const FromIndex: integer= 0): integer;
    var N,C : integer;
    begin
      assert(FromIndex >= 0, 'Find error : FromIndex must be greater than or equal Zero.');
     
      result := -1;
      C := Count-1;
      for N := FromIndex to C do
        if Name = Items[N].Name then
           exit(N);
    end;
     
    function TSalarieListe.Find(const Code, Name: string; const FromIndex: integer= 0): integer;
    var N,C : integer;
         D : TSalarie;
    begin
      assert(FromIndex >= 0, 'Find error : FromIndex must be greater than or equal Zero.');
     
      D.Code := Code;
      D.Name := Name;
     
      result := -1;
      C := Count-1;
      for N := FromIndex to C do
        if CompareMemory(@D, @Items[N]) then
           exit(N);
    end;

    bien ces codes doivent se limiter à quelques milliers de données.
    si tu compte en avoir plus de 100000 par exemple, le mieux est de travailler en Base de donnée.

    Ce genre de code est bien pour par exemple, quelques centaines d'entrées, pour un carnet d'adresses, un gestionnaire de pointage des salariés, gestion des activités salariale etc.
    pour ce qui est de brasser des clients au bouts d'un ou deux ans le logiciels montrera ses faiblesses, si on admets 50 clients par jours sur 300 jours de l'année (15000 entrées/ans), la une BDD sera plus adaptée.
    [ 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!

  14. #14
    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
    Points : 1 113
    Points
    1 113
    Par défaut
    Bien,

    Ton savoir est hallucinant. Moi avant d'en arrivé là... va faloir que je prie tous les soirs...

    Je te rassure le but de ma manoeuvre est d'éviter de lire quelque centaine de ligne dans une base de données justement car j'y retour souvent, donc le mieux est de mettreles infos dans un record comme ca je peux faire un traitement sans etre obliger de relire l'information sans arret dans ma base.

    Je te remercie pour tes exemples et le magnifique boulot.

    Je t'avoue que je ne comprends toujours pas tout dans la méthode mais je commence à mieux cerné ta proposition.

    Bye.

  15. #15
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    si tu fait l'effort de comprendre les codes donnés, tu évoluera vite.

    les forums de prog sont campé par de grand amateurs de programmation et des professionnels.
    sur un forum et avec l'envie, le temps et la curiosité suffisante, on peux devenir assé bon en moins d'un an.

    je t'avoue que même moi je ne comprend pas souvent des codes. mais ils y a plusieurs façon de comprendre un code :

    1) dans sa globalité, son action et son résultat. c'est déjà un début.

    2) par portions, action et résultat de chaque méthode, algorithme. la on pousse plus loin, logiquement, pas trop de difficultés à ce niveaux, c'est surtout du mecanisme logique et évident.

    3) la mise en place et l'interaction entre chaque portions. la il faut suivre, encore du mecanisme logique mais pas forcement évident.

    4) par lignes de codes, c'est ici que ça se corse, une maitrise parfaite de la syntaxe du langage est nécessaire pour comprendre chaque instructions. comparer le code avec un autre programme qui fait la même chose mais codé différemment aiderai à mieux comprendre.


    quand on commence à commenter le code pour expliquer le fonctionnement et l'intérêt de chaque ligne, dans un programmes, c'est a la fin que l'on vois la complexité et l'aspect repoussant de la programmation pour le néophyte.

    par exemple la simple ligne :

    pourrai être commenté comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // X = Width div 2
    X := Width shr 1;
    ce qui est un début d'explication, allons plus loin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    X := Width shr 1; { X égal Width divisé par 2, un division par 2 peut être
      remplacée par un décalage des bits vers la droite (SHR = SHift Right). 
      Cette opération d'optimisation ne s'effectue que sur les type entiers.
      SHR permet d'optimiser une division par une puissance de 2 (2, 4, 8, 16, 32 ...). 
      Tout comme SHL (SHift Left) permet d'optimiser une multiplication par 
      une puissance de 2.
     
      Puissance de 2 :
      2^ 1 2 3 4  5  6  7   8   9   10
       = 2 4 8 16 32 64 128 256 512 1024
      }
    voila comment on génère 6 ou 7 lignes d'explication pour 1 ligne de code toute simple.
    le développeur choisira plutôt la deuxième version (// X = Width div 2) si il considère que le lecteur maitrise déjà la syntaxe de base du langage.
    la première version si il considère que le lecteur maitrise les optimisations de ce genre (donc sans commentaire)
    et la troisième version si son code est destiné à une lecture pédagogique, c'est ce qu'il faut faire dans un code que l'on vas poster sur Développez par exemple.

    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