Class ( besoin d'aide )

Résolu
cs_popo_joe Messages postés 9 Date d'inscription vendredi 7 octobre 2005 Statut Membre Dernière intervention 1 novembre 2008 - 18 juil. 2007 à 18:48
cs_popo_joe Messages postés 9 Date d'inscription vendredi 7 octobre 2005 Statut Membre Dernière intervention 1 novembre 2008 - 19 juil. 2007 à 00:32
bonjour tt le monde!
voila je suis debutant en delphi j'ai les bases ( les pointeurs les procedures les fonctions les variables etc ) seulement j'ai de gros soucis avec les class et aussi avec les NULL terminated string (je ne sais pas quand il faut les utiliser) d'abord le probleme avec les class, j'ai compris leur structure ( jutilise un bouquin qui est assez detaillés et justement ils indiquent ceci pour les class :
imaginons qu'on veuille faire une classe creer  un rectangle :
TRect = class
private
      gauche:= integer;
      droite:= integer;
      haut:= integer;
      bas:= integer;
public
      function  GetWidth : Integer;
      function  GetHeight : Integer;
      procedure SetRect(Ahaut,Abas,Agauche,Adroite : Integer);
      Constructor CreeValeur(Ahaut,Abas,Agauche,Adroite : Integer);
      destructor Destroy ; override;
end;
Constructor TRect.CreeValeur(Ahaut,Abas,Agauche,Adroite : Integer);
begin
      inherited Create
      gauche:= Agauche;

      droite:= Adroite;

      haut:= Ahaut;

      bas:= Abas;
(utilisation des A avant les variables pour eviter la confusion entre les variables de la class et celles obtenues par les procedures)

voici ma question :
 les procedures etablies dans la partie Public tel la procedure SetRect est-elle ici declarée comme faisant partie de la class ou est-elle executée par la class?( mon bouquin ne dis rien la dessu )
et aussi je voudrai savoire , pour les constructor , ils permettent d'initialiser n'importe quel variable d'une class ( lui attribuer une valeur ) ou d'attribuer de la place dans la memoire ( pour la class )  mais le constructor a-til une autre fonction dans la class? peut-il faire appel a des procedures externes a la class?

dsl si ce sujet a deja été abordé seulement je n'ai pas trouvé de reponses... si quelqu'un pouvait bien m'aider ce serai cool de sa part! merci!

3 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
18 juil. 2007 à 21:23
Salut et bienvenue dans le fabuleux monde de la programmation objet !

Avant de répondre à ta question, je vais préciser quelques points.
Une classe, peut être considérée comme une machine à fabriquer des objets.
Un objet, c'est que que l'on obtient en instanciant une classe (un objet est l'instance d'une classe), c'est à dire, le produit fini.

Prenons une classe :
TVoiture = class
private
  FMarque: string;
  FModele: string;
  FPoids: string;
public
  constructor Create(...);
  // etc...
  procedure Roule(NombreDeKilometres: Integer);
end;

Cette classe, TVoiture, te permet de fabriquer des voitures.

var
  Voiture: TVoiture;
begin
  Voiture := TVoiture.Create;
  ...
end;

Ce code permet de créer la voiture.
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
18 juil. 2007 à 21:42
[Mon ordi a foiré - ce qui explique ce message en deux parties]

A partir de là, ta voiture est fonctionnelle, tu peux appeler Voiture.Roule(2100) pour ajouter 2100 Km au compteur (par exemple).
Quand tu as fini d'utiliser ta voiture, tu la détruit. Ceci se fait généralement** avec Voiture.Free.

Ne surtout pas confondre: Classe et objet.

Maintenant, je vais répondre à ta question.
Le constructeur sert à initialiser l'objet, c'est à dire à créer tous les sous-objets qu'elle contiendrait et à leur affecter des valeurs correctes. Il peut donc initialiser n'importe quel membre de l'objet.
Pour ce qui est de l'allocation mémoire que tu évoques, c'est aussi son rôle. Mais il faut savoir que Delphi fait tout cela automatiquement pour toi (par le biais de la méthode TObject.NewInstance). Si tu as un Integer, tu n'auras pas à te soucier de l'allocation mémoire pour pouvoir l'utiliser.
Par contre, si tu as des pointeurs, c'est toi qui va devoir faire des appels à New() ou GetMem() pour réserver la mémoire.

Oui, le constructeur peut faire appel à des méthode externes à la classe. Sinon, ce serait très gênant ! Tu peux utiliser n'importe quelle fonction, comme StrToInt() par exemple.

Autre point important: le destructeur. Tout ce que tu as crée dans le constructeur DOIT être détruit dans le destructeur. Donc, tout appel à Create() à son appel à Free(), comme tout GetMem() se voit lié à un FreeMem() et tout New() à un Dispose().

Encore un point important, les règles de nommage. Comme tu l'as fait, le nom d'une classe doit être préfixé de la lettre "T".
Chaque membre interne doit être préfixé de "F" (regarde ma classe TVoiture).
Attention, tu as fait une faute (que Delphi te signalera): il faut écrire "gauche: integer" et non pas "gauche:= integer". Pas de signe égal donc.
De même, on nomme le constructeur Create et le destructeur Destroy. On peut en théorie donner n'importe quel autre nom pour le constructeur (TFileStream possède deux constructeurs qui ont donc deux noms différents) mais cela n'est pas conseillé, surtout si tu partages ton code avec d'autres.
Pas d'exception pour le destructeur. "Destroy" et c'est tout. Sinon ça plante !

Bon, j'arrête ici mon propos, ça te fait déjà pas mal de choses à digérer... Si tu as encore des interrogations, n'hésites surtout pas.

A+
Florent

PS: n'oublie pas le bouton "réponse acceptée"...

**: dans certains cas, la destruction est implicite comme avec les composants. C'est alors le propriétaire qui détruit l'objet et tu n'as pas à t'en charger toi même.
3
cs_popo_joe Messages postés 9 Date d'inscription vendredi 7 octobre 2005 Statut Membre Dernière intervention 1 novembre 2008
19 juil. 2007 à 00:32
merci beaucoup! tout est clair maintenant!
0
Rejoignez-nous