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 :

Mécansime pour reproduire la gestion d'une table


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Points : 84
    Points
    84
    Par défaut Mécansime pour reproduire la gestion d'une table
    Bonjour,

    Après 10 ans de codage en language de 4° génération orienté base de données, je reviens vers le Pascal objet Delphi pour un projet spécifique. Ma question est simple: quelqu'un peut-il me donner un exemple de codage d'algo permettant de reproduire le fonctionnement Tables/Enregistrement, le tout en mémoire, avec des objets. En clair:

    1. Définir une classe "PseudoEnreg" représentant l'enregistrement.
    2. Définir une classe "PseudoTable" représentant la liste des "PseudoEnreg", et permettant l'ajout, la suppression et le parcours des enreg.
    3. Utiliser le tout comme pour une table.

    Exemple:

    //Créer la table.
    PseudoTable = TPseudoTable.Create;

    // Créer des enreg et les mettre dans la table
    PseudoEnreg := TPseudoEnreg.Create.
    PseudoEnreg.K_CODE := '001';
    PseudoEnreg.Nom := 'My name';
    PseudoTable.Add(PseudoEnreg);

    PseudoEnreg := TPseudoEnreg.Create.
    PseudoEnreg.K_CODE := '002';
    PseudoEnreg.Nom := 'My name 2';
    PseudoTable.Add(PseudoEnreg);

    etc...

    // Puis pouvoir parcourir la table et accéder aux champs de PseudoEnreg
    PseudoTable.First;
    For i:=0 to PseudoTable.Count - 1 Do Begin
    ShowMessage('Code de ' + IntToStr(i) + '=' + ??????????? );
    PseudoTable.Next;
    end;

    où ??????????? est le code qui me manque pour afficher un des champs...

    J'ai commencé la code suivant:

    type
    // Liste des partages=enregistrement
    TSharedRes = Class(TObject)
    K_SHARE,
    PATH,
    LIB,
    K_TYPE // DISK, ADMIN, PRINTER, OTHER
    : String;
    I_TYPE
    : Integer
    end;
    // Table regroupant les enregs
    Ttt_SharedRes = Class(TObjectlist)
    ..... Quoi mettre ???? Un champ de type TShareRes ???
    end;

    var
    SharedRes : TSharedRes;
    tt_SharedRes: Ttt_SharedRes;


    Begin
    tt_SharedRes := Ttt_SharedRes.Create;

    //Boucle quelconque
    While <Condition ok> Do Begin
    SharedRes := TSharedRes.Create;
    SharedRes.K_SHARE := <... peu importe> ;
    SharedRes.PATH := <... peu importe> ;
    tt_SharedRes.Add(SharedRes);
    end;



    // Ensuite, pouvoir récupérer n'importe quel SharedRes
    // par lecture séquentielle (pour commencer)
    for i:=0 to tt_SharedRes.count - 1 Do Begin
    ??????
    end;

    end;

    Cela fait une semaine que je m'escrime la-dessus dans mon coin et là, je sature un peu... aucun des exemples/tuto que j'ai pu trouver ne correspond à cela. C'est pourtant élémentaire... Peut-être trop ? Quelque chose doit m'échapper ou je suis trop "déformé" par le L4G ....

    Bien sûr, je ne veux pas avoir recours aux tableaux dynamiques.

    Merci d'avance.

    Flines.

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Pour ce type degestion de table, on peut faire ceci :

    Définir chaque record comme un objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type TPseudoEnreg = Class(Tobject) 
           K_CODE : string ;
           Nom : string ;
           procedure   Assign(vPseudoEnreg:TPseudoEnreg) ; // trés utille pour affecter un enr à un autre
           procedure   Clear  ;  // remet tout à la valeur initiale (nom='' ; K_Code='' par exemple)
           constructor create ;
           destructor  destroy; override;
           end ;
    Définir la table comme une liste d'objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      TPseudoTable = class(Tlist)
         function      GetPseudoRec(i:integer) : TPseudorec ;
         procedure   SetPseudoRec(i:integer;Rec :TPseudorec) ;
         property    PseudoRec[i:integer]:TPseudoRec read GetRec  write SetPseudoRec ; 
         procedure   clear ;
         constructor create;
         destructor  destroy; override;
         end;
    Code pour la property PseudoRec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function TPlayersObj.GetPseudoRec(i:integer) : TPseudoRec ;
    begin result:=TPseudoRec(objects[i]) ; end ;
     
    procedure TPlayersObj.SetPlayer(i:integer;PseudoRec:TPseudoRec) ;
    begin objects[i]:=PseudoRec ; end ;
    Ensuite, l'utilisation est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // creation
    table:=TpseudoTable.create ;
    rec:=Tpseudorec.create ; rec.k_code:='A' ;  rec.nom:='ALPHA' ; table.add(rec) ;
    rec:=Tpseudorec.create ; rec.k_code:='B' ;  rec.nom:='BETA' ; table.add(rec) ;
     
    // lecture
    For i:=0 to Table.Count - 1 Do  
    ShowMessage(IntToStr(i)+'  '+Table.PseudoRec[i].K_Code+'  '+ Table.PseudoRec[i].nom) ;
    end;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Pas de soucis.
    Mais avant tout, 4eme génération orienté base de données ou pas, l'utilisation de la balise [ code] dans les posts est largement de mise sur les forums de ce site. Je fais la remarque avant qu'un modo le signal.

    Alors, pour la question, il se présente 2 solutions.
    Une rapide mais pas forcément super élégante, l'autre élégante mais un peu plus fastidieuse (m'enfin pas tant que ça)

    1ere solution :
    Utilisation d'un conteneur (genre TList, TObjectList, voire TComponentList). Au vu du code (non mis en forme) on penchera pour un TObjectList. Ce dernier, avec le TComponentList, à la particularité d'éventuellement libérer les objets qu'il contient lors de sa propre libération. (Il faut pour cela faire un TObjectList.Create(True) pour lui dire que les objets lui appartiennent).
    On peut faire allégrement des vList.Add(NimporteQuelInstancedObjet); n'importe quel vList.Delete(vUnIndex); mais pour la récupération c'est que l'on "caste" :
    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
    var
      vListe: TObjectList;
      vUneInstance,
      vPourLexemple: TSharedRes;
    begin
      vliste := TObjectList.Create(True);
     
      vUneInstance := TSharedRes.Create;
      vUneInstance.blababal := balbalbla;
      ...
     
      vListe.Add(vUneInstance);
     
      ....
     
    // Accès a un des objets de la liste :
     
      // Caste poli :
      (vListe[0] as TSharedRes).bblablabal := balbalba;
     
      // Caste sauvage (dangeureux) :
      TSharedRes(vListe[0]).bblablabal := balbalba;
     
      // Ou bien :
      vPourLexemple := (vListe[0] as TSharedRes);
      // ou vPourLexemple := TSharedRes(vListe[0])
      // puis
      vPourLexemple.balbalab := nlaaa;
      ....
    end;
    2nd solution :
    Nous allons hériter du conteneur TObjectList.
    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
    uses
      Classes, Contnrs;
     
    type
      // Liste des partages=enregistrement
      TSharedRes = Class(TObject)
        K_SHARE,
        PATH,
        LIB,
        K_TYPE // DISK, ADMIN, PRINTER, OTHER
        : String;
        I_TYPE: Integer;
      end;
     
      // Table regroupant les enregs
      Ttt_SharedRes = Class(TObjectlist)
      private
        function GetItem(Index: Integer): TSharedRes;
        procedure SetItem(Index: Integer; const Value: TSharedRes);
      public
        function Add(ASharedRes: TSharedRes): Integer;
        procedure Insert(Index: Integer; ASharedRes: TSharedRes);
        function First: TSharedRes;
        function Last: TSharedRes;
        property Items[Index: Integer]: TSharedRes read GetItem write SetItem; default;
      end;
     
    implementation
     
    { Ttt_SharedRes }
     
    function Ttt_SharedRes.Add(ASharedRes: TSharedRes): Integer;
    begin
      inherited Add(ASharedRes);
    end;
     
    function Ttt_SharedRes.First: TSharedRes;
    begin
      Result := TSharedRes(inherited First);
    end;
     
    function Ttt_SharedRes.GetItem(Index: Integer): TSharedRes;
    begin
      Result := TSharedRes(inherited GetItem(Index));
    end;
     
    procedure Ttt_SharedRes.Insert(Index: Integer; ASharedRes: TSharedRes);
    begin
      inherited Insert(Index, ASharedRes);
    end;
     
    function Ttt_SharedRes.Last: TSharedRes;
    begin
      Result := TSharedRes(inherited Last);
    end;
     
    procedure Ttt_SharedRes.SetItem(Index: Integer; const Value: TSharedRes);
    begin
      inherited SetItem(Index, Value);
    end;
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Points : 84
    Points
    84
    Par défaut
    Merci beaucoup pour ces précieux et rapides éclaircissements.
    J'ai également bien noté l'utilisation de la balise code pour mes éventuels recours futurs (voire contributions, qui sait...) à ce très bon forum.

    Flines.

  5. #5
    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 aussi des composant créant des pseudo tables en mémoire (TJvMemoryTable par exemple).

    Dans ce cas le composant sert à créer une table 'virtuelle' que l'on utilise comme n'importe quelle table (ajout, modification, destruction d'enregistrements, parcour de la table declencheur onPost etc ..)

    Je ne sais pas si cela peux vous aider, au moins pour une prochaine appli., dans le doute, je transmet.

  6. #6
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    2 pistes complémentaires:

    1/ MyLittleBase qui pousse jusqu'à permettre du SQL basic sur la structure gérée

    2/ Ce post car j'ai été confronté à un problème similaire il y a peu de temps http://www.developpez.net/forums/viewtopic.php?t=474390

    Bon retour à Delphi
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonjour,

    Je vais peut être dire une bêtise mais le composant TClientDataset ne pourrait-il pas faire l'affaire ?


    devYan.

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

Discussions similaires

  1. Problème pour lire les donnée d'une table externe
    Par mardoch dans le forum SQL*Loader
    Réponses: 6
    Dernier message: 17/07/2008, 16h41
  2. requette pour récuperer les clefs d'une table
    Par mauroyb0 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 15/04/2006, 16h19
  3. Probleme de requete pour remplir les champs d'une table
    Par Jim_Nastiq dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/04/2006, 14h56
  4. Réponses: 2
    Dernier message: 20/09/2005, 15h10
  5. Encore une question, pour retrouver 2 valeur d'une table
    Par danje dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/09/2005, 00h11

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