IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Self, handle et parent


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Self, handle et parent
    Un grand bonjour à tous les lecteurs,

    Je pensais avoir compris le rôle de ces trois mots après les explications de Clorish et de Lil-Jam 63, et me voilà devant ce bout de code issu du cours de Monsieur RM di Scala aussi bête qu'avant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    unit UClasseclickMemo;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
     
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
      TMemoFlash = class(TMemo)
      private
        Tempo : TTimer;
        Timing : integer;
        procedure flashMemo(Sender : TObject);
        procedure ClickMemo(sender : TObject);
      public
        constructor create(AOwner : Tcomponent);
        destructor  Destroy;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    constructor TMemoFlash.create(AOwner : TComponent);
    begin
       inherited;
       Self.Parent := TWinControl(AOwner);
       self.Lines.Append('adresse Owner = '+inttostr((AOwner as TWinControl).Handle));
       self.Lines.Append('adresse Memo = '+inttostr(self.Handle));
       Tempo := TTimer.Create(AOwner);
       Tempo.Enabled := false;
       Tempo.Interval := 100;
       Tempo.ontimer := flashMemo;
       self.OnClick := ClickMemo;
    end;
    Je serais vraiment très heureux de savoir par quels termes je peux remplacer "self, handle, et parent " qui figurent dans le constructor, afin d'en comprendre (peut-être ) le sens.
    Un grand merci d'avance.
    Noël

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour

    Dans votre code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    constructor TMemoFlash.create(AOwner : TComponent);
    begin
       inherited;
       Self.Parent := TWinControl(AOwner);
       self.Lines.Append('adresse Owner = '+inttostr((AOwner as TWinControl).Handle));
       self.Lines.Append('adresse Memo = '+inttostr(self.Handle));
       Tempo := TTimer.Create(AOwner);
       Tempo.Enabled := false;
       Tempo.Interval := 100;
       Tempo.ontimer := flashMemo;
       self.OnClick := ClickMemo;
    end;
    Self est la référence delphi de l'objet créer. C'est le TMemoFlash

    Parent est l'objet sur lequelle le tmemoflash est créer.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      MyMemo := TMemoFlas.Create(MyForm);
      MyMemo.Parent := MyPanel;
    Dans une procedure du parent APRES le create
    Self est donc MyMemo
    Parent est la référence, MISE APRES LE CREATE de MyPanel (My Memo est mis sur my panel).
    Owner est le composant "possédant" MyMemo. C'est celui qui auto-détruira My Form s'il est détruit. C'est MyForm.

    MyMemo.Handle (Handle dans les procédure des TMemoflash) est une référence WINDOWS au memo (voir la gestion des messages par exemple), auto implementer par delphi lorsque le parent est renseigné.

    Autrment dit. dans le create (cas de votre exemple) le parent est à nil (non encore renseigné) et le handle de même.

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 43
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    je répète peut-etre ce que d'autres ont dit mais :

    - Self désigne l'objet dans lequel la méthode est appelée d'après l'aide Delphi. Donc Self est la variable permettant de manipuler un objet dans une méthode de sa classe. Par défaut, Self peut être omis car dans une méthode de classe les attributs et autres méthodes s'appliquent à l'objet et donc à Self ce qui fait que ton bout de code pourrait s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    constructor TMemoFlash.create(AOwner : TComponent); 
    begin 
       inherited; 
       Parent := TWinControl(AOwner); 
       Lines.Append('adresse Owner = '+inttostr((AOwner as TWinControl).Handle)); 
       Lines.Append('adresse Memo = '+inttostr(Handle)); 
       Tempo := TTimer.Create(AOwner); 
       Tempo.Enabled := false; 
       Tempo.Interval := 100; 
       Tempo.ontimer := flashMemo; 
       OnClick := ClickMemo; 
    end;
    - Parent désigne le conteneur graphique dans lequel ton objet est créé. Si le parent d'un objet créé est une Tform, l'objet se trouvera directement sur la TForm. Si le parent d'un objet est un TPanel par exemple, l'objet se trouvera sur ce TPanel (graphiquement) mais pas ailleurs.
    - Handle est l'identificateur unique au sens Windows attribué par le système d'exploitation afin d'identifier chaque "objet Windows".

    Voila. J'éspère avoir été clair.

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Self et Parent
    Bonjour,

    Tout d'abord merci à Tardiff Jean-François et à Einan . J'ai toujours un problème avec "self", et je vous assure que je ne teste pas votre patience en revenant ainsi à la charge. Vos indications fonctionnent dans tous les cas rencontrés sauf celui-là. En effet lorsqueje remplace "self" par "TMemoFlash" ou "TMemo" ou "TCustomMemo" j'obtiens l'avertissement suivant:

    La méthode Create cache la méthode virtuelle du type de TCustomMemo
    Si je remplace "self" par "form1"la compilation s'effectue et je reçois l'avertissement suivant (Mais là je comprends ouf ):

    Le projet TMemoflash.exe a provoqué ne classe d'exception EinInvalidError avec le message le contrôle n'a pas de fenête parente.
    Moralité :
    Je n'ai toujours pas compris les subtilités de "self" bien que vos observations soient parfaitelment claires.
    Quelle est le mot équivalent à "self" dans ce cas.
    voilà je suis vraiment dépité :et un peu honteux de ne pas savoir transposer vos explications à ce cas précis.
    Merci d'avance
    Noël

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2002
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Pour compléter...
    Dans la déclaration de ton constructeur, ajoute "override" pour surcharger le constructeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      public 
        constructor create(AOwner : Tcomponent); override;
        destructor  Destroy; 
      end;
    Idem pour ton destructeur.

    Dans ce constructeur, n'assigne pas le parent, c'est APRES la construction que la procédure qui crée ton objet doit assigner le parent. Si l'objet est simplement posé sur ton TForm, le parent sera assigné directement.[/b]
    Stéphane Vidouse
    www.developpez.com
    www.dnd.be
    TeamB-FR

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Je vais essayer de fair simple

    Soit une application contenant une form(TForm) et un Control (TCcontrol).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    MyForm: TForm;
     
    private MyControl: TControl;
     
     
    TMyForm.Create(Owner: TCoposant);
    begin
     
      inherited;
      MyControl := TControl.create(Self);
    { Içi MyControl.Parent = nil et MyControl.Handle = nil }
      MyControl.PArent := Self;
    { Içi Mycontrol.Parent = MyForm, MyControl à été "posé" sur Myform.
      Le Handle à été créer automatiquement }
      MyControl.Name := 'MyControlName';
    end;
    Donc j'ai créer MyForm.

    Dans myForm j'ai créer MyControl.

    Lors de la créartion le luis ai passé Self comme Owner. Donc le parent est Self de MyForm c'est à dire le parent est MyForm.

    Juste aprés la création le parent de MyControl, et le Handle de myControl sont à Nil.

    Ensuite j'ai indiqué que "MyControl.PArent := Self;".
    La procédure dans laquelle j'ai indiqué le parent est une procédure de MyForm ("TMyForm.Create(Owner: TCoposant);") par conséquence Self represente MyForm.

    Lorsque j'ai indiqué le parent à Mycontrol, je luis ai indiqué sur quellle composant il allais être "Posé" (Ne pas confondre avec Owner qui est le composant qui la fabriqué "Officiellment").

    Le handle est un identifiant WINDOWS des composant visuelles, créer automatiquement quand le parent est renseigné.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Attention, si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ensuite j'ai indiqué que "MyControl.PArent := Self;".
    je pense que self est la fiche dans lequel tu appelles ton create et non la fiche que tu crées!
    Tu devrais utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyControl.Parent := MyControl;".

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    MyControl.Parent := MyControl;
    C'est pas aberant d'affecter comme parent le l'objet lui meme ????

    Le code de Jean francois est tout a fait clair.
    LE seul truc c'ets qu'il decrare MyForm en tant que TForm et non TMyForm ... mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Var MyForm : TForm;
    MyForm := TMyForm.Create(...) ;
    ca marche .... c'est je pense ce qu'il a voulu dire.

    sinon dans une methode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Procediure <Classe>.Toto;
    Self revoie l'objet de classe <Classe> qui a fait l'appel.
    Exemple clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Var Form1 : TForm1;
     
    Procedure TForm1.FormClose(Sender : TObject);
    Begin
    Form1.Close;    // ici oon veux fermer Form1 de type TForm1
    End;
    Ce code que tout le monde ecrit a ces debut est juste ... mais pas correct.
    Disons qu'il ne plante pas tant que notre application possede une variable de type TForm1 !

    Imaginons que dans notre application on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Var Form1, Form2, Form3 : TForm1;
    Ces 3 forms sont de meme type donc appellent tous TForm1.FormClose qui a pour effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Form1.Close; // Ferme Form1
    Form2.Close; // Ferme Form1 (encore ...)
    Form3.Close; // Ferme Form1 (... et toujours)
    Donc dans la procedure TForm1.FormClose, on souhaiterais fermer la fenetre qui appele "Close" mais la classe etant unique Form1, Form2 et Form3, on a besoin de savoir qui a fait l'appel.
    Voila le role de Self.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Procedure TForm1.FormClose(Sender : TObject);
    Begin
    Self.Close;
    End;
     
    Form1.close; // Copie Form1 dans Self et ferme Self donc Form1
    Form2.close; // Copie Form2 dans Self et ferme Self donc Form2
    Form3.close; // Copie Form3 dans Self et ferme Self donc Form3


    Quand au parent, c'est le possesseur graphique de l'objet.
    Plus largement : Owner designe l'objet responsable de la destruction de ton objet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObjet := TMonObjet.Create(Panel1);
    MonObjet sera automatiquement detruit quand Panel1 sera detruit car Panel1 "Possede" (traduction de Owner) MonObjet.

    Parent : Responsable de l'affichage graphique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MonOnjet := TMonObjet.Create(StringList1);
    MonObjet.Parent := PAnel1;
    (Exemple peu coherent mais clair)
    MonObjet est possede par Ma StringList1 (c'est elle qui s'occupe de la destruction de MonObjet) mais n'etant pas d'ordre graphique, elle ne peux pas s'occuper de l'affichage. On specifie dont Panel1 comme parent "d'affichage" (ce qui aura pour but d'afficher MonObjet sur le Panel1)

    Quand au Handle, je pense que les messages precedents on ete clairs ... c'est un numero attribué par le systeme, unique dans le systeme complet qui permet de retrouver certaines infos et de les manipuler.
    J'associe souvent ca aux tickets que l'on prends chez le boucher.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Si je suis dans une procedure ou une fonction de MyForm, Self est MyForm,
    donc je peux faire "toto.PArent := Self;".
    C'est comme si, depuis une procédure exterieure a myform, je fessait "toto.Parent = MyForm;"
    [/b]

  10. #10
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Self et Parent
    Un grand Bonjour,

    C'est vraiment très, très sympa toutes ces réponses .
    Encore merci.
    Noël

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trouve handle d'un parent à partir du handle fils
    Par inspecteur rick dans le forum Débuter
    Réponses: 13
    Dernier message: 24/08/2011, 12h09
  2. [PHP 5.3] Significations de self et parent.
    Par éric1 dans le forum Langage
    Réponses: 5
    Dernier message: 01/08/2009, 16h46
  3. obtenir le handl de la fenetre parent
    Par switch1 dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 04/03/2009, 14h03
  4. Self et handle
    Par serve dans le forum Langage
    Réponses: 3
    Dernier message: 17/11/2004, 04h13
  5. pb de handle en C
    Par deedje dans le forum C
    Réponses: 3
    Dernier message: 21/06/2002, 16h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo