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

 Delphi Discussion :

Organisation de class et fichier


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut Organisation de class et fichier
    Bonjour,

    Je peine a trouver comment organiser mes classes.
    Mon idees et de faire une class par fichier par désir de clarté et avant tout de pouvoir faire de la POO.

    J'ai trouver l'exemple suivant sur le net qui montre enfin une classe avec une utilisation d'objet:
    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    // Full Unit code.
    // -----------------------------------------------------------
    // You must store this code in a unit called Unit1 with a form
    // called Form1 that has an OnCreate event called FormCreate.
     
    unit Unit1;
     
    interface
     
    uses
    **SysUtils, Forms, Dialogs;
     
    type
    **// Define the classes in this Unit at the very start for clarity
    **TForm1 = Class;**********// This is a forward class definition
     
    **TFruit = Class(TObject)**// This is an actual class definition :
    ****// Internal class field definitions - only accessible in this unit
    ****private
    ******isRound**: Boolean;
    ******length** : single;
    ******width****: single;
    ******diameter : single;
    ****// Fields and methods only accessible by this class and descendants
    ****protected
    ****// Externally accessible fields and methods
    ****public
    ******// 2 constructors - one for round fruit, the other long fruit
    ******constructor Create(diameter : single);************** overload;
    ******constructor Create(length : single; width : single); overload;
    ****// Externally accessible and inspectable fields and methods
    ****published
    ******// Note that properties must use different names to local defs
    ******property round : Boolean
    ********read** isRound;
    ******property len** : single
    ********read** length;
    ******property wide**: single
    ********read** width;
    ******property diam**: single
    ********read** diameter;
    **end;********************// End of the TFruit class definition
     
    **// The actual TForm1 class is now defined
    **TForm1 = Class(TForm)
    ****procedure FormCreate(Sender: TObject);
    ****procedure ShowFruit(fruit : TFruit);
    **private
    ****// No local data
    **public
    ****// Uses just the TForm ancestor class public definitions
    **end;
     
     
     
     
     
     
     
     
     
     
     
    var
    **Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    // Create a round fruit object
    constructor TFruit.Create(diameter: single);
    begin
    **// Indicate that we have a round fruit, and set its size
    **isRound****** := true;
    **self.diameter := diameter;
    end;
     
    // Create a long fruit object
    constructor TFruit.Create(length, width: single);
    begin
    **// Indicate that we have a long fruit, and set its size
    **isRound**** := false;
    **self.length := length;
    **self.width**:= width;
    end;
     
    // Form object - action taken when the form is created
    procedure TForm1.FormCreate(Sender: TObject);
    var
    **apple, banana : TFruit;
    begin
    **// Let us create our fruit objects
    **apple**:= TFruit.Create(3.5);
    **banana := TFruit.Create(7.0, 1.75);
     
    **// Show details about our fruits
    **ShowFruit(apple);
    **ShowFruit(banana);
    end;
     
    // Show what the characteristics of our fruit are
    procedure TForm1.ShowFruit(fruit: TFruit);
    begin
    **if fruit.round
    **then ShowMessage('We have a round fruit, with diam = '+
    ****************** FloatToStr(fruit.diam))
    **else
    **begin
    ****ShowMessage('We have a long fruit');
    ****ShowMessage('****it has length = '+FloatToStr(fruit.len));
    ****ShowMessage('****it has width**= '+FloatToStr(fruit.wide));
    **end;
    end;
     
    end. 
     
    {---------------------------------------------------------------------------------------------------------------------}
    Sortie:
    We have a round fruit with diam = 3.5
    ** We have a long fruit
    ** ****it has a length = 7
    ** ****it has a width = 1.75
    Ca marche parfait et enfin un exemple complet.

    Maintenant je veux avoir deux fichier.
    Mon TForm1 dans le premier pour la gestion interface utilisateur et ma classe TFruit dans un deuxieme pour cet objet uniquement.

    J'ai fait un premier essai comme cela, voir en suivant, mais j'ai une erreur:
    [Erreur fatale] Unit1.pas(7): Fichier non trouvé : 'TFruit.dcu'
    Pour memoire TFMain est dans Unit1.pas et TFruit dans Unit2.pas.
    Ca dit etre la que cela pèche je suppose.

    J'ai aussi mis TFruit dans uses.
    Dans le gestionaire de projet les deux unit sont visibles


    Source ci_dessous, merci pour vos reponses.

    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, TFruit;
     
    type
     
    TForm1 = class;
     
     
    {------------------------------------------------------------------------------}
    {------------------------------------------------------------------------------}
     
    {
    TFruit = Class(TObject)  // This is an actual class definition :
        // Internal class field definitions - only accessible in this unit
     
        procedure sliceFruit(frName : String);
     
     
        private
          isRound  : Boolean;
          length   : single;
          width    : single;
          diameter : single;
          name     : String;
        // Fields and methods only accessible by this class and descendants
        protected
        // Externally accessible fields and methods
        public
          // 2 constructors - one for round fruit, the other long fruit
          constructor Create(diameter : single);               overload;
          constructor Create(length : single; width : single); overload;
        // Externally accessible and inspectable fields and methods
        published
          // Note that properties must use different names to local defs
          property round : Boolean
            read   isRound;
          property len   : single
            read   length;
          property wide  : single
            read   width;
          property diam  : single
            read   diameter;
     
       end;
     
    }
          // End of the TFruit class definition
    {-------------------------------------------------------------------------------}
    {-------------------------------------------------------------------------------}
     
     
     
      TForm1 = class(TForm)
        Button1: TButton;
     
    {-----------------------}
     
      procedure ShowFruit(fruit : TFruit);
      procedure FormCreate(Sender: TObject);
      procedure Button1Click(Sender: TObject);
     
     
    {-----------------------}
     
     
     
     
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      apple, banana : TFruit;
    implementation
     
    {$R *.dfm}
    {------------------------------------------------------------------------------}
    {------------------------------------------------------------------------------}
    {
    Constructor TFruit.Create(diameter : single);
    begin
         isRound := true;
         self.diameter := diameter;
    end;
     
    Constructor TFruit.Create(length, width : single);
    begin
        self.isRound := false;
        self.length := length;
        self.width := width;
    end;
    }
    {------------------------------------------------------------------------------}
    {------------------------------------------------------------------------------}
     
    procedure TForm1.ShowFruit(fruit : TFruit);
    begin
        ShowMessage('Premier message');
    end;
     
    {------------------------------------------------------------------------------}
     
    procedure TForm1.FormCreate(Sender: TObject);
     
    // var apple, banana : TFruit;
    begin
        apple  := TFruit.Create(3.5);
        banana := TFruit.Create(7.0, 1.75);
        ShowFruit(apple);
        ShowFruit(banana);
    end;
     
    {------------------------------------------------------------------------------}
    {
    procedure TFruit.sliceFruit(frName : String);
    begin
        ShowMessage('La ' + frName + ' est coupee');
    end;
    }
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        apple.name := 'apple';     // Encapsulation bonjour
        apple.sliceFruit(apple.name);
    end;
     
    end.
    Source unit2:

    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
     
    unit Unit2;
     
    interface
     
    uses
     
    SysUtils, Forms, Dialogs;
     
    type
     
    TFruit = Class(TObject)  // This is an actual class definition :
        // Internal class field definitions - only accessible in this unit
     
        procedure sliceFruit(frName : String);
     
     
        private
          isRound  : Boolean;
          length   : single;
          width    : single;
          diameter : single;
          name     : String;
        // Fields and methods only accessible by this class and descendants
        protected
        // Externally accessible fields and methods
        public
          // 2 constructors - one for round fruit, the other long fruit
          constructor Create(diameter : single);               overload;
          constructor Create(length : single; width : single); overload;
        // Externally accessible and inspectable fields and methods
        published
          // Note that properties must use different names to local defs
          property round : Boolean
            read   isRound;
          property len   : single
            read   length;
          property wide  : single
            read   width;
          property diam  : single
            read   diameter;
     
       end;
     
     
          // End of the TFruit class definition
    {-------------------------------------------------------------------------------}
    {-------------------------------------------------------------------------------}
    implementation
     
    {$R *.dfm}
     
    {----------------------------------}
    {----------------------------------}
     
    Constructor TFruit.Create(diameter : single);
    begin
         isRound := true;
         self.diameter := diameter;
    end;
     
    Constructor TFruit.Create(length, width : single);
    begin
        self.isRound := false;
        self.length := length;
        self.width := width;
    end;
     
    {----------------------------------}
    {----------------------------------}
     
    procedure TFruit.sliceFruit(frName : String);
    begin
        ShowMessage('La ' + frName + ' est coupee');
    end;
     
     
     
    end.

  2. #2
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    remplace TFruit par unit2, ça ira beaucoup mieux.
    Dans les uses, on met le nom de l'unité, pas le nom du fichier.

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    Merci pour la rapidité de la réponse.
    Malheureusement j'ai maintenant l'erreur suivante:
    [Erreur] Fichier non trouvé : 'Unit2.dfm'
    J'ai la même erreur après avoir tenté de retirer et remettre la classe dans le projet.

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Marc_3 Voir le message
    Merci pour la rapidité de la réponse.
    Malheureusement j'ai maintenant l'erreur suivante:
    [Erreur] Fichier non trouvé : 'Unit2.dfm'
    J'ai la même erreur après avoir tenté de retirer et remettre la classe dans le projet.
    la ligne {$R *.dfm} de Unit2 réclame un fichier Unit2.dfm, il faut la supprimer puisque tu n'as pas ici de fiche.

    voir Jouons un peu avec les DFM
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Par défaut
    Merci pour l'aide
    Comme souvent je fais de copy paste et je n'obtient pas toujours ce que je veux.
    Ce ... de {$R *.dfm}, je l'ai mis la car je le vois partout.
    Je vais être obligé de lire cela maintenant.

    Ca marche maintenant

    c

    marc_3

  6. #6
    Membre expérimenté Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Par défaut
    Salut,

    Même si ce sujet est résolu, je prête attention à la façon dont on nomme nos unités surtout si tu veux faire l'isolation des classes (et donc service) avec la couche de présentation. Exemple : Nom de la classe : TFruit : une classe centrale et donc le nom de l'unité est suggéré d'être uFruit par exemple et le nom de l'unité et de sa dfm pour la présentation est de sorte : uGestionFruit (.pas et .dfm) ...
    Imagine que dans un projet on 1251 unités entre dfm et .pas et que tu veux chercher la classe service des légumes : tu n'as , qu'à travers un CTRL+F12 (sous XE2), chercher uLegume ou bien uClasseLegume (bon , vaut mieux aussi uLegumeClasse pour faciliter la rechercher ) ..
    Ce sont les bonnes pratiques quand le/les projets en Delphi explosent ...

    Bonne journée

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

Discussions similaires

  1. [POO] Organisation des classes PHP
    Par AsQuel dans le forum Langage
    Réponses: 6
    Dernier message: 16/02/2007, 09h09
  2. Des .class en fichier exe
    Par sandytarit dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2006, 20h24
  3. [VB.Net 2.0] Comment organiser mes classes ?
    Par arno2000 dans le forum Accès aux données
    Réponses: 1
    Dernier message: 26/06/2006, 15h28
  4. [GUI]Organisation des classes
    Par c-top dans le forum Interfaces Graphiques en Java
    Réponses: 9
    Dernier message: 04/03/2005, 17h46
  5. Organisation des classes
    Par R3iTt0R dans le forum Langage
    Réponses: 2
    Dernier message: 02/06/2004, 17h27

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