Inheritance class

Résolu
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 à 20:06
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 20 juil. 2007 à 06:08
bonjour tout le monde!
voila je voudrai encore mieu comprendre les class ainsi que les sous class , j'ai justement une question par rapport a cela ,
lorsque l'on demarre une nouvelle Unit , on obtient ceci
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
end.
on voit parfaitement que TForm1 a un ancetre qui est TFORM
voici ma premiere question je ne comprend pas pourquoi ils n'utilisent pas directement la class Tform , au lieu de creer une nouvelle class a partir de l'ancetre,  de + il faudrait utiliser les Inherited keyword pour faire appel  aux procedures de  Tform  afin de les modifier.

autre chose aussi , c'est lorsqu'on rajoute un nouveau component ,  par exemple un boutton , on obtient  ceci si on met un onlick event :
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Donc on rajoute une class Button 1 : de type Tbutton ainsi  que la procedure TForm1.Button1Click(Sender: TObject); , puis on ajoute dans implementation (afin d'ecrire ce qui ce produit lorsqu'on fait appel a cette procedure) :

procedure TForm1.Button1Click(Sender: TObject);
begin
//ici on ecrit notre code pour cette procedure
end;

seulement il y a une chose qui me frappe , pourquoi on appel la procedure Tform1.Button1Click(Sender: TObject); alors que si vous regardez bien en haut il est cree un objet appelé Form1 de type Tform1 :
var

  Form1: TForm1;
pourquoi on ne peut donc pas ecrire pour le on click event  :
procedure Form1.Button1Click(Sender: TObject); ???

je sais , peut etre parceque la procedure est declarée dans Tform1 , seulement Form1 : Tform1 servirait à quoi?
j'ai aussi une autre question , normalement on fait appel a un constructor , et comme Tform1 est un descendant de Tform , je comprendrai que l'on puisse faire appel a <> dans Tform1 , seulement ici Tform1 n'a pas de constructor ! :/// pourquoi?

voila j'espere que je ne derange pas trop avec mes questions de debutants!
si quelqu'un pouvait bien me repondre! merci!

6 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
19 juil. 2007 à 21:06
Re-salut !

En effet, pas besoin d'implémenter un constructeur dans TForm1 car le constructeur de l'ancêtre (TForm) convient amplement.
Par contre, il y a tout un mécanisme drôlement complexe qui se met en place pour que, à partir du fichier .dfm que te crée Delphi, on puisse créer le bouton, et lui dire que son événement OnClick est lié à la procédure TForm1.Button1Click.

Pourquoi TForm1 et non pas Form1 ? Tu donnes toi même la réponse ! C'est dans TForm1 que la procédure est déclarée.

Alors pourquoi avoir une variable globale "Form1 TForm1" ? Car comme je te l'ai dit hier, TForm1 est une classe, donc une machine à créer un objet. Form1 sera l'objet qui sera crée lorsque tu lancera ton application.
Regardes dans le fichier .dpr (Projet > voir le source), tu verras qu'il y a par féfaut trois lignes dont la deuxième est Application.CreateForm(Form1, TForm1). Ceci permet à l'application de créer la fiche, et donc ton objet Form1 sera crée à ce moment là.

Connais-tu les fiches crées dynamiquement (fiches MDI par ex) ? Je suppose que oui. Pour celles-ci, on enlève la déclaration du type "Formxxx: TFormxxx" ainsi que la ligne correspondante dans le fichier .dpr (ou tu le fais dans Projet > Options > Fiches).
Ce qui fait que tu peux créer autant de fiches que tu veux, sans avoir besoin de maintenir une référence vers elle.

J'espère avoir été clair, c'est pas simple à expliquer comme truc.
++
Flo
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 à 20:10
ahh! j'ai compri pourquoi il n'ya pas de constructor , c'est parceque justement Tform1 a pour ancetre Tform et donc herite de sa procedure create automatiquement! ( suis-je bete!)
0
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 à 21:10
re-salut! merci beaucoup :) !! tes explications sont super!
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
19 juil. 2007 à 21:29
Mais de rien !
Tu sais, en cette période de vacanes, les questions du forum c'est plutot "comment je fais pour ajouter une fiche au projet ?" alors tu t'imagines bien que ça me change l'esprit de te répondre (et puis ça me fait remuer les méninges).

On apprend drôlement à répondre aux autres, même sur des trucs simples. C'est ma motivation pour venir ici ^^

Bonne prog'
Flo
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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 à 23:43
:) en tt ca t'es vachement sympa!
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
20 juil. 2007 à 06:08
voici ma premiere question je ne comprend pas pourquoi ils n'utilisent
pas directement la class Tform , au lieu de creer une nouvelle class a
partir de l'ancetre,  de + il faudrait utiliser les Inherited keyword
pour faire appel  aux procedures de  Tform  afin de les modifier.


Alors on utilise pas directement la classe TForm car elle n'est pas prevue pour recevoir notre programme. on est donc obligé de la dériver pour y inclure ce dont on as besoin.
Comme cela, on peu avoir plusieurs fiches sur base TForm mais qui ne sont pas identique.

Pour faire appel aux procedures heritée de TForm, il n'y a pas besoin d'utiliser "Inherited" puisque TForm fonctionne principalement sur les evenements. Bien sur, seul la partie publique et publiée de TForm est visible / directement accessible dans l'enfant.

seulement il y a une chose qui me frappe , pourquoi on appel la
procedure Tform1.Button1Click(Sender: TObject); alors que si vous
regardez bien en haut il est cree un objet appelé Form1 de type Tform1...

Parce qu'on declare une procedure appartenant a la classe et non a la reference d'objet qu'est la variable Form1. D'ailleur il est fortement recommendé de ne jamais utiliser cette variable dans la declaration de la classe.
c'est pour cela que toute les methodes d'une classe sont declarée :

NomDeClasse.NomDeMethode

et non :

NomDeReference.NomDeMethode

car Form1 est une variable de type TForm1, en aucun cas cette variable possede ses propres methodes et propiétés, elle pointe seulement sur la classe qui elle les possedes.

Bien sur, si l'on veut utiliser TForm1 dans TForm2 (et inversement) par exemple, on communiquera grace a la reference de la fiche declarée son unité.
exemple :

{ Dans Unit1 }

uses Unit2;
 

procedure TForm1.Button1Click(Sender : TObject);
begin
  { passe Form2 en avant plan }
  {Unit2.}Form2.BringToFront;
end;

{ Dans Unit2 }

uses Unit1;

procedure TForm2.Button1Click(Sender : TObject);
begin
  { passe Form1 en avant plan }
  {Unit1.}Form1.BringToFront;
end;

j'ai aussi une autre question , normalement on fait appel a un
constructor , et comme Tform1 est un descendant de Tform , je
comprendrai que l'on puisse faire appel a <> dans Tform1 , seulement ici Tform1 n'a pas de
constructor ! :/// pourquoi?

Parce que, comme dis plus haut, TForm est prévue pour ne fonctionner quasiment qu'a partir d'evenements et non des methodes "standards" contenus dans la classe.
Le Constructeur et Destructeur de TForm sont automatiquement géré par Delphi dans l'objet global Application (TApplication).
Le constructeur/destructeur de TForm, appel un evenement propre (OnCreate et OnDestroy) qui permettent au developpeur d'ajouter plus simplement du code dans la classe TForm1.
Bien sur, si on a des besoin particulier, on peu deriver la classe TForm comme n'importe qu'elle classe, c'est ce qu'on appel "faire un expert", qui vas alors generer une fiche speciales, qui pourrat contenir certaines particularités (comme les fiches IW, OpenGL, DirectX etc)
0
Rejoignez-nous