begin process at 2010 02 10 11:15:33
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Divers

 > 

Débutant(e)

 > 

inheritance class


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

inheritance class

jeudi 19 juillet 2007 à 20:06:55 | inheritance class

popo_joe

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 <<Inherited Create>> 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!




jeudi 19 juillet 2007 à 20:10:36 | Re : inheritance class

popo_joe

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!)
jeudi 19 juillet 2007 à 21:06:35 | Re : inheritance class

florenth

Membre Club
Réponse acceptée !
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

jeudi 19 juillet 2007 à 21:10:05 | Re : inheritance class

popo_joe

re-salut! merci beaucoup :) !! tes explications sont super!
jeudi 19 juillet 2007 à 21:29:28 | Re : inheritance class

florenth

Membre Club
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
jeudi 19 juillet 2007 à 23:43:46 | Re : inheritance class

popo_joe

:) en tt ca t'es vachement sympa!


vendredi 20 juillet 2007 à 06:08:03 | Re : inheritance class

f0xi

Membre Club Administrateur CodeS-SourceS


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 <<Inherited Create>> 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)




Cette discussion est classée dans : class, tform, procedure, form1, tform1


Répondre à ce message

Sujets en rapport avec ce message

THREADS ERREUR [ par w38 ] Bonjour,Étant donné que j'ai une application qui met un temps fou, j'ai décidéd'utiliser des threads.Toutefois, le bouquin que j'ai stipule une formul "Incompatible types :''Cardinal' and 'String' " [ par Don0Choa ] Bonjour, je fais un petit prog permettant de fair des boite de dialogue en séléctionnant les bouttons, icones etc...Mais voila j'ai une erreur comem d procedure TForm1.LaunchBtn1Click(Sender: TObject); [ par Cyrille2 ] Salut, je fais un petit programme qui doit lire un fichier avec Treader mais j'obtient une EReadError "Invalid property value" sur le readlistbegin .. Volume [ par MAsterC ] Alors salut a tous, voici mon probleme, j'ai mis ce code dans mon programme, il sert a gerrer le volume «wave» de Windows, tous marche comme voulu sau probleme de class abstraite [ par mavric ] Bonjour,j'ai un petit probleme sur des class abstraites.voici mes declarations :type TCreature = class private FName : string;< Newbie & TCPI/IP [ par Megafan ] Bonjour je suis complétement débutant en delphi, par contre je suis pas mauvais en VB.Pourquoi je change allez vous dire ?Parce que VB ne tourne pas s projet de chat avec delphi 7 [ par dk ] hello every body j'aimerais faire un chat mais voila le probleme (si on peut dire) c ke g delphi 7 avec comme composant installer Tcpserver et Tcpclie probleme avec sockets [ par PsyClown44 ] Salut!J'ai un prob avec le composant TClientSocket : je n'arrive pas a recevoir de paquets lors d'une connexion!Voila le code:unit Unit1;interfaceuses Plantage [ par Rapakooti ] Je solicite votre ade car en fait j'ai un gros plantage avec un programme que je suis en train de faire et pourtant il est pas encore avancé une fois TStringGrid + TScrollBox : petit pb de décalage [ par delphi5user ] Bonjour à vous.Je vais essayer d'explique mon problème clairement.J'ai fait un Form avec un TScrollBox, 2 TStringGrid (1 pour les titres, un pour les


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales