IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Comment ajouter dynamiquement des contrôles dans une form ?
Vous avez plusieurs solutions possibles. La première est de poser un contrôle sur la form et de lui donner un index, par exemple 0. Pour créer les autres contrôles à l'exécution, il faut les charger avec Load, les positionner, puis les rendre visibles. Vous pouvez ensuite détruire ces contrôles avec Unload. Pour tester l'exemple suivant, placez un textbox sur une form et donnez-lui l'index 0. Ces quelques lignes font apparaître 9 autres textbox :
Dim i As Long
For i = 1 To 9 
    Load Text1(i)
    Text1(i).Top = Text1(i - 1).Top + Text1(0).Height + 60
    Text1(i).Visible = True
Next
Vous pouvez ensuite les détruire :
Dim i As Long
For i = 1 To 9
    Unload Text1(i)
Next
Une autre façon de procéder consiste à ajouter un élément à la collection Controls de la form. Auparavant il faut avoir déclaré votre contrôle dans la partie Déclarations du module de la form. Une fois la déclaration ajoutée, vous pourrez sélectionner votre contrôle dans la liste déroulante au-dessus de l'éditeur de code, comme si le contrôle avait été posé sur la form. Exemple pour un textbox :
Dim WithEvents TextBoxDynamique As VB.TextBox
Nous pouvons alors créer le contrôle, le placer, le dimensionner et le rendre visible :
Set TextBoxDynamique = Me.Controls.Add("VB.TextBox", "txtDynamic")  'txtDynamic est le nom du textbox
TextBoxDynamique.Left = 2000
TextBoxDynamique.Top = 1000
TextBoxDynamique.Width = 1500
TextBoxDynamique.Height = 70
TextBoxDynamique.Visible = True

Comment empêcher la fermeture d'une form ?
Quand la fermeture d'une form a été demandée, elle reçoit l'évènement QueryUnload. Dans l'exemple suivant, la form ne se ferme pas, sauf si la demande de fermeture est due à la commande Unload :
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If UnloadMode <> vbFormCode Then Cancel = 1
End Sub

Comment désactiver le bouton de fermeture sur une form ?
Placez tout d'abord ces déclarations dans le module de la form :
Private Const SC_CLOSE = &HF060&
Private Const MF_BYCOMMAND = &H0&

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, _
    ByVal wFlags As Long) As Long
Puis ces quelques lignes dans la procédure Form_Load :
Dim hSysMenu As Long
hSysMenu = GetSystemMenu(Me.hwnd, False)
RemoveMenu hSysMenu, SC_CLOSE, MF_BYCOMMAND

Comment faire pour que ma form soit toujours au premier plan ?
Ajoutez ces déclarations dans le module de votre form :
Private Const SWP_NOMOVE = 2
Private Const SWP_NOSIZE = 1
Private Const HWND_TOPMOST = -1
Private Declare Function SetWindowPos Lib "USER32" (ByVal hwnd As Long, _
    ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _
    ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Et placez cette ligne dans la procédure Form_Load :
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE

Comment savoir quelles forms sont chargées en mémoire ?
Elles sont dans la collection Forms. Ainsi cette boucle décharge toutes les forms :
Dim f As Form
For Each f In Forms
    Unload f
Next

Comment redimensionner les contrôles quand la form est redimensionnée ?
Placez ce code source dans le module de votre form. Le principe consiste ici à déplacer et redimensionner les contrôles afin qu'ils soient disposés de la même façon. Ainsi si la form a subit un agrandissement de 4 * 3, toutes les distances sont multipliées par les mêmes facteurs.
Une autre méthode, plus souvent utilisée, consiste à agrandir seulement les contrôles principaux, et à garder les mêmes dimensions pour les contrôles plus petits (boutons, listes déroulantes, etc...). Mais dans ce cas un code source spécifique doit être écrit pour chacune de vos forms.
Dim lar As Long, lng As Long

Private Sub Form_Load()

lng = Me.Width
lar = Me.Height

End Sub

Private Sub Form_Resize()

Dim ctl As Control

If (Me.WindowState = 1) Then Exit Sub

For Each ctl In Me.Controls
    If TypeOf ctl Is ComboBox Then
        ctl.Move ctl.Left * Me.Width / lng, ctl.Top * Me.Height / lar, ctl.Width * Me.Width / lng
    Else 
        'Les comboboxes ont leur propriété Height en lecture seule
        ctl.Move ctl.Left * Me.Width / lng, ctl.Top * Me.Height / lar, _
           ctl.Width * Me.Width / lng, ctl.Height * Me.Height / lar
    End If
Next

lng = Me.Width
lar = Me.Height

End Sub


Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduit en français ici.
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.