PC SOFT

DOCUMENTATION EN LIGNE
DE WINDEV, WEBDEV ET WINDEV MOBILE

  • Présentation d'une classe
  • Exemple de classe
  • Création et déclaration d'une classe
  • Création d'une classe
  • Syntaxe de déclaration de la classe et de ses éléments
  • Détail de la syntaxe de déclaration d'une classe
  • Exemple
  • Déclaration des membres d'une classe
  • Syntaxe
  • Détail de la syntaxe
  • Déclaration des membres de type tableau
  • Sérialisation des membres d'une classe
  • Databinding
  • Générer les méthodes d'accès à un membre d'une classe (conservé par compatibilité)
  • Déclaration des constantes de la classe
  • Syntaxe
  • Détail de la syntaxe
  • Exemple
  • Déclaration d'un singleton
  • Création et déclaration des méthodes de classes
  • Création d'une méthode de classe
  • Syntaxe de déclaration d'une méthode
  • Détail de la syntaxe
  • Portée identifiée par la couleur du bandeau
  • Suppression d'une méthode
  • Création et déclaration des propriétés
  • Présentation
  • Création d'une propriété de classe
  • Databinding
  • Droits d'accès à une propriété
  • Membres et propriétés
  • Héritage
  • Passage de propriétés en paramètre à une fonction ou procédure WLangage
  • Instances de classe à contexte HFSQL indépendant
  • Présentation
  • Syntaxe
  • Utilisation
  • Notes
  • Légende des icônes utilisées
  • Nouveautés depuis la version 9
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadApple WatchUniversal Windows 10 AppWindows Mobile
Autres
Procédures stockées
Présentation d'une classe
Une classe est composée de :
  • données, appelées membres.
  • constantes.
  • procédures, appelées méthodes. Une méthode est une procédure spécialement écrite pour manipuler les objets de la classe.
  • propriétés. Une propriété est un élément de la classe qui s'utilise directement par son nom comme un membre et pour lequel les opérations d'affectation et de récupération de la valeur provoquent l'exécution d'un traitement.
    AndroidUniversal Windows 10 AppJava Les propriétés de classes ne sont pas disponibles. Universal Windows 10 App Les propriétés de classes ne sont pas disponibles.
    Versions 22 et supérieures
    AndroidJava Les propriétés de classes sont désormais disponibles.
    Nouveauté 22
    AndroidJava Les propriétés de classes sont désormais disponibles.
    AndroidJava Les propriétés de classes sont désormais disponibles.
Pour utiliser une classe, il faut déclarer un ou plusieurs objets. Tous les objets d'une classe donnée sont identiques par leur forme et leur comportement, mais leurs membres contiennent des données différentes.
Par défaut les membres d'une classe sont publics, ils sont accessibles aussi bien par une méthode de la classe que par un traitement du projet ou de ses éléments (champ, fenêtre, ...).
Versions 17 et supérieures
AndroidUniversal Windows 10 App Cette fonctionnalité est désormais disponible pour les applications Android et Windows Phone.
iPhone/iPad Cette fonctionnalité est désormais disponible pour les applications iPhone/iPad.
Nouveauté 17
AndroidUniversal Windows 10 App Cette fonctionnalité est désormais disponible pour les applications Android et Windows Phone.
iPhone/iPad Cette fonctionnalité est désormais disponible pour les applications iPhone/iPad.
AndroidUniversal Windows 10 App Cette fonctionnalité est désormais disponible pour les applications Android et Windows Phone.
iPhone/iPad Cette fonctionnalité est désormais disponible pour les applications iPhone/iPad.
Versions 21 et supérieures
Universal Windows 10 App Cette fonctionnalité est disponible en mode Universal Windows 10 App.
Apple Watch Cette fonctionnalité est disponible en mode Apple Watch.
Nouveauté 21
Universal Windows 10 App Cette fonctionnalité est disponible en mode Universal Windows 10 App.
Apple Watch Cette fonctionnalité est disponible en mode Apple Watch.
Universal Windows 10 App Cette fonctionnalité est disponible en mode Universal Windows 10 App.
Apple Watch Cette fonctionnalité est disponible en mode Apple Watch.
Exemple de classe
La classe "CFichier" est composée des membres : m_sCheminCourt, m_sCheminLong, m_sExtension, m_sNomCourt, m_sNomLong.
La classe "CFichier" a les méthodes suivantes :
  • DateFichier()
  • SelectionFichier()
  • HeureFichier()
  • TailleFichier()
Cette classe n'a pas de propriétés.
Les informations affichées dans le volet "Explorateur de projet" sont les suivantes :
Explorateur de projet, dossier
Pour connaître la légende des différentes icônes utilisées, consultez les Notes.
Création et déclaration d'une classe

Création d'une classe

Pour créer une classe :
  1. Affichez si nécessaire l'explorateur de projet (option "Affichage .. Barres d'outils .. Volets .. Explorateur de projet").Affichez si nécessaire l'explorateur de projet (sous le volet "Accueil", dans le groupe "Environnement", déroulez "Volets" et sélectionnez "Explorateur de projet").
  2. Dans l'explorateur de projet, affichez le menu contextuel du dossier "Classes" et sélectionnez "Nouvelle classe".
  3. Saisissez le nom de la classe dans la fenêtre qui s'ouvre et validez.
  4. L'éditeur de code affiche le code de la nouvelle classe. Le traitement de déclaration de la classe ainsi que le constructeur et le destructeur sont automatiquement créés.

Syntaxe de déclaration de la classe et de ses éléments

<NomClasse> est une classe [, abstraite]
<Portée et droits>
<Déclaration membre 1>
<Déclaration membre 2>
<Portée et droits>
<Déclaration membre 3>
<Déclaration membre 4>
...
<CONSTANTE>
<Déclaration des constantes>
FIN

Détail de la syntaxe de déclaration d'une classe

<NomClasse>
Nom identifiant la classe.
Versions 19 et supérieures
abstraite : optionnel
Permet d'indiquer que la classe est abstraite. Une classe abstraite est une classe de base qui regroupe des comportements communs à plusieurs classes.
Une classe est abstraite lorsqu’elle est déclarée comme telle ou si une de ses méthodes est abstraite.
Une classe abstraite ne peut pas être instanciée.
Nouveauté 19
abstraite : optionnel
Permet d'indiquer que la classe est abstraite. Une classe abstraite est une classe de base qui regroupe des comportements communs à plusieurs classes.
Une classe est abstraite lorsqu’elle est déclarée comme telle ou si une de ses méthodes est abstraite.
Une classe abstraite ne peut pas être instanciée.
abstraite : optionnel
Permet d'indiquer que la classe est abstraite. Une classe abstraite est une classe de base qui regroupe des comportements communs à plusieurs classes.
Une classe est abstraite lorsqu’elle est déclarée comme telle ou si une de ses méthodes est abstraite.
Une classe abstraite ne peut pas être instanciée.
<Portée et droits>
Ce paramètre est de la forme : [GLOBAL][ Public/ Public CONSTANT / Protégé / Protégé CONSTANT / Privé ]
GLOBAL : Optionnel
Définit un membre global. Ce membre existera en dehors des objets. Il pourra être utilisé sans instancier un objet. Si plusieurs objets sont déclarés, un membre global est commun à tous les objets.
<Mode d'accès> : Optionnel
Permet de restreindre l'accès à ce membre de la classe.
  • Public (par défaut) : accès autorisé depuis n'importe quel code de la classe ou du projet.
  • Public CONSTANT : La valeur du membre peut être lue et modifiée depuis un code de la classe ou d'une classe dérivée, et uniquement lue depuis un autre code de l'application.
  • Protégé : accès autorisé depuis un code de la classe ou un code d'une classe dérivée (et "héritée")
  • Protégé CONSTANT : La valeur du membre peut être lue et modifiée depuis un code de la classe, uniquement lue depuis un code d'une classe dérivée, et inaccessible depuis un autre code de l'application.
  • Privé : accès autorisé depuis un code de la classe
<Déclaration membre>
Syntaxe de déclaration des membres de la classe (voir ci-dessous). La portée et les droits d'accès des membres sont ceux courants.
<Déclaration des constantes>
Syntaxe de déclaration des constantes (voir ci-dessous).

Exemple

ClasseSystème est une Classe
        Nom est une chaîne
FIN
Déclaration des membres d'une classe

Syntaxe

<Nom du membre> est un <Type du membre> [ = <Valeur initiale>]

Détail de la syntaxe

<Nom du membre>
Nom identifiant le membre.
<Type du membre>
Type du membre choisi parmi les types disponibles du WLangage.
<Valeur initiale>
Valeur initiale du membre.
ClasseSystème est une Classe
        Nom est une chaîne
PRIVÉ
        TailleClasse est un entier
FIN

Déclaration des membres de type tableau

Pour déclarer un tableau dans une classe, il suffit d'utiliser la syntaxe suivante :
ClasseSystème est une classe
TableauDéfaut est un tableau de 1 entier
FIN
Le tableau est déclaré de la même façon que les tableaux simples (pour plus de détails, consultez le type Tableau).
Lors de copies d'instances de classes, tous les membres de la classe sont recopiés dans la nouvelle instance, sauf les tableaux. Ainsi, si la valeur d'un membre de type tableau est modifiée, cette valeur est modifiée dans toutes les instances.
Pour obtenir des tableaux indépendants dans toutes les instances de classes, il est nécessaire de déclarer un tableau local de la manière suivante :
ClasseSystème est une classe
TableauDéfaut est un tableau local de 1 entier
FIN

Versions 18 et supérieures
Remarque : Pour obtenir des tableaux indépendants dans toutes les instances de classes :
  1. Affichez la fenêtre de description du projet : sous le volet "Projet", dans le groupe "Projet", cliquez sur "Description".
  2. Dans l'onglet "Compilation", cochez l'option "Tableaux : l'affectation copie le contenu".
Pour plus de détails, consultez Description projet, onglet compilation.
Nouveauté 18
Remarque : Pour obtenir des tableaux indépendants dans toutes les instances de classes :
  1. Affichez la fenêtre de description du projet : sous le volet "Projet", dans le groupe "Projet", cliquez sur "Description".
  2. Dans l'onglet "Compilation", cochez l'option "Tableaux : l'affectation copie le contenu".
Pour plus de détails, consultez Description projet, onglet compilation.
Remarque : Pour obtenir des tableaux indépendants dans toutes les instances de classes :
  1. Affichez la fenêtre de description du projet : sous le volet "Projet", dans le groupe "Projet", cliquez sur "Description".
  2. Dans l'onglet "Compilation", cochez l'option "Tableaux : l'affectation copie le contenu".
Pour plus de détails, consultez Description projet, onglet compilation.
Versions 19 et supérieures

Sérialisation des membres d'une classe

Par défaut, tous les membres d'une classe sont sérialisés.
Il est possible de gérer précisément la sérialisation de chaque membre d'une classe :
  • en indiquant quel membre sera sérialisé lors de l'appel à la fonction Sérialise.
    Cette opération est possible sur tous les types de sérialisation (WXML, JSON, binaire).
  • en changeant le nom du membre lors de la sérialisation par la fonction Sérialise.
    Cette opération n'est pas possible lors d'une sérialisation binaire.
Cette gestion de la sérialisation est réalisée en utilisant la syntaxe suivante :
  • Sérialisation ou non d'un membre :
    <Nom du membre> est un <Type du membre> [ = <Valeur initiale>]
    [, Sérialise = <Vrai/Faux>]
  • Sérialisation et changement du nom d'un membre :
    <Nom du membre> est un <Type du membre> [ = <Valeur initiale>]
    [, Sérialise = <Nouveau nom>]
Exemple :
Cl est une Classe
// Membre sérialisé
MembreSérialisé est un entier
// Membre non sérialisé
MembreNonSérialisé est une chaîne, Sérialise = Faux  
// Membre renommé lors de la sérialisation
MembreRenommé est un entier, Sérialise = "NouveauNomMembre"
FIN
Nouveauté 19

Sérialisation des membres d'une classe

Par défaut, tous les membres d'une classe sont sérialisés.
Il est possible de gérer précisément la sérialisation de chaque membre d'une classe :
  • en indiquant quel membre sera sérialisé lors de l'appel à la fonction Sérialise.
    Cette opération est possible sur tous les types de sérialisation (WXML, JSON, binaire).
  • en changeant le nom du membre lors de la sérialisation par la fonction Sérialise.
    Cette opération n'est pas possible lors d'une sérialisation binaire.
Cette gestion de la sérialisation est réalisée en utilisant la syntaxe suivante :
  • Sérialisation ou non d'un membre :
    <Nom du membre> est un <Type du membre> [ = <Valeur initiale>]
    [, Sérialise = <Vrai/Faux>]
  • Sérialisation et changement du nom d'un membre :
    <Nom du membre> est un <Type du membre> [ = <Valeur initiale>]
    [, Sérialise = <Nouveau nom>]
Exemple :
Cl est une Classe
// Membre sérialisé
MembreSérialisé est un entier
// Membre non sérialisé
MembreNonSérialisé est une chaîne, Sérialise = Faux  
// Membre renommé lors de la sérialisation
MembreRenommé est un entier, Sérialise = "NouveauNomMembre"
FIN

Sérialisation des membres d'une classe

Par défaut, tous les membres d'une classe sont sérialisés.
Il est possible de gérer précisément la sérialisation de chaque membre d'une classe :
  • en indiquant quel membre sera sérialisé lors de l'appel à la fonction Sérialise.
    Cette opération est possible sur tous les types de sérialisation (WXML, JSON, binaire).
  • en changeant le nom du membre lors de la sérialisation par la fonction Sérialise.
    Cette opération n'est pas possible lors d'une sérialisation binaire.
Cette gestion de la sérialisation est réalisée en utilisant la syntaxe suivante :
  • Sérialisation ou non d'un membre :
    <Nom du membre> est un <Type du membre> [ = <Valeur initiale>]
    [, Sérialise = <Vrai/Faux>]
  • Sérialisation et changement du nom d'un membre :
    <Nom du membre> est un <Type du membre> [ = <Valeur initiale>]
    [, Sérialise = <Nouveau nom>]
Exemple :
Cl est une Classe
// Membre sérialisé
MembreSérialisé est un entier
// Membre non sérialisé
MembreNonSérialisé est une chaîne, Sérialise = Faux  
// Membre renommé lors de la sérialisation
MembreRenommé est un entier, Sérialise = "NouveauNomMembre"
FIN

Databinding

Le Databinding est disponible sur les membres de la classe.

Générer les méthodes d'accès à un membre d'une classe (conservé par compatibilité)

L'éditeur de code permet de générer simplement les méthodes d'accès à un membre d'une classe. Il suffit de :
  1. Déclarer votre membre dans la classe si ce n'est déjà fait.
  2. Dans le volet "Code", affichez la description de la classe.
  3. Sélectionnez le membre voulu puis l'option "Générer les méthodes d'accès" du menu contextuel.
    Générer les méthodes d'accès
  4. Deux nouvelles méthodes sont automatiquement générées dans la classe :
    • Ecrit_<Nom du membre>
    • Lit_<Nom du membre>
Ces méthodes peuvent être utilisées pour accéder au membre.
Déclaration des constantes de la classe

Syntaxe

CONSTANT <Nom de la constante> = <Valeur de la constante>

CONSTANT
<Nom de la constante> = <Valeur de la constante>
<Nom de la constante> = <Valeur de la constante>
FIN

Détail de la syntaxe

<Nom de la constante>
Nom défini pour la constante. Une constante est publique.
<Valeur de la constante>
Valeur associée à la constante. Cette valeur ne variera pas au cours du programme.

Exemple

CONSTANT K=5
CONSTANT
K=5
J=10
FIN
Versions 22 et supérieures
Déclaration d'un singleton
Un Singleton est une déclaration d'une instance unique de classe.
Pour déclarer une instance unique d'une classe et pour l'allouer immédiatement, il est possible d'utiliser la syntaxe suivante :
<Nom classe singleton> est une Classe
GLOBAL
<Nom instance> est <Nom classe singleton>
FIN
Exemple
CSingleton est une Classe
GLOBAL
m_Singleton est CSingleton
FIN
Nouveauté 22
Déclaration d'un singleton
Un Singleton est une déclaration d'une instance unique de classe.
Pour déclarer une instance unique d'une classe et pour l'allouer immédiatement, il est possible d'utiliser la syntaxe suivante :
<Nom classe singleton> est une Classe
GLOBAL
<Nom instance> est <Nom classe singleton>
FIN
Exemple
CSingleton est une Classe
GLOBAL
m_Singleton est CSingleton
FIN
Déclaration d'un singleton
Un Singleton est une déclaration d'une instance unique de classe.
Pour déclarer une instance unique d'une classe et pour l'allouer immédiatement, il est possible d'utiliser la syntaxe suivante :
<Nom classe singleton> est une Classe
GLOBAL
<Nom instance> est <Nom classe singleton>
FIN
Exemple
CSingleton est une Classe
GLOBAL
m_Singleton est CSingleton
FIN
Création et déclaration des méthodes de classes

Création d'une méthode de classe

Pour créer une méthode de classe :
  1. Affichez si nécessaire l'explorateur de projet (option "Affichage .. Barres d'outils .. Volets .. Explorateur de projet").Affichez si nécessaire l'explorateur de projet : sous le volet "Accueil", dans le groupe "Environnement", déroulez "Volets" et sélectionnez "Explorateur de projet".
  2. Dans l'explorateur de projet, affichez les différentes classes disponibles : il suffit de dérouler le dossier "Classes".
  3. Sélectionnez la classe voulue. Affichez le menu contextuel de la classe (clic droit) et sélectionnez l'option "Nouvelle méthode".
  4. Dans la fenêtre qui s'ouvre :
    • Saisissez le nom de la méthode.
    • Versions 21 et supérieures
      Indiquez si le commentaire du prototype de la méthode doit être généré automatiquement (option "Générer un commentaire d'en-tête").
      Pour plus de détails sur les commentaires générés automatiquement, consultez Documentation automatique des procédures et des méthodes.
      Nouveauté 21
      Indiquez si le commentaire du prototype de la méthode doit être généré automatiquement (option "Générer un commentaire d'en-tête").
      Pour plus de détails sur les commentaires générés automatiquement, consultez Documentation automatique des procédures et des méthodes.
      Indiquez si le commentaire du prototype de la méthode doit être généré automatiquement (option "Générer un commentaire d'en-tête").
      Pour plus de détails sur les commentaires générés automatiquement, consultez Documentation automatique des procédures et des méthodes.
    • Indiquez si la méthode est publique, protégée ou privée. Pour plus de détails, consultez la partie "Accès" du Détail de la syntaxe.
    • Indiquez si la méthode est abstraite. Pour plus de détails, consultez la partie "Abstraite" du Détail de la syntaxe.
    • Indiquez si la méthode est globale. Pour plus de détails, consultez la partie "Globale" du Détail de la syntaxe.
    • Validez.
  5. L'éditeur de code affiche le code de la nouvelle méthode.

Syntaxe de déclaration d'une méthode

PROCEDURE [<Accès>] [Globale] [VIRTUELLE] [ABSTRAITE]
<Nom de la méthode> ([<Paramètre1>, ...[<ParamètreN>]]) [<Attributs d'extension>]

Détail de la syntaxe

<Accès> : Optionnel
Permet de restreindre l'accès à cette méthode. 3 niveaux sont disponibles :
  • Privé : la méthode peut être appelée uniquement depuis un code de la classe
  • Protégé : la méthode peut être appelée uniquement depuis un code de la classe ou un code d'une classe dérivée
  • Public (par défaut) : la méthode peut être appelée depuis n'importe quel code de la classe ou du projet.
Globale : Optionnel
Définit une méthode globale. Cette méthode ne travaillera pas sur un objet particulier : il n'est pas nécessaire de disposer d'un objet de la classe pour appeler cette méthode. Cette classe permet aussi de manipuler les membres globaux.
Virtuelle : Optionnel
Définit une méthode virtuelle. Par défaut, une méthode redéfinie est virtuelle.
Versions 19 et supérieures
Abstraite : Optionnel
Définit une méthode abstraite. Une méthode abstraite est une méthode qui doit obligatoirement être redéfinie dans les classes dérivées. Par défaut, une méthode n'est pas abstraite.
Nouveauté 19
Abstraite : Optionnel
Définit une méthode abstraite. Une méthode abstraite est une méthode qui doit obligatoirement être redéfinie dans les classes dérivées. Par défaut, une méthode n'est pas abstraite.
Abstraite : Optionnel
Définit une méthode abstraite. Une méthode abstraite est une méthode qui doit obligatoirement être redéfinie dans les classes dérivées. Par défaut, une méthode n'est pas abstraite.
<Nom de la méthode>
Nom identifiant la méthode.
<Paramètre 1> ... <Paramètre N>
Paramètres optionnels à passer à la méthode.
Versions 23 et supérieures
<Attribut d'extension>
Attributs d'extension permettant de définir des options de gestion de l'éditeur de code. Les attributs d'extension disponibles sont :
  • <zombie [commentaire = "texte"]> : Permet de définir une méthode obsolète (également appelée méthode zombie). Le mot-clé optionnel commentaire permet d'indiquer le texte qui sera affiché dans l'erreur de compilation associée à la méthode obsolète. Pour plus de détails, consultez Procédures zombies.
  • <sans pas à pas> : Permet d'indiquer que cette méthode sera ignorée par le débogueur lors d'un débogage en mode "Pas à pas".
Nouveauté 23
<Attribut d'extension>
Attributs d'extension permettant de définir des options de gestion de l'éditeur de code. Les attributs d'extension disponibles sont :
  • <zombie [commentaire = "texte"]> : Permet de définir une méthode obsolète (également appelée méthode zombie). Le mot-clé optionnel commentaire permet d'indiquer le texte qui sera affiché dans l'erreur de compilation associée à la méthode obsolète. Pour plus de détails, consultez Procédures zombies.
  • <sans pas à pas> : Permet d'indiquer que cette méthode sera ignorée par le débogueur lors d'un débogage en mode "Pas à pas".
<Attribut d'extension>
Attributs d'extension permettant de définir des options de gestion de l'éditeur de code. Les attributs d'extension disponibles sont :
  • <zombie [commentaire = "texte"]> : Permet de définir une méthode obsolète (également appelée méthode zombie). Le mot-clé optionnel commentaire permet d'indiquer le texte qui sera affiché dans l'erreur de compilation associée à la méthode obsolète. Pour plus de détails, consultez Procédures zombies.
  • <sans pas à pas> : Permet d'indiquer que cette méthode sera ignorée par le débogueur lors d'un débogage en mode "Pas à pas".
PROCEDURE GLOBALE VoirObjet(obj)
// Le membre privé TailleClasse est accessible depuis le code de la classe
Info("Nom : " + obj:Nom + "Taille : " + obj:TailleClasse)
FONCTION GLOBALE Essai(a1,b1)
RENVOYER a1 + b1
Versions 16 et supérieures

Portée identifiée par la couleur du bandeau

Une méthode d'une classe peut être publique, privée ou protégée.
La couleur de début de bandeau de l'événement change en fonction de la portée de la méthode :
  • début de bandeau rouge : méthode privée.
  • début de bandeau orange : méthode protégée.
  • début de bandeau habituel : méthode publique.
Couleur des bandeaux des méthodes
Nouveauté 16

Portée identifiée par la couleur du bandeau

Une méthode d'une classe peut être publique, privée ou protégée.
La couleur de début de bandeau de l'événement change en fonction de la portée de la méthode :
  • début de bandeau rouge : méthode privée.
  • début de bandeau orange : méthode protégée.
  • début de bandeau habituel : méthode publique.
Couleur des bandeaux des méthodes

Portée identifiée par la couleur du bandeau

Une méthode d'une classe peut être publique, privée ou protégée.
La couleur de début de bandeau de l'événement change en fonction de la portée de la méthode :
  • début de bandeau rouge : méthode privée.
  • début de bandeau orange : méthode protégée.
  • début de bandeau habituel : méthode publique.
Couleur des bandeaux des méthodes

Suppression d'une méthode

Une méthode peut être supprimée :
  • directement depuis le volet "Explorateur de projet" (option "Supprimer" du menu contextuel)
  • Versions 16 et supérieures
    depuis l'éditeur de code, par le menu contextuel du bandeau de la méthode (option "Supprimer").
    Nouveauté 16
    depuis l'éditeur de code, par le menu contextuel du bandeau de la méthode (option "Supprimer").
    depuis l'éditeur de code, par le menu contextuel du bandeau de la méthode (option "Supprimer").
Création et déclaration des propriétés

Présentation

Une propriété est un élément de code possédant deux traitements :
  • un traitement de récupération de la valeur,
  • un traitement d'affectation de la valeur.
Une propriété peut être utilisée comme une variable ou un membre (récupération directe de la valeur, affectation par le symbole '=', ...). Lors de l'exécution :
  • Toute opération nécessitant la lecture de la propriété exécute le traitement de récupération de la valeur. Ce traitement doit renvoyer une valeur.
  • Toute opération nécessitant l'écriture de la propriété exécute le traitement d'affectation de la valeur qui doit traiter un paramètre.
AndroidUniversal Windows 10 AppJava Les propriétés de classes ne sont pas disponibles.
Universal Windows 10 App Les propriétés de classes ne sont pas disponibles.
Versions 22 et supérieures
AndroidJava Les propriétés de classes sont désormais disponibles.
Nouveauté 22
AndroidJava Les propriétés de classes sont désormais disponibles.
AndroidJava Les propriétés de classes sont désormais disponibles.

Création d'une propriété de classe

Pour créer une propriété de classe :
  1. Affichez si nécessaire l'explorateur de projet (option "Affichage .. Barres d'outils .. Volets .. Explorateur de projet").Affichez si nécessaire l'explorateur de projet (sous le volet "Accueil", dans le groupe "Environnement", déroulez "Volets" et sélectionnez "Explorateur de projet").
  2. Dans l'explorateur de projet, affichez les différentes classes disponibles (déroulez le dossier "Classes").
  3. Sélectionnez la classe voulue. Affichez le menu contextuel de la classe et sélectionnez l'option "Nouvelle propriété".
  4. Saisissez le nom de la propriété dans la fenêtre qui s'ouvre et validez.
  5. L'éditeur de code affiche les traitements liés à la propriété :
    • Traitement de récupération de la propriété. Ce traitement contient :
      • soit le mot-clé "RENVOYER" qui permet d'obtenir la valeur de la propriété.
      • soit le mot-clé "RETOUR =" pour renvoyer la valeur de la propriété.
    • Traitement d'affectation de la propriété. Ce traitement permet de donner une valeur à la propriété. Cette valeur est passée en paramètre. Ce traitement ne doit pas renvoyer de résultat.
Remarque : Une nouvelle propriété peut également être créée depuis le menu contextuel d'un membre. Les procédures manipulent alors automatiquement le membre spécifié.

Databinding

Le Databinding est disponible sur les propriétés des classes et des membres de classes.

Droits d'accès à une propriété

Si le traitement de récupération est vide, la lecture de la propriété est interdite. Une erreur de compilation apparaîtra sous l'éditeur et une erreur se produira également en exécution.
Si le traitement d'affectation est vide, l'écriture de la propriété est interdite. Une erreur de compilation apparaîtra sous l'éditeur et une erreur se produira également en exécution.
Les traitements de récupération et d'affectation peuvent être publics, privés ou protégés. Les droits d'accès de la propriété correspondent aux droits les moins restrictifs des deux traitements. Pour plus de détails, consultez Droits d'accès à une propriété.
Les propriétés peuvent être globales. Une propriété est globale à la classe lorsque les traitements de récupération et d'affectation sont globaux. Si l'un des traitements est global, tous les traitements doivent l'être sinon une erreur de compilation est affichée.

Membres et propriétés

Une propriété peut avoir le même nom qu'un membre déjà existant. Dans ce cas, les ordres de priorité sont les suivants :
  • dans les traitements de la propriété, le membre est prioritaire sur la propriété.
  • dans tout le reste du code, la propriété est prioritaire sur le membre.
Ainsi, il est possible de remplacer un membre par une propriété sans aucune modification du code utilisant le membre.
Les traitements d'une propriété ne peuvent pas utiliser récursivement la propriété. S'il n'existe pas de membre du même nom que la propriété, l'utilisation de la propriété dans un de ses traitements provoquera une erreur de compilation.

Héritage

Les propriétés des classes de base sont héritées dans les classes dérivées.
Une propriété peut être surchargée dans une classe dérivée. Les traitements d'une propriété sont toujours considérés comme virtuels : l'utilisation du mot-clé VIRTUEL est inutile et ignorée.
L'héritage multiple est supporté sur les propriétés. Il est possible d'appeler les propriétés des classes de base grâce aux syntaxes :
  • Ancêtre.Propriété si la classe dérivée n'a qu'une seule classe de base
  • ClasseDeBase.Propriété dans tous les cas.

Passage de propriétés en paramètre à une fonction ou procédure WLangage

Si le paramètre est passé par adresse (cas par défaut) et non typé :
  • la propriété est passée en paramètre.
  • aucun traitement associé à la propriété n'est exécuté au moment de l'appel.
  • la lecture du paramètre formel exécute le code de récupération de la valeur.
  • l'écriture du paramètre formel exécute le code d'affectation de la valeur.
Si le paramètre est passé par valeur (LOCAL) et non typé :
  • la valeur de la propriété est passée en paramètre.
  • le code de récupération de la valeur est exécuté au moment de l'appel.
  • la lecture du paramètre formel accède à la valeur passée au moment de l'appel et n'exécute pas le code de récupération de la valeur.
  • l'écriture du paramètre formel modifie la valeur passée au moment de l'appel et n'exécute pas le code d'affectation de la valeur.
Si le paramètre est passé par adresse (cas par défaut) et typé :
  • la propriété est passée en paramètre.
  • le type de la propriété doit être correct. Dans le cas contraire, une erreur WLangage est affichée.
  • aucun traitement associé à la propriété n'est exécuté au moment de l'appel.
  • la lecture du paramètre formel exécute le code de récupération de la valeur.
  • l'écriture du paramètre formel exécute le code d'affectation de la valeur.
Si le paramètre est passé par valeur (LOCAL) et typé :
  • la valeur de la propriété est passée en paramètre.
  • le code de récupération de la valeur est exécuté au moment de l'appel.
  • si nécessaire, la valeur de la propriété est convertie dans le type du paramètre.
  • la lecture du paramètre formel accède à la valeur passée au moment de l'appel et n'exécute pas le code de récupération de la valeur.
  • l'écriture du paramètre formel modifie la valeur passée au moment de l'appel et n'exécute pas le code d'affectation de la valeur.
Versions 15 et supérieures
Instances de classe à contexte HFSQL indépendant

Présentation

Il est possible d'associer une copie du contexte HFSQL à une instance de classe. Tous les accès à HFSQL effectués depuis les méthodes et les propriétés de la classe (appels de fonctions ou accès aux enregistrements) opèrent sur la copie du contexte de l'instance de la classe.
Remarque : A partir de la version 19, HFSQL est le nouveau nom de HyperFileSQL.
AndroidUniversal Windows 10 AppJava Cette fonctionnalité n'est pas disponible.

Syntaxe

La syntaxe à utiliser est la suivante :
// Déclaration de la classe
ClasseHyperFileSQLIndépendant est une classe, contexte HyperFileSQL indépendant

FIN
ou
// Déclaration de la classe
ClasseHyperFileSQLIndépendant est une classe
<contexte HyperFileSQL indépendant>

FIN
// Déclaration de la classe
ClasseHFSQLIndépendant est une Classe, contexte HFSQL indépendant [<léger/complet>]
FIN
ou
// Déclaration de la classe
ClasseHFSQLIndépendant est une Classe
<contexte HFSQL indépendant léger/complet>

FIN
Par exemple :
ClasseHFSQLIndépendant est une Classe, contexte HFSQL indépendant léger
Versions 20 et supérieures
Paramètre léger/complet :
  • Le mot-clé "léger" provoque la copie immédiate d'une partie du contexte HFSQL.
    Seuls les répertoires où se trouvent les fichiers de données en HFSQL Classic et/ou les connexions en HFSQL Client/Serveur sont mémorisés.
  • Le mot-clé "complet" provoque la copie immédiate du contexte HFSQL.
    Conseillé par exemple si le thread doit tenir compte des positions en cours dans les fichiers et requêtes du contexte de l'appelant.
Nouveauté 20
Paramètre léger/complet :
  • Le mot-clé "léger" provoque la copie immédiate d'une partie du contexte HFSQL.
    Seuls les répertoires où se trouvent les fichiers de données en HFSQL Classic et/ou les connexions en HFSQL Client/Serveur sont mémorisés.
  • Le mot-clé "complet" provoque la copie immédiate du contexte HFSQL.
    Conseillé par exemple si le thread doit tenir compte des positions en cours dans les fichiers et requêtes du contexte de l'appelant.
Paramètre léger/complet :
  • Le mot-clé "léger" provoque la copie immédiate d'une partie du contexte HFSQL.
    Seuls les répertoires où se trouvent les fichiers de données en HFSQL Classic et/ou les connexions en HFSQL Client/Serveur sont mémorisés.
  • Le mot-clé "complet" provoque la copie immédiate du contexte HFSQL.
    Conseillé par exemple si le thread doit tenir compte des positions en cours dans les fichiers et requêtes du contexte de l'appelant.

Utilisation

Le contexte HFSQL de l'instance est créé par copie du contexte courant lors de l'exécution du constructeur.
Les opérateurs = et <= entre deux instances à contexte HFSQL indépendant recopient le contenu du contexte HFSQL.
Il est déconseillé d'utiliser des instances de classes à contexte HFSQL indépendant pour simuler un alias sur un seul fichier HFSQL ou sur un enregistrement particulier d'un fichier HFSQL. La copie du contexte HFSQL porte en effet sur tous les éléments (les fichiers, vues, requêtes, connexions, ...) du contexte et peut donc être très coûteuse en temps.
Une instance de classe à contexte HFSQL indépendant peut être utilisée uniquement dans le thread qui a exécuté le constructeur. Pour manipuler une instance de classe à contexte HFSQL indépendant dans plusieurs threads, il est nécessaire :
  • d'allouer une nouvelle instance de la classe
  • de faire une copie de l'instance d'origine grâce à l'opérateur = ou <=.
Nouveauté 15
Instances de classe à contexte HFSQL indépendant

Présentation

Il est possible d'associer une copie du contexte HFSQL à une instance de classe. Tous les accès à HFSQL effectués depuis les méthodes et les propriétés de la classe (appels de fonctions ou accès aux enregistrements) opèrent sur la copie du contexte de l'instance de la classe.
Remarque : A partir de la version 19, HFSQL est le nouveau nom de HyperFileSQL.
AndroidUniversal Windows 10 AppJava Cette fonctionnalité n'est pas disponible.

Syntaxe

La syntaxe à utiliser est la suivante :
// Déclaration de la classe
ClasseHyperFileSQLIndépendant est une classe, contexte HyperFileSQL indépendant

FIN
ou
// Déclaration de la classe
ClasseHyperFileSQLIndépendant est une classe
<contexte HyperFileSQL indépendant>

FIN
// Déclaration de la classe
ClasseHFSQLIndépendant est une Classe, contexte HFSQL indépendant [<léger/complet>]
FIN
ou
// Déclaration de la classe
ClasseHFSQLIndépendant est une Classe
<contexte HFSQL indépendant léger/complet>

FIN
Par exemple :
ClasseHFSQLIndépendant est une Classe, contexte HFSQL indépendant léger
Versions 20 et supérieures
Paramètre léger/complet :
  • Le mot-clé "léger" provoque la copie immédiate d'une partie du contexte HFSQL.
    Seuls les répertoires où se trouvent les fichiers de données en HFSQL Classic et/ou les connexions en HFSQL Client/Serveur sont mémorisés.
  • Le mot-clé "complet" provoque la copie immédiate du contexte HFSQL.
    Conseillé par exemple si le thread doit tenir compte des positions en cours dans les fichiers et requêtes du contexte de l'appelant.
Nouveauté 20
Paramètre léger/complet :
  • Le mot-clé "léger" provoque la copie immédiate d'une partie du contexte HFSQL.
    Seuls les répertoires où se trouvent les fichiers de données en HFSQL Classic et/ou les connexions en HFSQL Client/Serveur sont mémorisés.
  • Le mot-clé "complet" provoque la copie immédiate du contexte HFSQL.
    Conseillé par exemple si le thread doit tenir compte des positions en cours dans les fichiers et requêtes du contexte de l'appelant.
Paramètre léger/complet :
  • Le mot-clé "léger" provoque la copie immédiate d'une partie du contexte HFSQL.
    Seuls les répertoires où se trouvent les fichiers de données en HFSQL Classic et/ou les connexions en HFSQL Client/Serveur sont mémorisés.
  • Le mot-clé "complet" provoque la copie immédiate du contexte HFSQL.
    Conseillé par exemple si le thread doit tenir compte des positions en cours dans les fichiers et requêtes du contexte de l'appelant.

Utilisation

Le contexte HFSQL de l'instance est créé par copie du contexte courant lors de l'exécution du constructeur.
Les opérateurs = et <= entre deux instances à contexte HFSQL indépendant recopient le contenu du contexte HFSQL.
Il est déconseillé d'utiliser des instances de classes à contexte HFSQL indépendant pour simuler un alias sur un seul fichier HFSQL ou sur un enregistrement particulier d'un fichier HFSQL. La copie du contexte HFSQL porte en effet sur tous les éléments (les fichiers, vues, requêtes, connexions, ...) du contexte et peut donc être très coûteuse en temps.
Une instance de classe à contexte HFSQL indépendant peut être utilisée uniquement dans le thread qui a exécuté le constructeur. Pour manipuler une instance de classe à contexte HFSQL indépendant dans plusieurs threads, il est nécessaire :
  • d'allouer une nouvelle instance de la classe
  • de faire une copie de l'instance d'origine grâce à l'opérateur = ou <=.
Instances de classe à contexte HFSQL indépendant

Présentation

Il est possible d'associer une copie du contexte HFSQL à une instance de classe. Tous les accès à HFSQL effectués depuis les méthodes et les propriétés de la classe (appels de fonctions ou accès aux enregistrements) opèrent sur la copie du contexte de l'instance de la classe.
Remarque : A partir de la version 19, HFSQL est le nouveau nom de HyperFileSQL.
AndroidUniversal Windows 10 AppJava Cette fonctionnalité n'est pas disponible.

Syntaxe

La syntaxe à utiliser est la suivante :
// Déclaration de la classe
ClasseHyperFileSQLIndépendant est une classe, contexte HyperFileSQL indépendant

FIN
ou
// Déclaration de la classe
ClasseHyperFileSQLIndépendant est une classe
<contexte HyperFileSQL indépendant>

FIN
// Déclaration de la classe
ClasseHFSQLIndépendant est une Classe, contexte HFSQL indépendant [<léger/complet>]
FIN
ou
// Déclaration de la classe
ClasseHFSQLIndépendant est une Classe
<contexte HFSQL indépendant léger/complet>

FIN
Par exemple :
ClasseHFSQLIndépendant est une Classe, contexte HFSQL indépendant léger
Versions 20 et supérieures
Paramètre léger/complet :
  • Le mot-clé "léger" provoque la copie immédiate d'une partie du contexte HFSQL.
    Seuls les répertoires où se trouvent les fichiers de données en HFSQL Classic et/ou les connexions en HFSQL Client/Serveur sont mémorisés.
  • Le mot-clé "complet" provoque la copie immédiate du contexte HFSQL.
    Conseillé par exemple si le thread doit tenir compte des positions en cours dans les fichiers et requêtes du contexte de l'appelant.
Nouveauté 20
Paramètre léger/complet :
  • Le mot-clé "léger" provoque la copie immédiate d'une partie du contexte HFSQL.
    Seuls les répertoires où se trouvent les fichiers de données en HFSQL Classic et/ou les connexions en HFSQL Client/Serveur sont mémorisés.
  • Le mot-clé "complet" provoque la copie immédiate du contexte HFSQL.
    Conseillé par exemple si le thread doit tenir compte des positions en cours dans les fichiers et requêtes du contexte de l'appelant.
Paramètre léger/complet :
  • Le mot-clé "léger" provoque la copie immédiate d'une partie du contexte HFSQL.
    Seuls les répertoires où se trouvent les fichiers de données en HFSQL Classic et/ou les connexions en HFSQL Client/Serveur sont mémorisés.
  • Le mot-clé "complet" provoque la copie immédiate du contexte HFSQL.
    Conseillé par exemple si le thread doit tenir compte des positions en cours dans les fichiers et requêtes du contexte de l'appelant.

Utilisation

Le contexte HFSQL de l'instance est créé par copie du contexte courant lors de l'exécution du constructeur.
Les opérateurs = et <= entre deux instances à contexte HFSQL indépendant recopient le contenu du contexte HFSQL.
Il est déconseillé d'utiliser des instances de classes à contexte HFSQL indépendant pour simuler un alias sur un seul fichier HFSQL ou sur un enregistrement particulier d'un fichier HFSQL. La copie du contexte HFSQL porte en effet sur tous les éléments (les fichiers, vues, requêtes, connexions, ...) du contexte et peut donc être très coûteuse en temps.
Une instance de classe à contexte HFSQL indépendant peut être utilisée uniquement dans le thread qui a exécuté le constructeur. Pour manipuler une instance de classe à contexte HFSQL indépendant dans plusieurs threads, il est nécessaire :
  • d'allouer une nouvelle instance de la classe
  • de faire une copie de l'instance d'origine grâce à l'opérateur = ou <=.
Notes

Légende des icônes utilisées

Les différentes icônes utilisées sont les suivantes :
Procédure publique
Procédure publique
Membre public
Membre public
Procédure protégée
Procédure protégée
Membre protégé
Membre protégé
Procédure privée
Procédure privée
Membre privé
Membre privé
Méthode virtuelle publique
Méthode virtuelle publique
Membre public constant
Membre public constant
Méthode virtuelle protégée
Méthode virtuelle protégée
Membre protégé constant
Membre protégé constant
Méthode virtuelle privée
Méthode virtuelle privée
Membre privé constant
Membre privé constant
Méthode globale publique
Méthode globale publique
Membre public global
Membre public global
Méthode globale protégée
Méthode globale protégée
Membre protégé global
Membre protégé global
Méthode globale privée
Méthode globale privée
Membre privé global
Membre privé global
Constante
Constante

Nouveautés depuis la version 9

Une classe contenant un membre de type caractère n'a pas le même comportement que dans les versions précédentes. En effet, les caractères occupaient 1 octet dans les versions précédentes et 2 octets à partir de la version 9.
Il est conseillé d'utiliser le type "Entier sur un octet" pour assurer un bon fonctionnement.
Liste des exemples associés :
WD POO Simple Exemples didactiques (WINDEV) : WD POO Simple
[ + ] L'exemple "WD POO Simple" est un exemple didactique sur la POO avec WINDEV. Cet exemple permet de voir le fonctionnement :
- des classes,
- des héritages,
- des procédures virtuelles,
- des diagrammes UML,
- ...
Version minimum requise
  • Version 10
Documentation également disponible pour…
Commentaires
Pattern Singleton
J'ai trouvé qu'un pattern Singeton paresseux est en général meilleur, notamment pour éviter des dépendances cycliques entre classes à l'initialisation (surtout qu'on ne peut pas contrôler l'ordre dans lequel les classes sont chargées)

Je le déclare en gros comme ceci

MaClasse est une Classe
// Instance
PRIVE GLOBAL
gSingleton est un MaClasse dynamique
FIN

// Propriété
PUBLIQUE GLOBAL Obj() : MaClasse
SI ::gSingleton = null ALORS
::gSingleton = new MaClasse()
FIN

RENVOYER ::gSingleton
FIN
Antoine MARQUES
20 avr. 2018