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 :

Avis sur conception de classe et IHM


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut Avis sur conception de classe et IHM
    Bonjour à tous.
    Dans un but purement pédagogique, je me lance dans la réécriture d'une petite appli de gestion de bon de commande en utilisant les Classes.
    Dans mon cas, j'ai les classes client, articles, BCLigne, BCEntete et BCLignes qui est une collection de BCLigne.
    Les accès à la base de donnée sont gérers au niveau des classe.
    La ou j'hésite c'est au niveau de l'IHM, que dois je utiliser pour manipuler graphiquement BCLignes.

    Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 834
    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 834
    Points : 25 896
    Points
    25 896
    Par défaut
    Tu peux partir sur deux voies :
    - TObjectList ou TCollection
    - TDataSet

    Lorsque j'ai fait ma couche de persistance, j'ai fait une TEpcPersistantRelation et TEpcPersistantCollection, j'ai réfléchi, j'avais déjà vu un modèle utilisant une Liste (TObjectList) mais passé plusieurs milliers d'éléments, l'affichage dans une TStringGrid devient pénible ... étant donné que les objets sont issu d'une Base de Données, pourquoi ne pas utiliser le DataSet, ... et donc j'ai encapsulé un DataSet dans ce TEpcPersistantCollection, avec des propriétés typiques du DataSet (First, Next, EOF) et de la Liste (Count, Items, ...), et une propriété DataSource qui permet d'attacher le DataSet interne à une Grille, mais il est en ReadOnly et c'est il est en LocalUpdate, en gros si l'on le modifie, cela ne change rien dans la DB, car c'est toujours l'objet qui doit être le maitre de ses Données ...

    Je te laisse apprécier les prototypes des mes objets, te laissant deviner la quantité de code à faire

  3. #3
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Alors là tu me réconforte dans la voie car j'étais justement en train de penser utiliser un Dataset au lieu d'une collection ou Liste d'objet.
    En gros, tu as mis le Dataset en ReadOnly et LocalUpdate.
    Mon souci est la suivante :
    Toutes les classe que j'ai descend d'une classe abstraite et doit redefinr la medthode SaveToDabase, ceci dans le but de traiter un Commit/rollback global au niveau de la classe BC (Entete,BCLignes)
    La question est comment savoir quelle enregistrement a été modifié/Supprimer au niveau de la classe BCLignes afin de lancer l'enregistrement.

    Merci de t'être penche sur mon cas.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 834
    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 834
    Points : 25 896
    Points
    25 896
    Par défaut
    Alors, en fait, moi, ce que j'ai fait, c'est que l'on ne modifie que les objets, ainsi, lorsque tu as une grille, tu peux voir la grille normalement, mais pour modifier le contenu réellement, il faut récupérer l'objet courant (je lit l'ID courant dans le DataSet, je recheche dans une liste si l'objet à déjà été chargé, si oui, je donne cet objet, sinon je créé un nouvel objet, je le fait s'alimenter via persistance (RTTI avec propriétés publiées) depuis le DataSet, et je l'ajoute à la liste des objets chargés), ensuite, si tu modifie, il suffit de faire un Save sur l'objet courant ... ensuite la modification de la grille, je l'ai laissé à la responsabilité de l'application, si elle souhaite refléter les modifs dans un objet dans la grille, par défaut, je ne l'ai pas fait

    En fait, j'aimerais pouvoir séparer ma couche de persistance de la lib de mon employeur, pour la baser uniquement sur des TClientDataSet (ou sur le TDataSet avec le provider surchargé pour chaque base fournissant par exemple, la possibilité de mise en mémoire fait différement pour chaque) ... pour le moment, elle est fortement imbriqué, et le LocalUpdate c'est celui du TMyQuery (MyDAC pour MySQL par Core Lab)


    Grille TMS et Objet Relation à modifier ...
    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
    {* ----------------------------------------------------------------------------}
    procedure TfuiLesion.GridExamDblClickCell(Sender:TObject; ARow, ACol: Integer);
    var
      InputValue: string;
    begin
      if GridExamens.FieldAtColumn[ACol].IsNull then
        InputValue := ''
      else
        InputValue := GridExamens.FieldAtColumn[ACol].AsString;
     
      if InputQuery('Modification Examen', GridExamens.FieldAtColumn[ACol].FieldName, InputValue) then
      begin
        GridExamens.DataSource.DataSet.Edit();
        try
          GridExamens.FieldAtColumn[ACol].AsString := InputValue; // Pour l'Affichage uniquement et valide en plus le type de la donnée
     
          Examen.PublishedProperty[GridExamens.FieldAtColumn[ACol].FieldName] := VarAsType(InputValue, Examen.PublishedPropertyVarType[GridExamens.FieldAtColumn[ACol].FieldName]); // Modification de l'objet
          Examen.Save(); // Lance une requête SQL UPDATE
     
          GridExamens.DataSource.DataSet.Post(); // On valide l'affichage que si tout c'est bien déroulé
        except
          on E: Exception do
          begin
            GridExamens.DataSource.DataSet.Cancel(); 
            raise;
          end;
        end;
      end;
    end;

    Alors, tu as deux possibilité, soit tu te lance dans un monste de programmation comme ma couche de persistance, et donc passe beaucoup de temps, sur un code fun mais peu utile, soit tu ne te concentre que sur le côté architecture de l'application en objet et tu te bases sur une lib déjà existantes comme InstantsObjects ou ECO ...

  5. #5
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Si j'ai bien compris ta methode, je peux faire ainsi :
    - Une liste de BCLigne dans le Dataset (pour l'affichage grille ou autre).
    - Une collection d'objet de type BCLigne vide au départ.
    - a chaque modification d'une ligne recuperer sur le Dataset, création/mise à jour d'un objet BCLigne et rajout dans la Collection.
    - La methode SavetoBdd va juste parcourir la collection d'Objet BCLigne et mettre à jour les lignes correspondant à la BDD.

    Merci

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 834
    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 834
    Points : 25 896
    Points
    25 896
    Par défaut
    Tout à fait !

  7. #7
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Merci à toi
    Il me reste plus qu'a utiliser des flag dans le cas d'un ajout/Suppression de BCLigne.

    A+

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 834
    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 834
    Points : 25 896
    Points
    25 896
    Par défaut
    Idem, pour la suppresion, j'ai une méthode Delete qui supprime le persistant en cours, ... je l'ai aussi géré dans le cas d'une relation qui doit retirer d'éventuels liens ...

    Et pour le Add, je ne l'ai géré que dans le cas d'une relation (cela permet d'écrire les foreign key ou de créer une ligne dans une table n-n), dans le cas d'une collection de base (un SELECT), je n'en ai pas eu l'utilité

    pour moi, une il y a une relation entre BCLigne et BCEntete, et ainsi de suite, qui devrait te permettre d'écrire au final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Client.BCEntete[I].BCLigne[I].Article ...
    j'utilise le RecNo comme Index ...

  9. #9
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Merci pour tes lumières.

    Pour infos, j'ai utilisé un MemoryTable que j'alimente via un query à la création de la classe. Comme ça, j'ai une copie locale des liste à affiché.

    Merci

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

Discussions similaires

  1. [WD16] Avis sur conception bdd.
    Par rednight dans le forum WinDev
    Réponses: 10
    Dernier message: 07/03/2012, 10h43
  2. Avis sur conception
    Par fabrice91 dans le forum Débuter
    Réponses: 5
    Dernier message: 31/01/2011, 12h43
  3. [AC-2007] Avis sur conception bdd controle de performance
    Par triaguae dans le forum Modélisation
    Réponses: 2
    Dernier message: 26/04/2010, 15h56
  4. Demande Avis sur Diagramme de Classes
    Par medaadi dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 10/11/2009, 11h23
  5. [Mail] Avis sur ma première classe en PHP5
    Par ChambreClaire dans le forum Langage
    Réponses: 3
    Dernier message: 25/05/2008, 17h50

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