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

WinDev Discussion :

Indirection et classes


Sujet :

WinDev

  1. #1
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 755
    Par défaut Indirection et classes
    Bonjour,

    je tente de faire des indirections en utilisant un nom de classe, c'est possible ?
    Je n'arrive qu' à des erreurs de syntaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    sFichier est une chaîne = "Clients"
    gclClasse est un {"M" + sFichier}

  2. #2
    Membre actif Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Par défaut
    Citation Envoyé par wd_newbie Voir le message
    Bonjour,

    je tente de faire des indirections en utilisant un nom de classe, c'est possible ?
    Je n'arrive qu' à des erreurs de syntaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    sFichier est une chaîne = "Clients"
    gclClasse est un {"M" + sFichier}
    Tu veux faire une indirection sur un objet tu veux dire ?

  3. #3
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 755
    Par défaut
    Oui, un objet en fait , c'est pour avoir un objet instancié sur une classe non definie a l'avance

  4. #4
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 933
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Je ne comprend pas le but.
    Je reformule :
    -Tu as un ensemble de classes (dont MClient qui en plus est mappé.)
    -Tu veux créer un objet à partir d'une classe dont tu connais le nom sans utiliser directement le om de cette classe.
    En fait c'est comme si tu déclarais une variable sans vraiment connaître le type.
    Dans ce cas, on utilise un variant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Personne est un Variant
    Personne.Nom = "DUPONT"
    Personne.Prénom = "Michel"
    Par contre tu perd l'avantage de l'objet dans la mesure où les méthodes ne sont pas directement accessibles, il faut passer par une variable de type "Procedure"

  5. #5
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 755
    Par défaut
    Ce que j'essaie de faire, c'est créer une fenêtre générique qui permet de gérer les fichiers (tables) simples de forme ID / Libelle

    Par exemple les types de client, les types d'interventions, etc ... le genre de fichiers qui alimentent souvent des combos de choix.

    J'ai déjà une fenêtre générique qui permet de gérer le CRUD sur ces fichiers, mais faites de manière "traditionnelles", et je tente de la recréer en POO.

    Nom : FEN_Generique.png
Affichages : 455
Taille : 11,5 Ko

    L'idée est de passer le nom d'une classe, par exemple "MClients_Types" à cette fenêtre et tout le reste est géré

  6. #6
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 933
    Billets dans le blog
    1
    Par défaut
    Il faut passer par une classe Générique qui va contenir toutes les méthodes génériques e.g. Ajouter/Lire/Modifier/Supprimer.
    Les classes "principales" e.g. CClient, CIntervention (et par la même occasion les classes qui héritent de ces classes e.g. CClient1) hériteront de ce méthodes.
    Il suffira de passer le type en constructeur pour accéder à la bonne classe.
    Un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ETypeClasse est une Enumération
    	Client1
    	Client2
    	Client3
    	Intervention1
    	Intervention2
    	Facture
    FIN
    CGénérique est une Classe
    	m_pclTravail est un objet dynamique
    FIN
    Constructeur 1/2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PROCEDURE Constructeur()
    Constructeur 2/2
    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
     
    PROCÉDURE Constructeur(eTypeObjet est ETypeClasse)
    SELON eTypeObjet
    	CAS Client1
    		:m_pclTravail=allouer un CClient1 
    	CAS Client2
    		:m_pclTravail=allouer un CClient2
    	CAS Client3
    		:m_pclTravail=allouer un CClient3
    	CAS Intervention1
    		:m_pclTravail=allouer un CInter1
    	CAS Intervention2
    		:m_pclTravail=allouer un CInter2
    	CAS Facture
    		:m_pclTravail=allouer un CFacture
    FIN
    Supprimer (dans le cas d'une classe mappée. Pour une classe classique, il faudra une méthode par classe):
    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
     
    FONCTION Supprimer(pkIdentifiant est entier sur 8):booléen
    HLitRecherchePremier(MonFichierMappé,MaCléUniqueMappée,pkIdentifiant)
    HSupprime(MonFichierMappé)
     
    RENVOYER Vrai
     
    CAS EXCEPTION:
    	Trace("CAS EXCEPTION de Supprimer")
    	RENVOYER Faux 
     
    CAS ERREUR:
    	ErreurPropage(ErreurInfo())
    	Trace("CAS ERREUR de Supprimer")
    	RENVOYER Faux
    Méthode de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCÉDURE AfficheNomClasse()
    defObjet est un Définition
     
    defObjet=RécupèreDéfinition(m_pclTravail)
    Trace(defObjet..Nom)
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    clMonGénérique est CGénérique
     
    clMonGénérique=allouer un CGénérique(CGénérique.Client1)
    clMonGénérique:AfficheNomClasse()

  7. #7
    Membre actif Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Par défaut
    Citation Envoyé par wd_newbie Voir le message
    Bonjour,

    je tente de faire des indirections en utilisant un nom de classe, c'est possible ?
    Je n'arrive qu' à des erreurs de syntaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    sFichier est une chaîne = "Clients"
    gclClasse est un {"M" + sFichier}
    Oui c'est possible tu devra implémenter une méthode qui une instance de la classe voulu

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    PROCEDURE RetourneInstanceClasse(NomClasse est une chaine)
     
    SELON NomClasse 
         cas "MClients"
              RENVOYER Allouer une MClients()
    FIN
    Ensuite, ton objet lui par contre ne pourra pas être typé. Du coup tu perdra l'autocomplétion la compilation sera dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    gclClasse est un objet dynamique = RetourneInstanceClasse("MClients")

  8. #8
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 755
    Par défaut
    Merci pour toutes ces infos !!

    Je vais tester tout cela et mettrai les résultats ici !

  9. #9
    Membre émérite
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2017
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 338
    Par défaut
    Outch , le gros switch avec les noms de classe.
    il y a beaucoup plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    oObj est un objet dynamique
    oObj <- allouer un nomClasse
    nomClasse est un paramètre chaine passé à ta fonction (et il peut être obtenu depuis un objet déjà instancié avec ..Classe)
    Et tu renvoies l'objet
    Par contre c'est vrai tu perds l'autocomplétion.

    Pour générer des tableaux d'objets par contre ça ne marche pas, mais pour ça je te renvoie à ça https://www.developpez.net/forums/d2.../#post11384029

    Quand à ce que disait @Voroltinquo, il te faut de l'héritage même si je n'en ai pas vu dans ses extraits de code, mais il le dit bien dans son message.
    Et moyennant le polymorphisme que tu cherches, la méthode delete n'est à coder qu'une fois: ma classe mère ne contient qu'une fois le _getById, qu'une fois le _delete...Tout est factorisé.

Discussions similaires

  1. [WD17] Indirection sur une constante de classe
    Par cladoo dans le forum WinDev
    Réponses: 10
    Dernier message: 25/05/2016, 10h16
  2. it is indirectly referenced from required .class file (encore)
    Par professeur shadoko dans le forum Général Java
    Réponses: 4
    Dernier message: 15/04/2014, 12h22
  3. Accès indirect aux éléments d'une classe
    Par ChPr dans le forum Langage
    Réponses: 12
    Dernier message: 08/09/2013, 16h44
  4. Erreur "Indirectly referenced from required .class file"
    Par oni13 dans le forum Général Java
    Réponses: 5
    Dernier message: 20/08/2012, 13h44
  5. [WD17] Indirection sur membre tableau de structure d'une classe
    Par cladoo dans le forum WinDev
    Réponses: 8
    Dernier message: 05/07/2012, 10h11

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