madcap
Messages postés77Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention22 février 2011
-
30 oct. 2009 à 14:00
madcap
Messages postés77Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention22 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
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 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.
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 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
madcap
Messages postés77Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention22 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;
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
madcap
Messages postés77Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention22 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.