Options d'affichage de la StringGrid

Résolu
Jubilatthorr Messages postés 15 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 5 septembre 2005 - 4 juin 2005 à 16:10
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre 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 ;)

12 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
5 juin 2005 à 08:36
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.
<
3
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
4 juin 2005 à 16:46
Options.Editing:=false;
TStringGrid.Enabled:=false;

Autant tout bloquer...

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

ViewVite : HTML
0
Jubilatthorr Messages postés 15 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 5 septembre 2005
4 juin 2005 à 17:15
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?
0
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
4 juin 2005 à 17:23
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
0

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

Posez votre question
Jubilatthorr Messages postés 15 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 5 septembre 2005
4 juin 2005 à 18:23
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
0
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
4 juin 2005 à 20:06
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
0
Jubilatthorr Messages postés 15 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 5 septembre 2005
6 juin 2005 à 20:09
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.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
7 juin 2005 à 21:19
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.
<
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
7 juin 2005 à 21:52
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
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
7 juin 2005 à 22:52
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.
<
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
8 juin 2005 à 12:24
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
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
8 juin 2005 à 20:46
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.
<
0
Rejoignez-nous