Evènement onDrawCell d'un StringGrid [Résolu]

Messages postés
77
Date d'inscription
mercredi 15 mars 2006
Dernière intervention
22 février 2011
- - Dernière réponse : madcap
Messages postés
77
Date d'inscription
mercredi 15 mars 2006
Dernière intervention
22 février 2011
- 29 oct. 2009 à 17:21
Bonjour tous le monde,

J'ai créé un panel qui contient différents éléments, StringGrid, boutons, label, etc... Ce panel je le crée à l'exécution, il y n'y a donc pas de Form et tout est créé et détruit dans le code.

J'ai différents évènements pour le StringGrid, dont l'évènement onDrawCell. J'utilise cet évènement pour dessiner un bouton dans une des colonnes du StringGrid dans chaque cellule.

Bizarrement, en debuguant je me suis rendu compte qu'il ne passe jamais dans l'évènement onDrawCell.

Pourtant lors de l'initialisation du StringGrid je fais bien :
  with StringGridTraitement do begin
    Parent := self;
    Width := 940;
    Height := 200;
    Left := 0;
    Top := 30;
    Visible := true;
    WordWrap := true;
    ScrollBars := ssnone;
    InitializeParameters(parametres_initialisation);

    Options := [goRowSelect, goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect];
    OnDrawCell := StringGridTraitementDrawCell
  end;


Et mon évènement onDrawCell ressemble à ça :
procedure TPlaieTraitementPanel.StringGridTraitementDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  btn : TJvImgBtn;
  R: TRect;
begin
  //On dessine le bouton
  if (ACol = 3) then begin
    btn := TJvImgBtn.Create(self);
    R := StringGridTraitement.CellRect(ACol, ARow);
    R.Left := R.Left + StringGridTraitement.Left;
    R.Right := R.Right + StringGridTraitement.Left;
    R.Top := R.Top + StringGridTraitement.Top;
    R.Bottom := R.Bottom + StringGridTraitement.Top;
    btn.Left := R.Left + 1;
    btn.Top := R.Top + 1;
    btn.Width := (R.Right + 1) - R.Left;
    btn.Height := (R.Bottom + 1) - R.Top;
    btn.Visible := True;
  end;
end;


Est-ce que c'est faux comme je surcharge l'évènement du StringGrid ?
Est-ce normale qu'il ne passe jamais dans l'évènement onDrawCell ?

Merci d'avance de votre aide !
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
3
Merci
inherited fait appel a la methode de la classe mere:
TPere = class
  procedure methode1; virtual;
  procedure methode2;
end;

TFils = class(TPere)
  procedure methode1; override;
  procedure methode2;
  procedure methode3;
end;
...
procedure TFils.methode1; 
begin
  inherited; // appel de TPere.methode1;
  inherited methode2; // appel de TPere.methode2;
  methode2; //appel de Self.methode2;
end;
//attention, TFils.methode2 n'est pas override (car TPere.methode2 pas virtual). on aura le comprtement suivant:
var
  p: TPere;
  f: TFils;
begin
  f := TFils.Create;
  p := f; //p contient un instance de TFils
  f.methode2; //appel de TFils.methode2
  p.methode2; //appel de TPere.methode2, meme si p est un TFils
//par contre, p.methode1 et f.methode1 appelent tous les 2 TFils.methode1

Merci Guillemouze 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Guillemouze
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
peut etre en mettant DefaultDrawing à False
Commenter la réponse de Guillemouze
Messages postés
77
Date d'inscription
mercredi 15 mars 2006
Dernière intervention
22 février 2011
0
Merci
Merci pour ton aide, mais j'ai déjà essayé et ça ne change rien au problème
Commenter la réponse de madcap
Messages postés
77
Date d'inscription
mercredi 15 mars 2006
Dernière intervention
22 février 2011
0
Merci
Hello alors j'ai trouvé la solution à mon problème, il faut passer la propriété WordWrap à false
WordWrap := false;


C'est étrange, ça fonctionne mais je ne comprends pas la raison... est-ce que qqun a une explication à cela ??
Commenter la réponse de madcap
Messages postés
77
Date d'inscription
mercredi 15 mars 2006
Dernière intervention
22 février 2011
0
Merci
Oups alors là je suis désolé pour mon précédent post, je viens de trouver la solution.
En fait j'utilise un StringGrid customisé, développé par un collègue. Et la propriété wordwrap permet de gérer le multiligne. Ce composant a déjà surchargé la méthode onDrawCell... donc il faut que je regarde ce côté là pour voir comment je peux à nouveau la surcharger...
Commenter la réponse de madcap
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
l'ideal serait que le compo "customisé" de ton collegue n'utilise pas le onDrawCell mais plutot surcharge de DoDrawCell (ou un truc dans le style), pour laisser l'evenement libre
Commenter la réponse de Guillemouze
Messages postés
77
Date d'inscription
mercredi 15 mars 2006
Dernière intervention
22 février 2011
0
Merci
Et bien j'ai été regarder dans le composant et l'évènement est bien surchargé...

C'est assez étrange, car seulement lorsque je passe le paramètre wordWrap à True que l'évènement n'est plus atteignable.
Pourtant dans le code, la méthode surchargée DrawCell fait une série d'actions, dont une si le param wordWrap est à true.

Je vois pas trop en quoi ce paramètre pourrait bloquer comme ça l'accès à l'évènement..
Commenter la réponse de madcap
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
bah en ne faisant pas le inherited. Exemple:
procedure TMySG.DrawCell(...);
begin
  if wordwrap then
  begin
    //Des traitements
  end
  else
  begin
    //D'autres traitements
    inherited; // le inherited va lancer le OnDrawCell, et ne sera donc appelé que si wordwrap = false
  end;
end;
Commenter la réponse de Guillemouze
Messages postés
77
Date d'inscription
mercredi 15 mars 2006
Dernière intervention
22 février 2011
0
Merci
Merci pour ta réponse,

Donc si j'ai bien compris inherited lance l'exécution de l'évènement OnDrawCell de la classe parente ?

Je comprend pas trop à quoi sert inherited, à quel moment on l'utilise,... si quelqu'un peut m'éclairer.
Commenter la réponse de madcap
Messages postés
77
Date d'inscription
mercredi 15 mars 2006
Dernière intervention
22 février 2011
0
Merci
Merci pour tes explications, maintenant c'est plus clair

A bientôt et bonne fin de journée !
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.