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 :

Instancier une sous-classe


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut Instancier une sous-classe
    Bonjour,
    je voudrais créer une structure de base avec une classe, puis me servir de cette structure dans une sous-classe comprenant un tableau dynamique.
    Mais lorsque j'essaye d'instancier ma variable 'ValeurTemp' dans le constructeur (SetLength(ValeurTemp, 0), j'obtiens un message d'erreur 'Violation d'accès ...' ???
    Voici le bout de code.
    Merci pour votre aide qui nous fait tant progresser.
    Bonne journée.

    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
     
    Type
      //-------------------------------------------------------------   Type de base
      TTypeDeBase = Class
        Val1     : double;                                                          // valeur du premier curseur
        Val2     : byte;                                                            // valeur du second curseur
        private
          { Déclarations privées }
        public
          { Déclarations publiques }
      end;
      //--------------------------------------------   Tableau de curseurs verticaux
      TValeur = Class(TTypeDeBase)
        public
          { Déclarations publiques }
          Constructor Create();
          Destructor  Destroy; Override;
          Procedure SetVal1(Val: Double);
        private
          TabValeur          : array of TValeur;                                    // déclaration d'un tableau dynamique de couples de valeur
          { Déclarations privées }
      end;
      //----------------------------------------------------------------------------
     
    Var
      //............................................................................
      ValeurTemp                 : TValeur;                                         // instance du tableau dynamique des couples de valeur
      //............................................................................
     
    implementation
     
     
    //******************************************************************************
    //***********************   Constructeur & Destructeur   ***********************
    //******************************************************************************
    Constructor TCursVert.Create();
      begin
        SetLength(ValeurTemp, 0);
      end;
    //------------------------------------------------------------------------------
    Destructor TCursVert.Destroy();
      begin
        SetLength(ValeurTemp, 0);
        Inherited Destroy;
      end;
    //******************************************************************************
    //********************   Fin du Constructeur & Destructeur   *******************
    //******************************************************************************

  2. #2
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 215
    Points : 2 303
    Points
    2 303
    Par défaut
    Bonjour,

    SetLength(ValeurTemp, 0) n'instancie pas un objet, il dimensionne un tableau dynamique.

    ValeurTemp n'est pas un tableau mais un objet, le tableau étant TabValeur qui est un champ de la classe TValeur.

    pour ne pas avoir d'erreur, il faudrait d'abord instancier l'objet et ensuite dimensionner le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //******************************************************************************
    //***********************   Constructeur & Destructeur   ***********************
    //******************************************************************************
    Constructor TCursVert.Create();
      begin
        ValeurTemp := TValeur.Create;
        SetLength(ValeurTemp.TabValeur, 0);
      end;
    //------------------------------------------------------------------------------
    le mieux serait même de dimensionner le tableau dans le create de TValeur :

    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
     
    //--------------------------------------------   Tableau de curseurs verticaux
      TValeur = Class(TTypeDeBase)
        public
          { Déclarations publiques }
          Constructor Create();
          Destructor  Destroy; Override;
          Procedure SetVal1(Val: Double);
        private
          TabValeur          : array of TValeur;                                    // déclaration d'un tableau dynamique de couples de valeur
          { Déclarations privées }
      end;
     
    Constructor TValeur.Create();
      begin
        SetLength(TabValeur, 0);
      end;
     
    ...
     
    //******************************************************************************
    //***********************   Constructeur & Destructeur   ***********************
    //******************************************************************************
    Constructor TCursVert.Create();
      begin
        ValeurTemp := TValeur.Create;
      end;
    @++
    Dany

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut instancier une sous-classe
    Bonjour,
    merci pour la réponse.
    je me suis mal exprimé.

    dans un autre endroit du programme,
    j'essaye d'instancier ma sous-classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      MonTValeur: TValeur;
    begin
      MonTValeur:=TValeur.create;
      // ...
    end;
    au moment de la création,
    sur la ligne SetLength(ValeurTemp, 0);
    j'ai le message d'erreur.

    Bonne journée
    et merci pour les réponses

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    La réponse de skywaukers est pourtant claire :

    Citation Envoyé par skywaukers Voir le message
    SetLength(ValeurTemp, 0) n'instancie pas un objet, il dimensionne un tableau dynamique.

    ValeurTemp n'est pas un tableau mais un objet, ...
    Pour que SetLength fonctionne, il faudrait déclarer ValeurTemp ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var
      ValeurTemp : array of TValeur;
    Mais ne sachant pas qu'elle est la finalité, difficile d'en dire plus...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut instancier une sous-classe
    Bonjour,
    merci pour vos réponses.
    j'ai un point bloquant.

    je recommence pour essayer d'être beaucoup plus clair.

    le but est de me servir d'un tableau dynamique (dans une sous-classe)
    -------------------------------------

    je crée une Super-classe,
    puis une classe issue de ma Super-Classe.

    je crée un tableau dynamique dans une sous-classe constitué d'élément de ma classe.

    je n'arrive pas à accéder aux attributs de ma classe et de ma Super-classe.

    la procédure 'ToutEnRouge();' provoque un message d'erreur 'Violation D'accès'


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Button1Click(Sender: TObject);
      var
        MonTableau: TSousClasse;
      begin
        MonTableau:=TSousClasse.Create;
        try
          MonTableau.DimensionneTableau(10);
          MonTableau.ToutEnRouge;
        finally
          MonTableau.Free;
        end;
      end;
    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
    
    
    unit UntClasses;
    
    interface
    
    Uses
      Types, Graphics;
    
    Type
      //-------------------------------------------------------------   Super Classe
      TSuperClasse = Class
        Actif       : boolean;                                                      // true = utilisé
        TypeElement : byte;                                                         // type de l'élément utilisé
        Couleur     : word;                                                         // Numéro de la couleur utilisée pour représenter le curseur
        Position    : TPoint;                                                       // position sur l'écran
        private
          { Déclarations privées }
        public
          { Déclarations publiques }
      end;
      //-------------------------------------------------------------------   Classe
      TClasse = Class(TSuperClasse)
        Val1     : double;                                                          // première valeur
        Val2     : double;                                                          // seconde  valeur
        private
          { Déclarations privées }
        public
          { Déclarations publiques }
      end;
      //------------------------------   Sous-Classe comprenant le tableau dynamique
      TSousClasse = Class(TClasse)
        public
          { Déclarations publiques }
          Constructor Create();
          Destructor  Destroy; Override;
          // ...
          Procedure DimensionneTableau(longueur: word);                             // dimensionnement du tableau dynamique
          Procedure ToutEnRouge();                                                  // passe tous les éléments du tableau en rouge
        private
          TableauDyn        : array of TClasse;                                     // déclaration du tableau dynamique
          { Déclarations privées }
      end;
      //----------------------------------------------------------------------------
    
    implementation
    
    //******************************************************************************
    //***********************   Constructeur & Destructeur   ***********************
    //******************************************************************************
    Constructor TSousClasse.Create();
      begin
        SetLength(TableauDyn, 0);
      end;
    //------------------------------------------------------------------------------
    Destructor TSousClasse.Destroy();
      begin
        SetLength(TableauDyn, 0);
        Inherited Destroy;
      end;
    //******************************************************************************
    //********************   Fin du Constructeur & Destructeur   *******************
    //******************************************************************************
    //******************************************************************************
    //******************   dimensionnement du tableau dynamique   ******************
    //******************************************************************************
    Procedure TSousClasse.DimensionneTableau(longueur: word);
      begin
        SetLength(TableauDyn, longueur);
      end;
    //******************************************************************************
    //***************   Fin de dimensionnement du tableau dynamique   **************
    //******************************************************************************
    //******************************************************************************
    //************   Passage de tous les éléments du tableau en rouge   ************
    //******************************************************************************
    Procedure TSousClasse.ToutEnRouge();                                            // passe tous les éléments du tableau en rouge
      var
        i : integer;                                                                // compteur de boucle
      begin
        for i:=0 to High(TableauDyn) do
          TableauDyn[i].Couleur:=ClRed;
      end;
    //******************************************************************************
    //*********   Fin du passage de tous les éléments du tableau en rouge   ********
    //******************************************************************************
    
    
    end.

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 654
    Points : 5 209
    Points
    5 209
    Par défaut
    Tu dimensionnes TableauDyn mais ne remplis jamais.
    En gros TableauDyn contient 10 objets de type TClasse qui sont tous à nil.

    Je te suggère d'abandonner la méthode Dimensionne et de créer une méthode Add qui prend en paramètre un objet de type TClasse.
    Cette méthode Ajouterai à la longueur du tableau et y ajouterai l'objet passé en paramètre.

    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Procedure TSousClasse.AjouteAuTableau(Item : TClasse);
      begin
        SetLength(TableauDyn, TableauDyn.Length + 1);
        TableauDyn[TableauDyn.Length - 1] := Item;
      end;

    Mieux encore... passer par un TObjectList à la place d'un Array

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut instancier une sous-classe
    Bonjour,
    merci pour la réponse.

    Mon problème et justement que je n'arrive pas à remplir le tableau.
    tous les accès aux attribut de Classe et de Super-classe provoque le message d'erreur

    Bonne journée.
    et merci pour votre aide et votre patience

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut instancier une sous classe
    Bonjour,
    le but premier est de faire une super classe (par exemple Figure géométrique) qui aura ses attributs. (Position de l'objet X, Y; couleur, ...)
    --> d'en tirer une classe ou chaque figure sera décrite avec ses attributs propres
    (exemple: Carré : qui utilisera les attributs de super classe et qui aura un (ou des) attribut(s): cote
    Cercle: attribut rayon
    Rectangle: attribut: largeur, hauteur)
    --> d'en tirer une sous classe avec un tableau d'objets

    comme dans le petit bout de code posté le 17 septembre à 3h18

    Quelqu'un pourrait me dire pourquoi ce petit bout de code provoque une erreur à chaque fois que j'essaye de remplir ou modifier le tableau dynamique ?

    merci pour votre aide.
    bonne journée

  9. #9
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 663
    Points : 6 949
    Points
    6 949
    Par défaut
    Citation Envoyé par neho88 Voir le message
    comme dans le petit bout de code posté le 17 septembre à 3h18

    Quelqu'un pourrait me dire pourquoi ce petit bout de code provoque une erreur à chaque fois que j'essaye de remplir ou modifier le tableau dynamique ?
    popo t'a donné la réponse :
    Citation Envoyé par popo Voir le message
    Tu dimensionnes TableauDyn mais ne remplis jamais.
    En gros TableauDyn contient 10 objets de type TClasse qui sont tous à nil.
    Tu appelles DimensionneTableau, mais tu ne le remplis jamais.



    Et sinon, je suis d'accord avec lui que passer par une TObjectList serait plus simple.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (11.6 - 14.6)

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 654
    Points : 5 209
    Points
    5 209
    Par défaut
    A voir ton bout de code et tes explications, je déduis que tu essaie d'instancier 10 objets avec des valeur par défaut, et ensuite de changer leur couleur.
    Allez, j'ai passé un super week-end et très bien commencé la journée.

    Tout d'abord, la classe de base
    Code Delphi : 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
    TFigure = class
    private
      FX, FY : Integer;
      FColor : TColor;
    public
      property X : Integer read FX write FX;
      property Y : Integer read FY write FY;
      property Color : TColor read FColor write FColor;
     
      constructor Create;
    end;
     
    ...
     
    constructor TFigure.Create;
    begin
      FX := 0; FY := 0;
      FColor := clBlack;
    end;

    Ensuite, trois façon de remplir ton tableau correctement :
    En utilisant ma méthode :
    Code Delphi : 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
    procedure TForm1.Button1Click(Sender: TObject);
      var
        MonTableau: TSousClasse;
        Figure : TFigure;
        i : Integer;
      begin
        MonTableau:=TSousClasse.Create;
        try
          for i := 0 to 9 do
          begin
             MonTableau.AjouteAuTableau(TFigure.Create);
          end;
          MonTableau.ToutEnRouge;
        finally
          MonTableau.Free;
        end;
      end;

    En utilisant ta méthode et en remplissant le tableau à la main :
    Code Delphi : 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
    procedure TForm1.Button1Click(Sender: TObject);
      var
        MonTableau: TSousClasse;
        Figure : TFigure;
        i : Integer;
      begin
        MonTableau:=TSousClasse.Create;
        try
          MonTableau.DimensionneTableau(10);
          for i := 0 to 9 do
          begin
             MonTableau.TableauDyn[i] := TFigure.Create;
          end;
          MonTableau.ToutEnRouge;
        finally
          MonTableau.Free;
        end;
      end;

    En modifiant directement DimensionneTableau.
    C'est sans doute le plus simple pour toi même c'est la manière qui me plais le moins car ça viole le principe de responsabilité unique
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Procedure TSousClasse.DimensionneTableau(longueur: word);
    var i : Integer;
      begin
        SetLength(TableauDyn, longueur);
        for i := 0 to longueur do
           TableauDyn[i] := TFigure.Create;
      end;

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut Instancier une sous-classe
    Bonjour,
    la dernière réponse de Popo m'a permis de modifier les objets de la Super-Classe.
    et de trouver une erreur dans la définition de ma Sous-Classe

    //------------------------------ Sous-Classe comprenant le tableau dynamique
    TSousClasse = Class et non pas TSousClasse = Class(TClasse)

    car je veux juste créer un tableau dynamique d'objet de type TClasse

    Il me manquais également les accesseurs pour accéder aux membres de ma classe et ma SuperClasse.

    en fait quel est la différence entre des accesseurs et

    property X : Integer read FX write FX; ?

    merci pour votre dévouement.
    bonne journée

  12. #12
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 654
    Points : 5 209
    Points
    5 209
    Par défaut
    Citation Envoyé par neho88 Voir le message
    Bonjour,
    la dernière réponse de Popo m'a permis de modifier les objets de la Super-Classe.
    et de trouver une erreur dans la définition de ma Sous-Classe

    //------------------------------ Sous-Classe comprenant le tableau dynamique
    TSousClasse = Class et non pas TSousClasse = Class(TClasse)

    car je veux juste créer un tableau dynamique d'objet de type TClasse

    Il me manquais également les accesseurs pour accéder aux membres de ma classe et ma SuperClasse.

    en fait quel est la différence entre des accesseurs et

    property X : Integer read FX write FX; ?

    merci pour votre dévouement.
    bonne journée
    Attention, si tu enlève "class(TClasse)", tu n'a pas une sous-classe dérivée de TClasse mais une simple classe qui ne dérive rien (à part de TObject qui ne fait rien).

    Les accesseurs sont ce que tu mets derrière les mots clés "read" et "write" de la propriété.
    C'est la propriété qui permet "d'accéder" au contenu protégé de la classe.
    Ici ça n'a que peut d'intérêt puisque ta propriété expose directement le membre privé.
    Mais tu pourrait enlever la partie "write" et obtenir une propriété qui ne permet pas d'écrire dans FX.
    Tu pourrais également définir une méthode privée comme accesseur "write" et ainsi, au sein de cette méthode, tester la valeur de la donnée avant de modifier FX.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Points : 63
    Points
    63
    Par défaut Instancier une sous classe
    Bonjour, merci pour la réponse.
    oui, c'est exact.
    mais le but était de créer un tableau dynamique d'objet (TClasse) dérivé de TSuperClasse.

    Merci encore pour toutes ces réponses car la gestion des classes n'est pas toujours bien expliqué

    bonne journée

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/04/2017, 23h09
  2. Réponses: 5
    Dernier message: 09/03/2007, 22h14
  3. Réponses: 1
    Dernier message: 17/11/2006, 17h57
  4. Instanciation d'une sous-classe
    Par iubito dans le forum Langage
    Réponses: 6
    Dernier message: 23/01/2006, 17h27
  5. Declaré en classe de base, instancié en sous classe
    Par jobigoud dans le forum Langage
    Réponses: 3
    Dernier message: 14/11/2005, 11h55

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