Bouton créé dynamiquement dans un SG, son évènement onClick [Résolu]

madcap 77 Messages postés mercredi 15 mars 2006Date d'inscription 22 février 2011 Dernière intervention - 30 oct. 2009 à 14:00 - Dernière réponse : madcap 77 Messages postés mercredi 15 mars 2006Date d'inscription 22 février 2011 Dernière intervention
- 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 !
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 30 oct. 2009 à 22:34
3
Merci
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

Merci ThWilliam 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de ThWilliam
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 30 oct. 2009 à 15:09
0
Merci
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
Commenter la réponse de JulioDelphi
madcap 77 Messages postés mercredi 15 mars 2006Date d'inscription 22 février 2011 Dernière intervention - 30 oct. 2009 à 15:48
0
Merci
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;
Commenter la réponse de madcap
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 30 oct. 2009 à 16:05
0
Merci
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 ?
Commenter la réponse de JulioDelphi
madcap 77 Messages postés mercredi 15 mars 2006Date d'inscription 22 février 2011 Dernière intervention - 30 oct. 2009 à 16:12
0
Merci
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.
Commenter la réponse de madcap
madcap 77 Messages postés mercredi 15 mars 2006Date d'inscription 22 février 2011 Dernière intervention - 4 nov. 2009 à 14:31
0
Merci
Hello !

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

A bientôt !
Commenter la réponse de madcap

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.