Ajouter dynamiquement un control dans un form

Ajouter dynamiquement un control dans un form - VB/VBA/VBS - Programmation

Marsh Posté le 18-07-2003 à 15:56:33    

Salut à tous,
 
je voudrais pouvoir créer de controls dynamiquement dans un form mais je ne connais pas à l'avance le nombre de controls à creer.
 
Il s'agit de text box. Quelle est la procédure pour créer des control depuis le code vba ?
 
J'ai d'abord penser à qq chose comme

Code :
  1. dim NewControl as control
  2. Set new control as .....
  3. forms("abcd" ).controls.add new control


 
mais visiblement ça ne fonctionne pas.
 
Si qq'un a une suggestion., elle est la bienvenue.


---------------
« Lorsque le bûcheron pénétra dans la forêt avec sa hache, les arbres se dirent : ne nous inquiétons pas, le manche est des nôtres. » | Gérez votre collection de BD en ligne !
Reply

Marsh Posté le 18-07-2003 à 15:56:33   

Reply

Marsh Posté le 18-07-2003 à 16:10:56    

Bah, plus la peine de chercher, j'ai trouvé.
 
Pour ceux que ça interesse, voila un exemple de code :
 
CreateControl, CreateReportControl Methods Example
 
The following example first creates a new form based on an Orders table. It then uses the CreateControl method to create a text box control and an attached label control on the form.
 

Code :
  1. Sub NewControls()
  2.     Dim frm As Form
  3.     Dim ctlLabel As Control, ctlText As Control
  4.     Dim intDataX As Integer, intDataY As Integer
  5.     Dim intLabelX As Integer, intLabelY As Integer
  6.     ' Create new form with Orders table as its record source.
  7.     Set frm = CreateForm
  8.     frm.RecordSource = "Orders"
  9.     ' Set positioning values for new controls.
  10.     intLabelX = 100
  11.     intLabelY = 100
  12.     intDataX = 1000
  13.     intDataY = 100
  14.     ' Create unbound default-size text box in detail section.
  15.     Set ctlText = CreateControl(frm.Name, acTextBox, , "", "", _
  16.         intDataX, intDataY)
  17.     ' Create child label control for text box.
  18.     Set ctlLabel = CreateControl(frm.Name, acLabel, , _
  19.          ctlText.Name, "NewLabel", intLabelX, intLabelY)
  20.     ' Restore form.
  21.     DoCmd.Restore
  22. End Sub


---------------
« Lorsque le bûcheron pénétra dans la forêt avec sa hache, les arbres se dirent : ne nous inquiétons pas, le manche est des nôtres. » | Gérez votre collection de BD en ligne !
Reply

Marsh Posté le 19-07-2003 à 12:41:40    

tu peux faire plus simple en donnant à un contrôle un index (0 par exemple)  au moment de la création ;
 
Puis dans ton code, tu met  
 
 

Code :
  1. load TonControle(1)
  2. TonControle.visible = true


 
Tu obtient comme ça un contrôle similaire à ton premier :)

Reply

Marsh Posté le 19-07-2003 à 12:52:21    

latruffe a écrit :

Code :
  1. dim NewControl as control
  2. Set new control as .....
  3. forms("abcd" ).controls.add new control




sisi ça fonctionne parfaitement bien, c'est juste que le code est mal foutu.
 
Exemple de création d'une combobox:
 

Code :
  1. Dim WithEvents ctlCombo as VB.ComboBox
  2. ...
  3. Set ctlCombo = Controls.Add("VB.ComboBox", "ctlCombo" )
  4. ctlCombo.Move 10, 10
  5. ctlCombo.Visisble = True


Ce que tu dois retenir:
Ce code ne marche que dans un conteneur de contrôles (Form, UserControl).
* la clause WithEvents permet de capter les évènements émis par ton contrôle, tout comme la form, etc...
* Le contrôle ne peut être créé que par la méthode Add de la collection Controls, qui est une propriété de l'objet conteneur, donc le code ne peut fonctionner que dans une Form ou un UserControl. Important: le premier paramètre à Add est toujours le type du contrôle précédé de la librairie à laquelle il appartient (donc VB.ComboBox) et le second paramètre est un identifiant unique dans la collection (tu ne peux utiliser 2x le même).
* le Move, tu en fais ce que tu veux, ton contrôle n'est pas positionné par défaut dans la fenêtre.
* de même, un contrôle est toujours invisible quand tu le crées, il convient donc de le rendre visible.
 
Pour le retirer lors de la destruction du conteneur:

Code :
  1. Set ctlCombo = Nothing
  2. Call Controls.Remove("ctlCombo" )


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Sujets relatifs:

Leave a Replay

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