Comment creer dynamiquement un objet

Comment creer dynamiquement un objet - VB/VBA/VBS - Programmation

Marsh Posté le 06-08-2002 à 11:00:30    

je souhaiterai pouvoir créer un Label (par exemple) directement a partir du code, sans passer par l'étape de dessin sur le formulaire. J'emploi ce code, mais j'ai obtien une erreur de variable non définie
 

Code :
  1. Private Sub Form_Initialize()
  2.   Dim Lb As Label
  3.   Lb.Left = 0
  4.   Lb.Width = 1000
  5.   Lb.Height = 500
  6.   Lb.Caption = "ceci est un test"
  7. End Sub


 
que ce soit dans form_initialize(), ou form_load(), j'ai toujour le meme probleme...  :heink:


Message édité par ioio le 06-08-2002 à 11:02:21
Reply

Marsh Posté le 06-08-2002 à 11:00:30   

Reply

Marsh Posté le 06-08-2002 à 15:25:47    

essaye sur www.vbfrance.com  !

Reply

Marsh Posté le 06-08-2002 à 15:43:12    

Utilise plutot load et unload.

Reply

Marsh Posté le 06-08-2002 à 15:53:51    

Kyle_Katarn a écrit a écrit :

Utilise plutot load et unload.




 
ce n'est pas un problème d'emplacement et d'évement, c'est un problème dans le code,  
 
ERREUR D'EXECUTION 91 VARIABLE OBJET OU VRAIABLE BLOC WITH NON DEFINI
 
 
je viens de le tester, maintenant il faut trouver l'erreur ! ;)

Reply

Marsh Posté le 06-08-2002 à 17:13:42    

macray a écrit a écrit :

 
 
ERREUR D'EXECUTION 91 VARIABLE OBJET OU VRAIABLE BLOC WITH NON DEFINI
 
je viens de le tester, maintenant il faut trouver l'erreur ! ;)




 
le probleme est surtout qu'il manque quelque chose, mais quoi ...

Reply

Marsh Posté le 06-08-2002 à 17:14:52    

euh , jvais peut etre me gourrer, mais l'erreur n'est elle pas évidente ?!?
 
y a pas d'allocation d'objet dans le code présenté dans le topic
 
il manque pas un "Set" non ?!?

Reply

Marsh Posté le 06-08-2002 à 17:20:00    

non, c'est inutile, parfois, il ne le faut pas ! ;)

Reply

Marsh Posté le 06-08-2002 à 17:33:19    

bon toujours sans chercher en fesant un exemple mais en creusant dans ma ptite caboche : je dirais qu'il faut l'ajouter à la collection de controle de la form en cours ?
 
(pasque bon fo bien dire à un moment ou à un autre que le label que l'on créé est enfant de la form en cours)
 
de plus l'ajout dans la collection renvoi un objet de type controle mais instancié lui (d'où le "pas besoin du set" )
 
euh yabon ?

Reply

Marsh Posté le 07-08-2002 à 09:43:52    

ioio a écrit a écrit :

je souhaiterai pouvoir créer un Label (par exemple) directement a partir du code, sans passer par l'étape de dessin sur le formulaire. J'emploi ce code, mais j'ai obtien une erreur de variable non définie
 

Code :
  1. Private Sub Form_Initialize()
  2.   Dim Lb As Label
  3.   Lb.Left = 0
  4.   Lb.Width = 1000
  5.   Lb.Height = 500
  6.   Lb.Caption = "ceci est un test"
  7. End Sub


 
que ce soit dans form_initialize(), ou form_load(), j'ai toujour le meme probleme...  :heink:




 
 
tu dois créer une groupe de label genre tableau de label ensuite tu fais ca :
 

Code :
  1. for i = 1 to (autant que tu veux)
  2. load lb(i)
  3. lb(i).visible=true
  4. lb(i).top =1200 ...
  5. next i


 
sachant que lb(0) doit se trouver sur ta feuille...
 
si tu ne ve le veux pas
tu le mets en invisible...
 
voila


---------------
Je Suis En Phase Creative...
Reply

Marsh Posté le 08-10-2003 à 13:45:38    

Styx0 a écrit :

bon toujours sans chercher en fesant un exemple mais en creusant dans ma ptite caboche : je dirais qu'il faut l'ajouter à la collection de controle de la form en cours ?
 
(pasque bon fo bien dire à un moment ou à un autre que le label que l'on créé est enfant de la form en cours)
 
de plus l'ajout dans la collection renvoi un objet de type controle mais instancié lui (d'où le "pas besoin du set" )
 
euh yabon ?


 
[:meganne]
 
j'ai axactement le meme probleme..  
tu as trouvé?

Reply

Marsh Posté le 08-10-2003 à 13:45:38   

Reply

Marsh Posté le 08-10-2003 à 14:13:57    

bon
 
1) au moment du Form_Initialize et du Form_Terminate, l'interface visuelle n'existe pas. Donc pas la peine d'essayer de créer un contrôle à ce moment là. Enfin ça marchera peut-être mais parce que le Form_Load aura été forcé. Faites donc ces opérations dans les Load et Unload, ils sont prévus pour ça.
2) Set moncontrole = Controls.Add("nom_du_controle", "type_de_controle" )
3) moncontrole.Move(mes coordonnées)
4) moncontrole.Visible = True
 
Je crois que c'est tout.
 
Au moment du Unload:
1) Set moncontrole = Nothing
2) Controls.Remove("nom_du_controle" )
 
Edit: en fait il n'est pas utile de garder la référence à moncontrole pendant toute la vie de la form, elle est surtout nécessaire pour l'initialisation. Après vous en faites ce que vous voulez. Par contre, le Controls.Remove est indispensable au moment de l'Unload histoire de garder une gestion propre des ressources.


Message édité par drasche le 08-10-2003 à 14:15:30
Reply

Marsh Posté le 08-10-2003 à 14:25:25    

drasche a écrit :

bon
 
1) au moment du Form_Initialize et du Form_Terminate, l'interface visuelle n'existe pas. Donc pas la peine d'essayer de créer un contrôle à ce moment là. Enfin ça marchera peut-être mais parce que le Form_Load aura été forcé. Faites donc ces opérations dans les Load et Unload, ils sont prévus pour ça.
2) Set moncontrole = Controls.Add("nom_du_controle", "type_de_controle" )
3) moncontrole.Move(mes coordonnées)
4) moncontrole.Visible = True


 
 :jap:  
 
 
faut pas déclarer moncontrole?
quelle est la difference entre moncontrole et "nom_du_controle"

Reply

Marsh Posté le 08-10-2003 à 14:48:43    

moncontrole doit bien entendu être déclaré As Control (j'aurais dû le préciser, tu as raison).
"nom_du_controle" est un identifiant unique pour le contrôle dans la collection des contrôles, et que tu dois à nouveau utiliser pour le détruire. Quand au type_de_controle, il vaut mieux mettre le projet en préfixe, par exemple: VB.TextBox. Si le contrôle fait partie de ton projet (donc un usercontrol créé par toi, alors ce sera le nom de ton projet.


Message édité par drasche le 08-10-2003 à 14:49:18
Reply

Marsh Posté le 08-10-2003 à 15:07:13    

je capte que dalle.. ça marche pas.. y a surrement un probleme dans l'ordre des arguments.. :)  
 
par contre j'ai essayé ça :
 

Code :
  1. Private Sub Form_Load()
  2. Set ControleDynamique = Me.Controls.Add("VB.TextBox", "unNomAuPif" )
  3. ControleDynamique.Move 1000, 1000, 2000, 70
  4. ControleDynamique.Visible = True
  5. End Sub


 

Code :
  1. Option Explicit
  2. Dim WithEvents ControleDynamique As VB.TextBox


 
et ça rulz.. :)  
 
 
edit: par contre ce putain de TabString il veut pas me le prendre.. faut surrement l'integrer au projet.. comment faire?


Message édité par Mr yvele le 08-10-2003 à 15:08:37
Reply

Marsh Posté le 08-10-2003 à 15:08:01    

t'as inversé le nom du contrôle et le type :o

Reply

Marsh Posté le 08-10-2003 à 15:09:05    

drasche a écrit :

t'as inversé le nom du contrôle et le type :o


 
oui..  :)  
j'ai édité, mais apres que tu ais posté!  :p
 
edit: merci au fait :jap:


Message édité par Mr yvele le 08-10-2003 à 15:13:15
Reply

Marsh Posté le 08-10-2003 à 15:17:16    

meme si j'ajoute un TabStrip à la main sur la Form ça marche pas.. :o
bordail
 
par contre ça :
 

Code :
  1. Option Explicit
  2. Dim WithEvents ControleDynamique As TabStrip


 
ça passe :o


Message édité par Mr yvele le 08-10-2003 à 15:24:24
Reply

Marsh Posté le 08-10-2003 à 15:58:43    

hop j'ai touvé!  :o  
 

Set ControleDynamique = Me.Controls.Add("Comctl.tabstrip.1", "tabStripName" )


 
faut que je passe par Comctl.tabstrip.1
 
 
donc bon.. ça marche.. mais pas trop.. maintenant il me demande une chaine de licence pour mon composant.. :/
 
heu......... drasche!!  :whistle:
 
edit : Licenses.Add "Comctl.tabstrip.1", "heu.." (ça marche pas..)


Message édité par Mr yvele le 08-10-2003 à 16:02:25
Reply

Marsh Posté le 08-10-2003 à 16:07:32    

Pour la license c'est :dtc: parce que c'est un truc qui s'installe avec VB normalement. T'as quelle version? Si c'est l'étudiant , le contrôle n'est sûrement pas fourni avec :/
 
En gros la license t'empêche d'utiliser le contrôle au design time mais je vois pas pourquoi tu pourrais pas au runtime, sans doute parce que tu es en mode debug. Essaie de compiler ton truc puis de lancer l'exe pour voir ce qu'il te dit.


Message édité par drasche le 08-10-2003 à 16:08:27
Reply

Marsh Posté le 08-10-2003 à 16:18:25    

j'ai generé le .exe mais il veut pas!!  :cry:  
 
pourtant dans la msdn y a ecrit que si on a le composant dans la boitie à outils, il ne devrait pas demander de licence key..
 
je l'utilise en le posant sur la form.. alors pourquoi je pourrai pas le créer dynamiquement..  [:mcwimpy4]

Reply

Marsh Posté le 08-10-2003 à 16:25:24    

alors là je peux t'assurer que la MSDN se trompe :D
 
tu peux très bien l'avoir dans ta toolbox et avoir le message d'insultes causant de la license, j'en ai fait l'expérience quand j'ai débuté en VB :ange:
 
En fait si tu peux le poser sur la form, je vois pas l'intérêt (pour un TabStrip) de l'allouer dynamiquement :??:

Reply

Marsh Posté le 08-10-2003 à 16:30:14    

drasche a écrit :

alors là je peux t'assurer que la MSDN se trompe :D
 
tu peux très bien l'avoir dans ta toolbox et avoir le message d'insultes causant de la license, j'en ai fait l'expérience quand j'ai débuté en VB :ange:


 
ah? [:mcwimpy4]  
 

drasche a écrit :


En fait si tu peux le poser sur la form, je vois pas l'intérêt (pour un TabStrip) de l'allouer dynamiquement :??:


 
pour le sport..  :sol:  
et surtout pour faire plus propre.. bref.. je vais la poser sur la form.. c'est clair que ça va pas changer grand chose..
 
enfin bref.. ça m'a bien aidé à comprendre VB mirci :)

Reply

Marsh Posté le 08-10-2003 à 16:37:28    

euh pour faire plus propre, rien de mieux que la poser sur la form hein ;)  Les contrôles dynamiques, c'est plutôt quand tu sais pas à l'avance combien tu en auras (et une interface avec un tableau de TapStrips, ça doit être particulièrement dégueu :D)

Reply

Marsh Posté le 08-10-2003 à 16:39:55    

hum.. rien de mieux qu'un tableau de tabstrip.. si ce n'est un tabstrip de tabstrips!  :D  
 
bref.. moi je vais me mettre au .NET, harko m'a motivé!  :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed