|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 41 ![]() |
Bonjour à tous,
Pour un projet, j'ai besoin de modéliser visuellement des emplacement des étagères afin de gérer leurs contenues. Pour faire simple disant que mon étagère est un tableau 3x3. Donc, dans un formulaire, j'ai insérer 9 contrôle appeler Emp_1 > Emp_9. J'ai accoté de ca, une table avec 9 enregistrements, dans lequel j'ai référencer un champ appeler "ITEM", dans lequel je met le nom de mes contrôles. ACTUELLEMENT : Quand un utilisateur veux rangé un élément dans un emplacement, il clique sur un des contrôle pour y affecter qqc (un livre, un jouet, ...) comme j'ai créer un contrôle pour chaque CURSOR de ma table, pas de soucis. Imaginons que je met un objet dans le premier emplacement de l'étagère : Code :
DEMANDE : Est il possible de faire une macro qui puisse gérer la situation ? C'est à dire, reconnaître que le contrôle 128 (par exemple) viens de recevoir le focus et qu'il faudra opérer sur le CURSOR 128 de la table. Sans avoir besoin de copier/coller 200 la précédente macro. |
||
|
|
00
|
|
|
#2 |
|
Nouveau Membre du Club
![]() Inscription : novembre 2010 Messages : 105 ![]() |
Je pense que c'est possible sans macro mais en vba: cherche du côté des boucles "For".
|
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 41 ![]() |
|
|
|
00
|
|
|
#4 |
|
Membre émérite
![]() ![]() Lanza Bertucci-DomergueDéveloppeur informatique Inscription : juin 2007 Messages : 937 ![]() |
Tu veux mettre 200 contrôles sur ton formulaire ?
J'ai une idée pour gérer ta "grande étagère", tu me diras ce que tu en penses. Une table dans laquelle tu auras 200 enregistrements correspondant à tes 200 "tiroirs". Il suffit d'avoir deux champs qui constitueront une clé primaire composée : - un champ X qui donnera l'abscisse ; - un champ Y qui donnera l'ordonnée. Avec les deux champs, tu as les coordonnées du "tiroir" un peu comme dans une matrice. Ensuite quand l'utilisateur veut voir le contenu du tiroir (125;32), il suffit d'une requête avec comme clause WHERE : Voilà ce que je peux proposer. |
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 41 ![]() |
Arf ! Je vous présente toutes mes excuses car je pense m'être mal exprimé. En fait pour la lecture je n'ai aucun problème.
J'ai procédé comme suis : Tous mes contrôle s'appelle , du coup pour lire, je retire le Emp_ et je faire un SELECT sur l'ID de mon enregistrement. Non mon problème est autre : Donc oui, j'ai 200 controles (243 pour être précis). je veux pouvoir exécuter la même instruction en VBA quelque soit le contrôle. Par exemple : 1) Je clique sur le controle 128 ==> Sa viens écrire une information dans un des champs de mon 128 CURSOR de ma table. En fait, je cherche une solution qui me fait pas faire 243 copier/coller de mon code avec justement changement du numéro de CURSOR. Un truc du genre : Quand je click sur Me.controle("Emp_" & i) alors tu fait un SELECT * FROM ma_table WHERE ma_table.ID =" & i & "" Est ce plus claire ? |
|
|
00
|
|
|
#6 |
|
Membre émérite
![]() ![]() Lanza Bertucci-DomergueDéveloppeur informatique Inscription : juin 2007 Messages : 937 ![]() |
Oui c'est un peu plus clair.
Si j'ai bien compris tu affiches un enregistrement différent suivant le bouton cliqué ? Tes 243 contrôles sont de quel type (bouton, zone de texte, zone de liste) ? |
|
|
00
|
|
|
#7 |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 41 ![]() |
Je n'ai pas encore décidé, si ce sera une zone de texte ou un labal car :
J'ai un code qui à l'ouverture du formulaire viens remplir mes 243 controles pour visualiser ce qui se trouve dans mon étagère et permettre de voir en directe les emplacement vide (d'où l'interet des 243 contrôle) pour faciliter l'utilisateur final (contrainte du projet). Du coup, quand l'utilisateur vas selectionner un contrôle (click ou reception focus à voir ce qui est plus pratique). Le code check pour voir si l'emplacement est vide ? Si oui : une inputbox apparait pour permettre à l'utilisateur la saisie de l'objet à insérer, puis inscrit l'objet dans le contrôle, puis viens valider l'enregistrement dans ma table. Si non : On indique à l'utilisateur que l'emplacement est occupé, en lui proposant le choix de retiré l'objet se trouvant dans l'emplacement. D'où le retour sur mes postes précedents. Et sur l'interrogation posé le type de contrôle. Je penser utiliser une zone de texte mais il faut pouvoir empecher l'insertion de valeur autre qu'en passant par les inputbox. ou bien des labels : L'utilisation de labals me parait plus elegante pour ce projet. seul hic, si le caption est vide, ca retire le controle du formulaire (du coup peut être indiquer (Vide) dans les emplacement vide). |
|
|
00
|
|
|
#8 |
|
Membre émérite
![]() ![]() Lanza Bertucci-DomergueDéveloppeur informatique Inscription : juin 2007 Messages : 937 ![]() |
Je ne crois pas qu'on puisse saisir une valeur dans un Label en mode formulaire.
Il est nécessaire pour l'utilisateur de pouvoir le faire non ? Si oui, il faut opter pour des TextBox. Pour empêcher la saisie dans un TextBox il suffit de mettre sa propriété Locked à True |
|
|
00
|
|
|
#9 | |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 41 ![]() |
Citation:
Code :
Me.controle(i).caption=inputbox("saisir un nom d'objet") |
|
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 049 ![]() |
Bonjour,
une idée serait d'encapsuler contrôle et événements dans une classe. tu n'auras de cette manière à écrire qu'une seule fois, le code. ou plus simplement de créer une fonction et de l'affecter à la propriété événement des contrôles. |
|
|
00
|
|
|
#11 | |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 41 ![]() |
Citation:
j'avais une idée, c'était de faire un formulaire dynamique avec CreateEventProc. Qu'en pensez vous ? Mais j'ai vu justement, que plutôt que d'utiliser cela, valais mieux utiliser des classes. Mais encore une fois, je ne sait pas faire ou du moins pas encore ... |
|
|
|
00
|
|
|
#12 | ||||
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 049 ![]() |
Bonjour,
dans un premier temps le plus simple serait de créer une fonction publique pour gérer l'événement GotFocus des contrôles. Ensuite, il suffit d'affecter cette fonction à chacun des contrôles, ce, soit via la fenêtre des propriétés-onglet événement. Sur réception focus : =nomdelafonction() ou via du code vba au chargement du formulaire : Ex: Pour l'exemple j'appelle la fonction GotFocus() Code :
Code :
|
||||
|
|
00
|
|
|
#13 |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 41 ![]() |
Ca à l'aire de correspondre, en tout cas la forme me plait bien.
Je teste sa dans la journée, si fonctionne ! Je t'envoie une bouteille de Champagne ![]() ![]()
|
|
|
00
|
|
|
#14 | |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 41 ![]() |
Bon, j'ai tester ton code, et je tombe sur erreur !
Citation:
|
|
|
|
00
|
|
|
#15 | ||
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 049 ![]() |
Bonjour,
l'erreur vient du fait qu'un des contrôles reçoit le focus avant que le formulaire ne soit visible à l'écran. Pour y remédier, tu peux modifier légèrement la fonction e manière à obtenir : Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com