Options d'affichage de la StringGrid [Résolu]

Messages postés
15
Date d'inscription
jeudi 19 mai 2005
Dernière intervention
5 septembre 2005
- - Dernière réponse : cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
- 8 juin 2005 à 20:46
Bonjour à tous,

Pour présenter des résultats j'utilise une StringGrid, et je souhaiterais qu'elle soit la plus discrète, la plus intégrée possible au reste de la feuille. En particulier j'aimerais que la sélection de cellule ne soit pas possible, pour éviter que la cellule sélectionnée s'affiche toujours en bleu.
J'aimerais aussi interdire à l'utilisateur de se "déplacer" à l'intérieur du tableau. C'est à dire que j'ai enlevé les scrolls mais il est toujours possible de se déplacer en restant appuyé sur la souris tout en la déplaçant.

D'avance merci pour vos réponses ;)
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
3
Merci
Je propose la démarche suivante :

1er étape - Créer une méthode chargée de modifier la cellule sélectionnée. Cette méthode prendra un seul paramètre qui est une référence sur le contrôle grille. Pour que cette méthode soit utilisable le plus largement possible, nous lui passerons une référence sur un TCustomDrawGrid :

<CODE><CODE>procedure TCalcul.HideGridSelection(Grid: TCustomDrawGrid);
var
  R: TGridRect;
begin
  R.TopLeft :=  TGridCoord(Point(-1, -1));
  R.BottomRight := TGridCoord(Point(-1, -1));
  Grid.Selection := R;
 end ;
</CODE>

2ème étape - Créons un squelette de procédure pour l'évènement OnDrawCell du composant grille et ajoutons y un appel à la méthode précédente :

procedure TCalcul.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
//Pour effacer la s&#233;lection m&#234;me quand le contr&#244;le perd le focus
  HideGridSelection(Sender as TStringGrid);
end;

</CODE>
Et hop, ça marche !
Elle est pas belle la vie ?

<HR color =#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
<

Merci cs_Delphiprog 3

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

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Dernière intervention
3 septembre 2006
0
Merci
Options.Editing:=false;
TStringGrid.Enabled:=false;

Autant tout bloquer...

===========
Validez les réponses si ok...

ViewVite : HTML
Commenter la réponse de cs_grandvizir
Messages postés
15
Date d'inscription
jeudi 19 mai 2005
Dernière intervention
5 septembre 2005
0
Merci
Merci pour ta réponse qui règle en partie le problème mais au démarrage la première cellule s'affiche toujours en bleu. Sais-tu comment éviter cela?
Commenter la réponse de Jubilatthorr
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Dernière intervention
3 septembre 2006
0
Merci
Form1.ActiveControl:= nil ;

La sélection vient du fait que le composant fenêtré est actif... pas actif donc pas de sélection. Rien ne t'empêche d'activer un composant de ton choix via la fonction SetFocus.

=============
Validez les réponses si ok...

ViewVite : HTML
Commenter la réponse de cs_grandvizir
Messages postés
15
Date d'inscription
jeudi 19 mai 2005
Dernière intervention
5 septembre 2005
0
Merci
J'ai recopié ta ligne de code mais j'ai toujours une sélection en bleu :/
Voici le code:
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Form1.ActiveControl:=nil;
Application.Run;
end.

Sais-tu s'il est possible de désactiver ce seul composant (la TStringGrid) dès le démarrage, dans l'inspecteur d'objet par exemple?

Merci de ton aide
Commenter la réponse de Jubilatthorr
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Dernière intervention
3 septembre 2006
0
Merci
Il ne faut pas coder le ActiveControl à ce niveau. C'est dans l'inspecteur d'objet (F11) qu'il faut régler une fois pour toute la focalisation de tel ou tel composant, de manière à ce qu'il ne puisse plus être activé (avec Enabled=false). Mais avec Enabled, ça risque de faire tout gris.

Ou alors, en gérant une interception WM_ActiveControl (un truc dans ce genre) ou un évènement OnEnter, tu rediriges la focalisation demandée. Ainsi, il n'est plus focusé...

Désolé, mais ça risque de tourner en rond... Alors

===========
ViewVite : HTML
Commenter la réponse de cs_grandvizir
Messages postés
15
Date d'inscription
jeudi 19 mai 2005
Dernière intervention
5 septembre 2005
0
Merci
Merci Delphiprog!

C'est pas facile mais puissamment efficace! :)

Sait-tu s'il est possible d'appeler ta procédure dès le chargement de la feuille? Le compilateur me répond que HideGridSelection est une variable non déclarée:

begin


HideGridSelection(StringGrid1 as TStringGrid);
end.
Commenter la réponse de Jubilatthorr
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
Si tu observes le code ci-dessus :
<CODE>procedure TCalcul.HideGridSelection(Grid: TCustomDrawGrid);
</CODE>
Tu peux voir que la classe de la fiche se nomme TCalcul et que cette classe possède (au moins) une méthode nommée : HideGridSelection.
Il te suffit donc de déclarer une procédure dans la section Public ou Private de la fiche (comme il te plaira) :
TCalcul = class (TForm)
//...
private
procedure HideGridSelection(AGrid: TCustomDrawGrid);
end;

Alors que le curseur est encore dans la déclaration de la classe TCalcul, tu appuies sur Shift+Ctrl+C et Delphi écrira tout seul le squelette de cette méthode. Il ne te reste plus qu'à reproduire le code indiqué. On peut aussi faire un clic droit et sélectionner "Compléter la classe sous le curseur".

Note bien que si tu as déjà recopié le code donné dans le précédent post dans la partie implémentation, alors place ton curseur entre le begin et le end de la procédure et appuie également sur Shift+Ctrl+C. Delphi procédera ajoute alors en section Private la déclaration de ta procédure. Magique, non ?
Ah, si on pouvait disposer du même confort sous C++Builder...

<HR color =#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
<
Commenter la réponse de cs_Delphiprog
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
0
Merci
Salut à tous,

Delphiprog, il est inutile de créer un membre de classe pour cette
procédure que tu nous a posté puisqu'il n'y a aucune référence aux
objets de la classe TCalcul (dans ton exemple).



Sinon, ton histoire de Shift, Ctrl + C ne marque pas sur les versions personnelles de Delphi (aussi bien 6, 7, 8 que 2005).



@ ++

Florent

Si tu ne te plantes pas ......
tu ne poussera jamais
Commenter la réponse de florenth
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
Florenth : tu as tout à fait raison. Ce n'est pas nécessaire de créer une méthode pour cela dans le cas présent. Mais ça ne nuit pas non plus

Je suis étonné que la combinaison de touches ne fonctionne pas avec Delphi édition perso. Quand tu fais un clic droit à l'intérieur de la déclaration d'une classe, vois-tu oui ou non le choix "Compléter la classe sous le curseur" dans le menu contextuel ?


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
<
Commenter la réponse de cs_Delphiprog
Messages postés
1105
Date d'inscription
dimanche 1 août 2004
Dernière intervention
17 août 2008
0
Merci
J'imagine bien que les clases ne nuisent pas. car .NET est conçu
exclusivement là-dessus. (je ne programme pas en .NET mais comme D2005
est gratuit et qu'il le propose j'ai essayé).



Non malheusement, je n'ai pas ce sous menu lorsque je clique droit.
Tout comme les options de refactoring tant convoités de Delphi 2005 (et
qui semblent très pratiques).



@ ++ Florent
Commenter la réponse de florenth
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
Merci pour cette info. J'ignorais que l'édition perso ne possédait pas cette option si pratique.


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
<
Commenter la réponse de cs_Delphiprog

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.