cs_popo_joe
Messages postés9Date d'inscriptionvendredi 7 octobre 2005StatutMembreDernière intervention 1 novembre 2008
-
18 juil. 2007 à 18:48
cs_popo_joe
Messages postés9Date d'inscriptionvendredi 7 octobre 2005StatutMembreDerniè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!
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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;
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 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.