ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Détecter ‘MouseEnter’ dans une cellule d’une grille   



L'auteur

Gregory Adam
Belgique Belgique
Membre Actif (personne physique)
# 0000001121
enregistré le 04/06/2006

Fiche personnelle


Note des membres
pas de note

Contributions > 20 - Trucs et Astuces

Détecter ‘MouseEnter’ dans une cellule d’une grille
# 0000000690
ajouté le 11/05/2009 15:48:47 et modifié le 11/05/2009
consulté 5218 fois
Niveau débutant

Version(s) Foxpro :
VFP 9.0


Le téléchargement des pièces jointes est limité aux membres
Veuillez vous identifier ou vous inscrire si vous n'avez pas encore de compte ...
Description

Détecter ‘MouseEnter’ dans une cellule d’une grille

Permet d’appeler une méthode ou une fonction quand la souris survole les lignes d’une colonne spécifiée

Il suffit d’ajouter un objet au parent de la grille (voir fonction GridCompanion_Add())

Apres, on peut spécifier la colonne + Expression de champ + méthode/fonction a appeler quand la souris change de cellule dans la colonne en question.

L’expression de champ ne doit pas être égale au ControlSource de la colonne, mais il n’y a rien qui l’empêche.

Exemple de code – voir aussi l’exemple – vers la fin de grid1.init()

local CompanionObj

 

do case

case !GridCompanion_Add(GridObjectReference, @m.CompanionObj)

      && error

case !m.CompanionObj.ColumnMouseWatcher_Add( ;

                        ControlSourceOfColumnToWatch, ;

                        FieldExpression, ;

                        FormMethod ;

                  )

      && error

 

endcase

 

GridObjectReference: = référence de la grille, eg m.this ou thisform.Grid1

CompanionObj: la référence du compagnon est retournée et peut être utilisée ensuite pour ajouter des colonnes a ‘surveiller’

ControlSourceOfColumnToWatch: le controlSource de la colonne à ‘surveiller’.  Puisqu’il n’est pas toujours facile de passer le numéro de colonne ou le nom de la colonne, le controlSource suffit.

FieldExpression: par exemple le controlSource de cette colonne, le controlSource d’un champ du RecordSource de la grille, ou toute autre expression (eg Table1.Montant / 2)

FormMethod: nom d’une méthode du form, ou nom d’une fonction.  Cette méthode/fonction sera appelée avec la FieldExpression correspondante ( eg eval(Table1.Montant / 2) )

 

Quand on lance l'exemple il faut regarder le contenu des textbox en haut quand on survole les boutons de commande avec la souris.

Une colonne surveillée peut être supprimée de la ‘surveillance’ : voir ColumnMouseWatcher_Remove(ControlSourceOfColumnToWatch)

 

Comment est-ce que cela marche ?

Une expression DynamicFontShadow est ajoutée à la colonne.  Quand cette expression est évaluée, la FieldExpression évaluée est ajoutée à une collection (par colonne)

Les clauses dynamiques sont évaluées de gauche à droite et de haut en bas.

Pour garder le contenu de la collection synchronisé avec ce qui est affiché dans la grille, il faut, a certains moments (événements) supprimer le contenu de la collection et remplir la collection par âpres.  Une façon de  remplir le contenu de la collection est de forcer l’évaluation de la clause DynamicFontShadow.  Ceci se fait en modifiant la hauteur de la grille (j’ajoute 1 a la hauteur, la prochaine fois -1, …)

Il y a assez de BindEvent()

Code source :
Voir exemple dans le zip
Commentaires
le 14/05/2009, eddymaue a écrit :
salut Greg, j'ai essayé ton prog et tout ce qui manquait c'est ca dans le load

* By Eddy Maue
Local lcPathOfThisFile As Character
m.lcPathOfThisFile =JUSTPATH(SUBSTR(SYS(16),IIF(SYS(16)="PROCEDURE",At(":",Sys(16))-2,1)))
Set Procedure To (m.lcPathOfThisFile+'\gridcompanion.prg')

a+ et bonne soirée

en passant moi je place un container invisible sur la surface de la grille et j'utilise le GridHittest. Le résulat est le meme que toi. C'est simplement une facon différente de faire

le 15/05/2009, eddymaue a écrit :
Greg tu peux mettre

Local lcPathOfThisFile As Character
m.lcPathOfThisFile =JUSTPATH(SUBSTR(SYS(16),IIF(SYS(16)="PROCEDURE",At(":",Sys(16))-2,1)))

ou tu veux dans une procedure comme en début d'un fichier.prg ou dans une procedure de classe. T'auras toujours l'emplacement exacte du fichier sur le disque.

pour ce qui est d'utiliser un conteneur invisible, le GridHitTest remseigne sur la position exacte de la grille. Ce qui fait qu'avec un click sur le conteneur, je peux faire un click par programation sur la grille.. Ca fait longtemps que je n'ai fait de contrib, je vais en faire une avec ce sujet

a+

le 16/05/2009, eddymaue a écrit :
Avec le Temps, Vfp m'a forcer adopter une structure régide pour le développement de mes projets.Et j'imagine qu'on a tous une structure similaire.
La forme peux changer mais il nous faut la respecter d'un bout à l'autre d'un projet. Ne serait ce que la commande #include UnFichier.h. Les fichiers
d'entêtes ont toujours un emplacement relatif au fichier qui les appels. Le casse tête vient de là en ce qui me concerne.
Ce qui m'a forcé à adopter une structure rigide dans mes répertoires.

Racine\
commun\
headers\
images\
exemples\
Gregory Adams\
MouseEnterForGrid\
Jean Maurice\

vfpX\
projet1
data\
dataTest\
fichiers\
projet1\
data\
dataTest\
fichiers\
projetX\
data\
dataTest\
fichiers\

Mon set default to est sur le répertoire Racine
comme ca si je fais .\Projet1\data\NomDeLaTable Forcément j'ouvrirai la bonne table.
Conséquamment je sais ou sont mes classes communes, mes classes de mon projets,
mes formulaires, mes headers commnuns et mes headers de mon projet.

Ton exemple je l'ai déposé dans Racine\exemples\Gregory Adams\MouseEnterForGrid\.
C'est certain que toi tu ne sais pas ou j'ai placé sur mon disque ton exemple.

Ce n'est pas important que tu le saches. J'imagine, sauf erreurs, que c'est le
cas pour tous parce qu'on a nos structuress et notre façon de fonctionner.

Mais il y a une chose de sure pour tous et pour moi c'est une certitude. Quand
tu nous livres un exemple, je n'ai pas le goût de commmencer à structurer ton exemple.
J'ouvre le zip, je le dépose dans un répertoire et je l'exécute à partir de Vfp.

Ce qui fait que si tu ne fais pas les liaisons entre les différents intervernants de ton
exemple, à savoir les headers, les classes, les formulaires, les fichiers de procedures, les progs et autres.
Ben ca plante.


De la ma méthode simple et je corrige au passage le tir sur la récupéraition du répertoire
d'ou est localisé l'exemple

donc ce que je fais dans le Load ou au début d'un exemple

Local lcGetPathOfThisFile && le chemin de ce fichier
lcGetPathOfThisFile = JustPath(Substr(Sys(16),At(":",Sys(16))-1))

Donc c'est facile de faire

Set Procedure To (lcGetPathOfThisFile +"\MesProcedures.prg")

parce que lcGetPathOfThisFile = e:\projet visual foxpro\exemple\Gregory Adams\MouseEnterForGrid\
et comme je dézip tout à cet emplacement, lcGetPathOfThisFile positionnera tous les fichiers dépendants.

a+ Eddy


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2020.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3