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

Delphi Discussion :

[Bug] Événement OnDestroy dans fenêtre dynamique


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de gregcat
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 155
    Par défaut [Bug] Événement OnDestroy dans fenêtre dynamique
    Je crée une fenetre de type TForm dynamiquement et j'aimerais intercepter le OnDestroy pour supprimer un thread qui se lance en meme temps que la creation de la fenetre.

    Le problème c'est que lors de l'evennement OnDestroy il ne se passe rien, il n'affiche pas le showmessage qu'il y a dans l'evennement OnDestroy..


    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
        
    
      procedure TNM_Form_principale.NM_act_Control_btn_ExitclickExecute  (Sender:Tobject);
       begin
         showmessage(sender.ClassName);
         // destruction du thread...
       end;
    ....
        NM_Control:=Tform.Create(NM_ScrollBox_globale);
        NM_Control.Tag:=NM_Nombre_Control;
        NM_Control.BorderStyle:=BsToolWindow;
        NM_Control.Width:=200;
        NM_Control.Height:=200;
        NM_Control.OnDestroy:=NM_act_Control_btn_ExitclickExecute;
        NM_Control.Parent:=NM_ScrollBox_globale;   // attantion
        NM_Control.Caption:='Controle '+inttostr(NM_Nombre_Control);
        NM_Control.Show;
        ....

  2. #2
    Membre confirmé Avatar de gregcat
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 155
    Par défaut
    J'avoue que je suis un peu débutant en langage Objet et j'ai donc refait le projet de test suivant :
    et j'aimerais bien savoir comment implémenter l'evennement OnDestroy de ma fenetre dynamique ??


    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
    unit Test_Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
    
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
    
    var
      Form1: TForm1;
      NM_Control:Tform;
    
    
      implementation
    
    procedure NM_Control.ondestroy(Sender:Tobject);
    begin
       showmessage('ok');
    
    end;
    
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    
    begin
        NM_Control:=Tform.Create(Form1);
    
        NM_Control.BorderStyle:=BsToolWindow;
        NM_Control.Width:=200;
        NM_Control.Height:=200;
        NM_Control.OnDestroy:=NM_Control.ondestroy;
        NM_Control.Parent:=Form1;   // attantion
        NM_Control.Caption:='Controle ';
        NM_Control.Show;
    end;
    
    end.
    à la compaliation j'ai "indenticateur redéclaré NM_Control" ...

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    Normalement, il te suffit dans l'inspecteur d'objet de double-clicquer sur OnDestroy cela écrit le prototype du gestionnaire d'évènement, et tu le remplis

    ensuite, il faut libérer la fiche, donc faire un Free ou fermer l'application et si tu as spécifié le Owner (NM_ScrollBox_globale), et bien tu auras déclenchement de l'évènement ...

    Sinon, un ShowMessage dans un OnDestroy qui se produit à la fermeture de l'application, hum, je suis pas sur que cela se passe bien ...

    et avec les Threads, ne manipulent pas les forms, tu devrais peut-être faire des tutoriaux, car si tu ne maitrise par les events, les threads et les sections critiques c'est plus subtiles, pas plus complexes mais faut être plus rigoureux, je trouve ...

    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
    unit Test_Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
        procedure EventManagerDestroy(Sender:Tobject);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      NM_Control:Tform;
     
    implementation
     
    procedure TForm1.EventManagerDestroy(Sender:Tobject);
    begin
       showmessage('ok');
     
    end;
     
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
     
    begin
        NM_Control:=Tform.Create(Form1);
     
        NM_Control.BorderStyle:=BsToolWindow;
        NM_Control.Width:=200;
        NM_Control.Height:=200;
        NM_Control.OnDestroy:= Self.EventManagerDestroy;
        NM_Control.Parent:=Form1;   // attantion
        NM_Control.Caption:='Controle ';
        NM_Control.Show;
    end;
     
    end.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 160
    Par défaut
    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 Test_Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
    
      private
        { Déclarations privées }
      public
      procedure MyOnDestroy(Sender: TObject);
        { Déclarations publiques }
      end;
    
    var
      Form1: TForm1;
      NM_Control:Tform;
    
    
      implementation
    
     procedure NM_Control.MyOnDestroy(Sender:Tobject);
    begin
       showmessage('ok');
    
    end;
    
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    
    begin
        NM_Control:=Tform.Create(Form1);
    
        NM_Control.BorderStyle:=BsToolWindow;
        NM_Control.Width:=200;
        NM_Control.Height:=200;
        NM_Control.OnDestroy:=NM_Control.MyOnDestroy;
        NM_Control.Parent:=Form1;   // attention
        NM_Control.Caption:='Controle ';
        NM_Control.Show;
    end;
    
    end.
    Voilà, j'ai pas vérifié mais ca devrait mieux marcher...

    Et puis tant qu'a tuer un thread... Perso...je le ferais plutot sur le OnCloseQuery...

    EDIT: d'un coup j'ai une doute... Je ne sais pas si je repond bien à la question... Anyway... je pense que le ondestroy n'est pas le bon endroit... Mieux vaut faire intervenir le code avant...

  5. #5
    Membre confirmé Avatar de gregcat
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 155
    Par défaut
    Merci de votre aide mais

    l'evennement ne se produit que à la fermeture de la Form1 ?

    et non à celui de la fenetre dynamique ! ...

  6. #6
    Membre confirmé Avatar de gregcat
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 155
    Par défaut
    Je vais utiliser OnClose plutot que OnDestroy, ce sera déjà plus simple de ne pas utiliser un evennement déja implémenté et je vais m'inspirer de ce post :
    http://www.developpez.net/forums/sho...form+dynamique

  7. #7
    Membre confirmé Avatar de gregcat
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 155
    Par défaut
    ca a l'air de fonctionner avec OnClose...

    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
    50
    51
    52
    53
    54
    unit Test_Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button1Click(Sender: TObject);
     
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      NM_Control:Tform;
     
     
      implementation
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     
       action:=cafree;
    end;
     
     
     
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
     
    begin
        NM_Control:=Tform.Create(Form1);
     
        NM_Control.BorderStyle:=BsToolWindow;
        NM_Control.Width:=200;
        NM_Control.Height:=200;
        NM_Control.OnClose:=formclose;
        NM_Control.Parent:=Form1;  
        NM_Control.Caption:='Control ';
        NM_Control.Show;
    end;
     
     
     
    end.

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

Discussions similaires

  1. Afficher donnée dynamiques dans fenêtre modale
    Par karamaster dans le forum Langage
    Réponses: 16
    Dernier message: 03/03/2015, 09h34
  2. [Toutes versions] Intercepter l'évènement Scroll dans une fenêtre?
    Par NVCfrm dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/06/2013, 00h16
  3. [WD15] Gestion des événements clavier dans une fenêtre.
    Par dvdbly dans le forum WinDev
    Réponses: 3
    Dernier message: 20/09/2010, 08h58
  4. Réponses: 3
    Dernier message: 21/06/2009, 15h16
  5. Trapper les événements clavier dans une fenêtre
    Par NicoV dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 02/03/2008, 10h28

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