Bouton créé dynamiquement dans un SG, son évènement onClick

Résolu
madcap Messages postés 77 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 22 février 2011 - 30 oct. 2009 à 14:00
madcap Messages postés 77 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 22 février 2011 - 4 nov. 2009 à 14:31
Bonjour à tous, je suis bloqué depuis plusieurs heures sur un problème que je ne comprends vraiment pas.
J'ai un panel que je crée dynamiquement avec des éléments à l'intérieur. Un des éléments est un stringGrid, lorsque je dessine ce stringGrid, je dessine des boutons à l'intérieur d'une colonne.
Sur ces boutons, j'affecte à l'évènement onClick une méthode que j'ai faite pour donner un comportement bien précis.
Bizarrement il ne passe jamais dans l'évènement onClick, lorsque je clic sur le bouton il ne passe rien ??

Voici le code de la procédure DrawCell où je dessine les boutons :
procedure TMonPanel.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  calc_h, h: integer;
  calc_rect: TRect;
  s: string;
  btn : TJvImgBtn;
begin
  with Sender as TStringGrid do with Canvas do
  begin
    // Sélection de la couleur de fond
    if gdFixed in State then
      Brush.Color := clBtnFace
    else if gdSelected in State then
            Brush.Color := clNavy
          else Brush.Color := clWhite;

    // Dessin du fond
    FillRect(Rect);

    // Sélection de la couleur de texte
    if gdSelected in State then
      SetTextColor(Canvas.Handle,clWhite)
    else SetTextColor(Canvas.Handle,clBlack);

    // Dessin du texte en utilisant la fonction API
    calc_h := DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]), -1, Rect ,DT_NOPREFIX or DT_WORDBREAK );
    calc_h := calc_h + 4 ;
    if calc_h > StringGridTraitement.RowHeights[ARow] then begin
      StringGridTraitement.RowHeights[ARow] := calc_h;
    end;
  end;

  //Récupération de la hauteur de la ligne qu'on veut
  s:=StringGridTraitement.Cells[4,ARow];
  h := StringGridTraitement.Canvas.TextHeight(s);

  if ACol = 3 then begin
    //Si la ligne est vide, il n'y a pas d'enregistrements, ne pas dessiner le bouton
    if (StringGridTraitement.Cells[1, ARow] <> '') then begin
      //On construit le bouton
      if (liste_btn.Count < ARow) then begin
        liste_btn.Add(TJvImgBtn.Create(self));
        (liste_btn[ARow - 1]as TJvImgBtn).Visible := True;
        (liste_btn[ARow - 1]as TJvImgBtn).Parent := StringGridTraitement;
        (liste_btn[ARow - 1]as TJvImgBtn).Width := 45;
        (liste_btn[ARow - 1]as TJvImgBtn).Height := 18;
        (liste_btn[ARow - 1]as TJvImgBtn).Images := self.image_list;
        (liste_btn[ARow - 1]as TJvImgBtn).Color := $00E7CE9C;
        (liste_btn[ARow - 1]as TJvImgBtn).ImageIndex := 0;
        //Affectation de mon évènement onClick à chaque bouton
        (liste_btn[ARow - 1]as TJvImgBtn).OnClick := JvImgBtnPhotoClick;
      end;
      //On dessine le bouton au bon endroit
      (liste_btn[ARow - 1]as TJvImgBtn).Left := Rect.Left + 1;
      (liste_btn[ARow - 1]as TJvImgBtn).Top := Rect.Top + (Rect.Bottom-Rect.Top- h) div 2 - 1;
    end;
  end;

end;


La fonction onClick a été créée avec le nom JvImgBtnPhotoClick. Je l'ai pas mise ici, car je pense que ce n'est pas nécessaire

Si quelqu'un voit une erreur...

Merci de votre aide !

6 réponses

ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
30 oct. 2009 à 22:34
Salut,

c'est le composant TButton qui, placé sur un StringGrid, semble en cause. Pour essayer, dérive ton "TJvImgBtn" de TPanel. Cela devrait marcher.
Si tu n'as pas besoin de bouton recevant le focus, tu peux utiliser TSpeedButton.

A +
Thierry
3
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
30 oct. 2009 à 15:09
Hello
"je pense que ce n'est pas nécessaire"
N'essaie pas de résoudre toi même le soucis puisque tu postes ^^
Peut-on avoir le code de cette procedure onclick ? merci
0
madcap Messages postés 77 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 22 février 2011
30 oct. 2009 à 15:48
Hello,
oui je peux te montrer le code, pour l'instant je fais juste un ShowMessage dans l'évènement pour voir s'il passe à l'intérieur, c'est pour ça que je ne voyais pas l'utilité de le mettre :

procedure TPlaieTraitementPanel.JvImgBtnPhotoClick(Sender: TObject);
begin
  ShowMessage('plop');
end;
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
30 oct. 2009 à 16:05
Ok ok
Pas de soucis possible entre "TPlaieTraitementPanel." et "TMonPanel." ?
Je dis ça comme ça, je me demande si le TMonPanel a accès a la procedure, mais en meme temps je me dis que ça compilerais pas ...
qu'en dis tu ?
0

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

Posez votre question
madcap Messages postés 77 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 22 février 2011
30 oct. 2009 à 16:12
Ah mince j'ai renommé TPlaieTraitementPanel en TMonPanel en recopiant le code dans le forum pour que ce soit plus générique. Désolé, j'ai oublié de le faire dans le second post..

Non le code compil y'a pas de souci. Par contre j'ai beau cliquer sur les boutons générés, il passe pas dans l'évènement onClick.
0
madcap Messages postés 77 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 22 février 2011
4 nov. 2009 à 14:31
Hello !

Merci beaucoup, c'était tout simple mais fallait trouver

A bientôt !
0
Rejoignez-nous