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 :

Evénement sur controle dynamique


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut Evénement sur controle dynamique
    Salut a tous,

    Tout d'abords, j'ai bien recherché sur le forum si il y avait une solution a ce probleme mais je ne l'ai pas trouvé malgré le nombre de messages sur le sujet !

    Mon probleme est le suivant :

    Je crée des controles dynamiques qui doivent appeler un évenement Onclick.
    J'ai vérifié mon code par rapport a plein d'exemple sur le net et ça a l'air d'etre bon, seulement, la fonction liée a l'évenement n'est pas appelée.

    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
     
    TfrmToolbar = class(TForm)
     
       ...............
     
        procedure CatClick(Sender: TObject);
      private
        l_deskView:cls_DeskView;
        procedure DrawCategories;
     
      public
        { Déclarations publiques }
      end;
     
     
    procedure TfrmToolbar.DrawCategories;
     
    ............
     
        cPanel:=TPanel.Create(self);
        with cPanel do
        begin
          Parent:=self;
          Caption:='';
          PopupMenu:=popM_Category;
          OnClick:=CatClick;
        end;
    end;
     
    //Et enfin la procédure liée a l'évenement
     
    procedure TfrmToolbar.CatClick(Sender: TObject);
    begin
      showmessage('catclick');
      if Sender is TImage then
        l_deskView.DisplayCat((Sender as TImage).Tag)
      else if Sender is TLabel then
        l_deskView.DisplayCat((Sender as TLabel).Tag);
    end;
    Et donc en cliquant sur mon panel, la fonction CatClick n'est jamais appelée.
    Le pire c'est que j'ai plusieurs fois fait des évenements dynamiquers qui fonctionnaient tres bien ! Je ne sais pas pourquoi ça bloque.

    Avez-vous la solution ?

    Merci d'avance.

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    En testant ton code, je pense que tu ne cliques pas sur le panel, mais sur un autre objet qui est contenu dans le panel ou au dessus du panel
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    Merci de ta réponse.

    Oui c'est ce que je me suis dit d'abord :
    J'ajoute ensuite un TImage et un Label dans mon Panel.

    Mais j'ai lié leurs évements onclick a la meme procédure et aucun résultat.
    Ensuite, j'ai testé en virant les TImage et TLabel de mon panel et ça ne marche pas plus.

    J'ai aussi ajouté un BringtoFront mais pas plus de résultat.

    Enfin le popupMenu associé a ce panel fonctionne correctement donc je pense que le controle est bien au premier plan.

    Vraiment, je ne vois pas ...

    D'autres idées ?

  4. #4
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Je ne vois pas. Peut-être avec plus de code (uniquement la partie création graphique).
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
     
    unit u_frmToolbar;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, ExtCtrls, StdCtrls, u_ListView, u_frmMain;
     
    type
      TfrmToolbar = class(TForm)
        popM_Permanent: TPopupMenu;
        Options1: TMenuItem;
        Gestiondesicones1: TMenuItem;
        Aproposde1: TMenuItem;
        Quitter1: TMenuItem;
        popM_Category: TPopupMenu;
        img_Left: TImage;
        img_Right: TImage;
        Gestiondesicones2: TMenuItem;
        Modifiercettecatgorie1: TMenuItem;
        Supprimercettecatgorie1: TMenuItem;
        Affichercettecatgorie1: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure Quitter1Click(Sender: TObject);
        procedure OnClose(Sender: TObject; var Action: TCloseAction);
     
        procedure CatClick(Sender: TObject);
      private
        l_deskView:cls_DeskView;
        procedure DrawCategories;
     
      public
        //procedure CatClick(Sender: TObject);
        { Déclarations publiques }
      end;
     
    var
      frmToolbar: TfrmToolbar;
     
    implementation
     
    uses u_Common, u_Xml;
     
    {$R *.dfm}
     
    procedure TfrmToolbar.FormCreate(Sender: TObject);
    var
      hProgman:THandle;
    begin
      //Chargement des parametres et icones
      LoadSettings;
      LoadIconDir(gSettings.IconDir);
     
      DrawCategories; //Dessine les icones des catégories
     
      //Pacement de la barre sur le bureau
      Top:=5;
      Left:=(screen.width div 2) - (Width div 2); //Barre centrée
     
      {Affichage des icones du bureau}
      l_deskView:=cls_DeskView.Create(self);
      l_deskView.DrawListView;
      l_deskView.DisplayCat(0);
     
      //Affichage sur le bureau
      //hProgman:=  FindWindowEx(0,0,'Progman','Program Manager');
      Windows.SetParent(self.Handle, l_deskView.Handle);
    end;
     
    procedure TfrmToolbar.OnClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
    end;
     
    procedure TfrmToolbar.Quitter1Click(Sender: TObject);
    begin
      if MessageDlg('Etes-vous sur de vouloir quiter ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        self.Close;
    end;
     
    {*Dessine les icones des différentes catégories*}
    procedure TfrmToolbar.DrawCategories;
    var
      cPanel:TPanel;
      cIcon:TImage;
      cLabel:TLabel;
      newLeft:integer;
     
      ICat:integer;
    begin
      if high(global_Cats) = -1 then Exit; //Si il n'y a pas de categories, on sort
     
      newLeft:=img_Left.Width+5;
      for ICat := 0 to high(global_Cats) do
      begin
        cPanel:=TPanel.Create(self);
        with cPanel do
        begin
          Parent:=self;
          Caption:='';
          PopupMenu:=popM_Category;
          OnClick:=CatClick;
     
          Top:=5;
          Left:=newLeft;
          Height:=self.Height-10;
          Width:=Height;
          newLeft:=newLeft+Width+10;
     
          BevelKind:=bkFlat;
          BevelOuter:=bvNone;
          BevelInner:=bvNone;
     
          Bringtofront;
        end;
     
        cIcon:=TImage.Create(cPanel);
        with cIcon do
        begin
          PopupMenu:=popM_Category;
          OnClick:=CatClick;
          Parent:=cPanel;
          Top:=0;
          Left:=0;
          Width:=cPanel.Width;
          Height:=cPanel.Height-20;
          Tag:=ICat; //Associe le numero de la catégorie a l'image
        end;
     
        cLabel:=TLabel.Create(cPanel);
        with cLabel do
        begin
           PopupMenu:=popM_Category;
           OnClick:=CatClick;
           Parent:=cPanel;
           AutoSize:=false;
           Top:=cPAnel.Height-20;
           Left:=3;
           Width:=cPanel.Width-6;
           Caption:=global_Cats[ICat].Name;
           Alignment:=taCenter;
           Tag:=ICat; //Associe le numero de la catégorie au label
        end;
      end;
    end;
     
    procedure TfrmToolbar.CatClick(Sender: TObject);
    begin
      showmessage('catclick');
      if Sender is TImage then
        l_deskView.DisplayCat((Sender as TImage).Tag)
      else if Sender is TLabel then
        l_deskView.DisplayCat((Sender as TLabel).Tag);
    end;
     
     
    end.
    Petite précision, deskView est un objet qui contient un TListView, l_deskView.Handle correspond au Handle dudit Listview.

    Le TListview est affciéh sur le bureau (Windows.SetParent) puis ma barre d'outil est apparentée au Listview par la meme methode.

    Merci d'avance.

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Est-ce que tu pourrais mettre le contenu du dfm aussi s'il te plaît (pour le positionnemnt des objets non dynamiques)

    Parce que là, je n'arrive pas à reproduire ton problème sauf si je désaffecte le OnClick pour le TImage).
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    Merci d'essayer de résoudre mon probleme !

    Le dfm est basique, il n'y a pas grand chose sur cette feuille :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
     
    object frmToolbar: TfrmToolbar
      Left = 0
      Top = 0
      BorderStyle = bsNone
      Caption = 'frmToolbar'
      ClientHeight = 80
      ClientWidth = 618
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      PopupMenu = popM_Permanent
      OnClose = OnClose
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object img_Left: TImage
        Left = 0
        Top = 0
        Width = 50
        Height = 81
      end
      object img_Right: TImage
        Left = 568
        Top = 0
        Width = 50
        Height = 81
      end
      object popM_Permanent: TPopupMenu
        Left = 208
        Top = 16
        object Options1: TMenuItem
          Caption = 'Options'
        end
        object Gestiondesicones1: TMenuItem
          Caption = 'Gestion des icones'
        end
        object Aproposde1: TMenuItem
          Caption = 'A propos de ...'
        end
        object Quitter1: TMenuItem
          Caption = 'Quitter'
          OnClick = Quitter1Click
        end
      end
      object popM_Category: TPopupMenu
        Left = 296
        Top = 24
        object Affichercettecatgorie1: TMenuItem
          Caption = 'Afficher cette cat'#233'gorie'
        end
        object Gestiondesicones2: TMenuItem
          Caption = 'Gestion des icones'
        end
        object Modifiercettecatgorie1: TMenuItem
          Caption = 'Modifier cette cat'#233'gorie'
        end
        object Supprimercettecatgorie1: TMenuItem
          Caption = 'Supprimer cette cat'#233'gorie'
        end
      end
    end

  8. #8
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Je n'ai aucun souci, par contre la méthode appelée est celle du TImage ou du TLabel en fonction de l'objt sur lequel on clique.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    Oui c'est normal.

    Mais alors pourquoi ça ne marche pas chez moi, je me le demande ...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    En fait le probleme ne vient pas de ma fiche frmToolbar mais de ma classe DeskView.

    Lorsque je fixe le TListView sur le bureau windows (par setparent (API Win32)) alors que son parent était la fiche frmToolbar, a partir de ce moment la, le click ne répond plus.

    En fait, il faudrait que j'arrive a creer mon Listview indépendement de ma fiche frmToolbar (sans déclarer un truc du style l_listview.parent:=frmToolbar). Seuelement au début j'ai tenté ceci et ça me renvoie une exception lorsque j'essaye d'acceder au handle du Listview.

Discussions similaires

  1. Ajax/Evènements sur les controles dynamiques
    Par pierre1256 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 01/02/2010, 09h59
  2. Evenèment sur controles dynamiques
    Par maleo833 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2007, 17h31
  3. Evènement sur composant dynamique
    Par Sakapatate dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 22/04/2007, 11h47
  4. Evénement sur TMemo dynamique
    Par rasta girl dans le forum Delphi
    Réponses: 4
    Dernier message: 31/05/2006, 12h57
  5. WM_MOUSEDOWN sur controle dynamique
    Par hepsilonz dans le forum MFC
    Réponses: 2
    Dernier message: 23/12/2005, 15h37

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