Problème de classes [Résolu]

Signaler
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009
-
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009
-
Bonjour,

J'ai un petit souci:

J'ai un unit Polygon où sont déclarées les classes TPolygon, TTriangle et Tsquare. (Exemple repris Delphi Basics);
La classe TPolygon à 3 variable privées: Nombre de cotés, longueur et surface. Les deux classes filles ont chacune deux méthodes overridée d'une méthode abstract: SetArea et GetArea qui permettent de lire dans la surface.

J'ai un fiche principale avec un bouton et deux label, je déclare dans la clause uses la fiche Polygon.
Lorsque je clique sur le bouton, je crée deux variables Triangle et rectangle puis je veux les Create et là le compilateur me donne une erreur: Trop de paramètre originaux.
Pourquoi?

Code de l'unité Polygon
unit Polygon;

interface

uses
  Forms, Dialogs, Classes, Controls, StdCtrls, SysUtils;

type
  // Define a base TPolygon class :
  // This class is a traingle if 3 sides, square if 4 sides ...
  TPolygon = class
  private
    sideCount  : Integer;  // How many sides?
    sideLength : Integer;  // How long each side?
    shapeArea  : Double;   // Area of the polygon
  protected
    procedure setArea; Dynamic; Abstract;  // Must be implemented in child
    function getArea : Double; Dynamic; Abstract;
    property count  : Integer read sideCount;
    property length : Integer read sideLength;
    property area   : Double  read shapeArea;
    constructor Create(sides, length : Integer);
  end;

  // Define triangle and square descendents
  TTriangle = class(TPolygon)
  protected
    procedure setArea; override;   // Override the abstract method
    function getArea : Double; override;
  end;

  TSquare = class(TPolygon)
  protected
    procedure setArea; override;   // Override the abstract method
    function getArea : Double; override;
  end;

implementation
{$R *.dfm} // Include form definitions

// Create the TPolygon object
constructor TPolygon.Create(sides, length : Integer);
begin
  // Save the number and length of the sides
  sideCount := sides;
  sideLength := length;

  // Set the area using the abstract setArea method :
  // This call will be satisfied only by a subclass
  setArea;
end;

// Implement the abstract setArea parent method for the triangle
procedure TTriangle.setArea;
begin
  // Calculate and save the area of the square
  shapeArea := (sideLength * sideLength) / 2;
end;

function TTriangle.getArea : Double;
begin
result:=shapeArea;
end;

// Implement the abstract setArea parent method for the square
procedure TSquare.setArea;
begin
  // Calculate and save the area of the square
  shapeArea := sideLength * sideLength;
end;

function TSquare.getArea : Double;
begin
result:=shapeArea;
end;

end.


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Code de l'unité Principale:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

uses Polygon;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Triangle : TTriangle;
  Rectangle : TSquare;
begin
  Triangle:=TTriangle.Create(3,10);
  Rectangle : TSquare.Create(4, 10);
  Label1.Caption:=floattostr(Triangle.getArea);
  Label2.Caption:=floattostr(Rectangle.getArea);
end;

end.


Je pense également avoir un souci avec les Labels mais peut-être est-ce dû au même problème.

Merci de votre aide.

10 réponses

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
ton constructor doit etre dans la section "public".
Là, il est protected, donc ta fiche ne le voit pas. Elle essaye donc d'appeler le contructor de TObject, qui lui ne contient pas de parametres
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
bonsoir,

si je lis bien le code, il te faut une instance d'objet TExtensionManager pour appeler GetNumberOfLetters si ControlValidity ne fait pas partie de TextensionManager !

Luc.
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
C'est surtout que le constructeur n'est pas surchargé, du coup il ne le reconnaît pas. Essaye de mettre "override" dans la déclaration interface, derrière tes constructeurs.

Cordialement, Bacterius !
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Et pense à appeler "inherited" (et puis c'est pas override mais reintroduce, vu que c'est une méthode statique). Voici un exemple (pas testé) :

type
  // Define a base TPolygon class :
  // This class is a traingle if 3 sides, square if 4 sides ...
  TPolygon = class
  private
    sideCount  : Integer;  // How many sides?
    sideLength : Integer;  // How long each side?
    shapeArea  : Double;   // Area of the polygon
  protected
    procedure setArea; Dynamic; Abstract;  // Must be implemented in child
    function getArea : Double; Dynamic; Abstract;
    property count  : Integer read sideCount;
    property length : Integer read sideLength;
    property area   : Double  read shapeArea;
    constructor Create(sides, length : Integer); reintroduce;
  end;

  // Define triangle and square descendents
  TTriangle = class(TPolygon)
  protected
    procedure setArea; override;   // Override the abstract method
    function getArea : Double; override;
  end;

  TSquare = class(TPolygon)
  protected
    procedure setArea; override;   // Override the abstract method
    function getArea : Double; override;
  end;

implementation
{$R *.dfm} // Include form definitions

// Create the TPolygon object
constructor TPolygon.Create(sides, length : Integer);
begin
  inherited;

  // Save the number and length of the sides
  sideCount := sides;
  sideLength := length;

  // Set the area using the abstract setArea method :
  // This call will be satisfied only by a subclass
  setArea;
end;

// Implement the abstract setArea parent method for the triangle
procedure TTriangle.setArea;
begin
  // Calculate and save the area of the square
  shapeArea := (sideLength * sideLength) / 2;
end;

function TTriangle.getArea : Double;
begin
result:=shapeArea;
end;

// Implement the abstract setArea parent method for the square
procedure TSquare.setArea;
begin
  // Calculate and save the area of the square
  shapeArea := sideLength * sideLength;
end;

function TSquare.getArea : Double;
begin
result:=shapeArea;
end;

end.


Cordialement, Bacterius !
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009

Merci à vous tous!

Il suffisait effectivement de passer mes méthodes et mes proprités en public pour y avoir accès!
J'avais pas vu... Quand on utilise le code de quelqu'un
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009

@ VoicedMirror:

Merci beaucoup pour ton aide. J'avais juste reprise cet exemple en ligne pour essayé et je pense avoir compris.

En fait je voudrais faire une classe qui gère une liste d'extension de fichiers (.mp3,.wma, etc par exemple), je pensais pour cela utiliser les ensemble: ExtensionList: set of char; et là j'ai quelques souci.

Voici mon code: Je n'ai encore implémenté que la structure et deux méthodes mais ça ne marche pas...

unit ExtensionManager;

interface

uses
  Forms, Dialogs, Classes, Controls, stdctrls, SysUtils;

type
  TSetOfChar = Set of Char;
  TExtensionManger = class
    private
      procedure AddItemsToList(List : TSetOfChar);
      procedure DeleteItemToList(List : TSetOfChar);
      function IsSetOfExtensionsPartOfList(List : TSetOfChar): Boolean;
    protected
      Name : String;
      ExtensionList : TSetOfChar;
    public
      property GetName : String read name;
      {procedure SetName(Sentence : String);
      property GetExtensionList : TSetOfChar read ExtensionList;
      procedure AddExtension(Extension : String); overload; //Remplir avec une seule extension
      procedure AddExtension(ExtList : TSetOfChar); overload; //Remplir avec un ensemble
      procedure AddExtension(ExtArray  : Array of Char); overload; //Remplir avec un tableau
      procedure RemoveExtension(Extension : String); overload; //Enlever une seule extension
      procedure RemoveExtension(ExtList : TSetOfChar); overload; //Enlever avec un ensemble
      procedure RemoveExtension(ExtArray : Array of Char); overload; //Enlever avec un tableau
      procedure RemoveAll();
      function IsFilePartOfList(Files : TSearchRec): Boolean; overload;
      function IsFilePartOfList(Filename : String): Boolean; Overload;
      function IsExtensionPartOfList(Extension : String): Boolean;}
      constructor Create(Nom : String);
    end;

implementation

procedure AddItemsToList(List : TSetOfChar);
begin
  ExtensionList:=ExtensionList+List;
end;

procedure DeleteItemToList(List : TSetOfChar);
begin
  ExtensionList := ExtensionList - List;
end;

end.


Le problème se situe dans la procédure AdditemsToList, La variable ExtensionList n'est pas un identificateur déclaré...
Je voulais utiliser deux méthodes private simple avec les ensembles pour ajouter et supprimer un autre ensemble et utiliser des méthodes publique plus général qui transtype les variables et puis appel les méthodes privées.
Je crois que vais contourner le problème des ensembles et utiliser un array.

Encore merci pour ton aide
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009

Plutôt qu'un array peux-être une StringList répondrait plus à mes besoins, je ne connais pas trop les ensembles...
Par exemple concernant la gestion des doubles, peut-on avoir des mêmes éléments ou faut-il les gérer aussi?
Messages postés
302
Date d'inscription
jeudi 29 septembre 2005
Statut
Membre
Dernière intervention
17 septembre 2013
1
Bonsoir,

ne pas oublier de surcharger le constructeur dans TPolygon, c'est important...

constructor TPolygon.Create(sides, length : Integer); reintroduce; overload; // paramètres différents du construteur TObject
begin
inherited Create;
...
end;

Luc.
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009

J'ai juste encore un petit souci:

function ControlValidity(Chaine : String): Boolean;
var
  i:integer;
begin
i:=GetNumberOfLetters();
  Result:=True;
  if Length(Chaine)<>(i+1) then //vérifie le nombre total de caractère
    Result:=False;
end;


A la compilation j'ai une erreur identificateur non déclaré:GetNumberOfLetters. Or, voici ca déclaration:

type
  TExtensionManager = class
    Private
      fName : String;
      fMaxLetters : Integer; //Nombre de lettre max d'une extension 3 par defaut
    protected
      ExtensionList : TStringList;
    public
      function GetNumberOfLetters(): Integer;


et voila l'implementation de GetNumberOfLetters qui ne pose aucun problème:
function TExtensionManager.GetNumberOfLetters(): Integer;
begin
  Result:=fMaxLetters;
end;


Quelqu'un peut-il encore m'aider
Merci beaucoup à tous pour votre temps.
Messages postés
21
Date d'inscription
vendredi 18 mars 2005
Statut
Membre
Dernière intervention
24 octobre 2009

Ok, j'ai compris. J'ai déclaré GetNumberOfLetters dans la section protected de ma classe
Merci beaucoup