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 :

Classe toute simple qui plante en sortie de programme.


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut Classe toute simple qui plante en sortie de programme.
    Bonjour à tous,

    Je débute en Delphi (mais pas en programmation ca fait 12 ans que je bosse sur d'autres langages) et là je dois intervenir sur un projet en Delphi.

    Pour rendre mes tests plus surs, je veux passer par un peu de programmation objet, et comme çà une fois mon objet testé et validé, le reste suivra.

    Alors j'ai tenté une premiere classe de Calcul toute bete, le principe : on a un objet, deux champs privés et deux propriétés (X et Y).

    Je veux simplement que lorsqu'on fixe la propriété X çà calcule Y automatiquement, pour l'instant c'est simple c'est 100 - X.

    J'ai fait donc un Calcul.pas avec ça dedans :
    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
     
    unit Calcul;
     
    interface
     
    type
      TCalcul = class
      private
        pName        : string;
        pX           : Integer;
        pY           : Integer;
        procedure SetX(Value: Integer);
        function GetX() : Integer;
        procedure SetY(Value: Integer);
        function GetY() : Integer;
      published
        property X: Integer read GetX write SetX;
        property Y: Integer read GetY write SetY;
      public
        constructor Create(AName : string);
        destructor Destroy; override;
      end;
     
    implementation
     
    constructor TCalcul.Create(AName : string);
    begin
            inherited Create;
            pX := 0;
            pY := 0;
            pName := AName;
    end;
     
    destructor TCalcul.Destroy();
    begin
           inherited Destroy;
    end;
     
    function TCalcul.GetX() : Integer;
    begin
            Result := pX;
    end;
     
    procedure TCalcul.SetX(Value : Integer);
    begin
            pX := Value;
            pY := 100 - pX;
    end;
     
    function TCalcul.GetY() : Integer;
    begin
            Result := pY;
    end;
     
    procedure TCalcul.SetY(Value : Integer);
    begin
            pY := Value;
            pX := 100 - pY;
    end;
    end.
    Et à coté j'ai juste un Form tout simple avec un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.Button1Click(Sender: TObject);
    var C : TCalcul;
    s : string;
    begin
            C.Create('Test');
            C.X := 20;
            s := IntToStr(C.Y);
            Button1.Caption := s;
    end;
    Ca fonctionne bien, quand je clique sur mon bouton j'obtiens bien 80 dans le libellé de mon bouton.

    Par contre quand je quitte le projet en débug par le croix ou ALT+F4, crac j'ai droit à une erreur "Exception EAccessViolation in module Project2.exe" etc...

    J'ai tenté un peu de debug mais je vois pas trop, le projet est vraiment simple... Ca manque de Destroy sur la classe ? de FreeMem ?

    J'ai testé en Delphi 5 et 6, mais çà plante pareil.

    Bref j'ai besoin de vous

    D'avance merci !

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    En Delphi, on ne crée pas un objet comme tu le fais. La bonne syntaxe à utiliser est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C := TCalcul.Create('Test');
    L'autre version a un sens aussi, et est donc acceptée par le compilateur, mais est très peu utilisée. En fait j'ai jamais trouvé qu'une seule utilité à celle-ci, et je suis du genre à pousser le langage Delphi dans ses limites

    De plus, il convient de libérer un objet créé. Pour cela, il existe le destructeur Destroy, mais on préfère demander la libération par un appel à Free, qui lui appelle Destroy après une vérification qui a son utilité dans des cas plus complexes.
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C := TCalcul.Create('Test');
    C.X := 20;
    Button1.Caption := IntToStr(C.Y);
    C.Free; // très important !
    Finalement, puisque des exceptions peuvent survenir entre la création et la libération d'un objet, il est vivement recommandé (autrement dit : tu dois le faire) d'encadrer les opérations après création d'un try..finally, comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    C := TCalcul.Create('Test');
    try
      C.X := 20;
      Button1.Caption := IntToStr(C.Y);
    finally
      C.Free;
    end;
    Dernière recommandation : le style d'écriture du code Delphi diffère de celui du C par exemple. On utilise en Delphi normalement une indentation de 2 espaces, comme je l'ai fait ci-dessus.
    CodeGear propose le document de guide de style suivant, que personnellement je suis à la lettre :
    http://dn.codegear.com/article/10280

    Bienvenue dans le monde merveilleux de Delphi
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Merci beaucoup, çà fonctionne parfaitement maintenant

    J'ai eu beaucoup de mal à trouver des documentations sur la programmation objet en Delphi et çà dérive toujours sur les objets graphiques.

    C'était si simple...

    Encore merci !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/11/2010, 14h25
  2. Demande d'avis : critique d'une classe toute simple
    Par _skip dans le forum Débuter
    Réponses: 20
    Dernier message: 01/09/2009, 18h24
  3. Filtres tout simples qui ne fonctionnent pas
    Par cuterate dans le forum Requêtes et SQL.
    Réponses: 29
    Dernier message: 13/06/2008, 11h08
  4. Script tout simple qui ne marche pas sous IE
    Par Bleuarff dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/02/2007, 18h48
  5. Programme Perl tout simple qui ne fonctionne pas
    Par jejerome dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2006, 23h58

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