besoin d'aide pour creation textbox et label en dynamique

besoin d'aide pour creation textbox et label en dynamique - VB/VBA/VBS - Programmation

Marsh Posté le 29-05-2007 à 13:25:17    

Bonjour à tous,
je suis un petit nouveau dans le monde de VB ( 3 mois d'ancienneté alors je ne connais pas toutes les ficelles du métier et là je crois que j'ai besoin df'aide parce que je suis comme on dit un peu perdu)  
 
J'utilise VB avec CATIA en faisant de la macro pour creer une aorte abdominale
 
Ce que je souhaite faire : créer un formulaire dynamique contenant un nombre de lignes spécifiées. chaque ligne correspond à un cercle avec son centre, son rayon, et l'épaisseur de la paroi de l'aorte entre cercles "capa".  
 
voici ce que j'ai fait jusqu'à présent (je pose directement le code ca sera plus parlant) comme ça avec un copier/coller vous pourrez tout de suite voir ce que ça donne.
 
 
Dans un form qui s'appelle definicion_mano
creer a la main 3 boutons commandes comme sur l'image
command1=creación
command2=OK
command3 =cancelar
 
2 textbox
textbox1 fera reference à cantidad  
et textbox2 fera ref à distancia (non utilisé pour l'instant)
 
et 4 label au dessus de chaque colonne créée
radio
excentricidad Y
excentricidad Z
espesor
 
 
'--------------------------------------
'L'UserForm doit préalablement contenir un bouton nommé CommandButton1
Option Explicit
 
Private Sub CommandButton1_Click()
 
cantidad = Replace(definicion_mano.TextBox1.Value, ".", "," )
 
Dim capa As Control
Dim rad As Control
Dim excenY As Control
Dim excenZ As Control
Dim espe As Control
Dim i As Integer
 
'--------------------------------------------------------------------------
For i = 1 To cantidad 'boucle pour la création des label capa
    Set capa = definicion_mano.Controls.Add("forms.Label.1" )
    With capa
        .Name = "capa" & i - 1
        .Object.Caption = "capa" & i - 1
        .left = 90
        .top = 18 * i + 5
        .width = 60
        .height = 20
    End With
 
 
Next i
'----------------------------------------------------------------------------
 
 
For i = 1 To cantidad 'boucle pour la création des textbox radio
    Set rad = definicion_mano.Controls.Add("forms.TextBox.1" )
    With rad
        .Name = "textrad" & i - 1
        .left = 138
        .top = 18 * i + 5
        .width = 40
        .height = 20
    End With
     
Next i
 
For i = 1 To cantidad 'boucle pour la création des textbox exc Y
    Set excenY = definicion_mano.Controls.Add("forms.TextBox.1" )
    With excenY
        .Name = "textexcY" & i - 1
        .left = 203  '(11 de plus que label.left)
        .top = 18 * i + 5
        .width = 40
        .height = 20
    End With
Next i
 
For i = 1 To cantidad 'boucle pour la création des textbox exc Z
    Set excenZ = definicion_mano.Controls.Add("forms.TextBox.1" )
    With excenZ
        .Name = "textexcZ" & i - 1
        .left = 275 '(11 de plus que label.left)
        .top = 18 * i + 5
        .width = 40
        .height = 20
    End With
Next i
 
For i = 1 To cantidad - 1 'boucle pour la création des textbox espesor
    Set espe = definicion_mano.Controls.Add("forms.TextBox.1" )
    With espe
        .Name = "textespesor" & i - 1
        .left = 338  '4 de moins que label left
        .top = 18 * i + 15
        .width = 40
        .height = 20
    End With
Next i
 
End Sub
 
Private Sub CommandButton2_Click()
creation2 = "oui"
definicion_mano.Hide
End Sub
Private Sub CommandButton3_Click()
creation2 = "non"
definicion_mano.Hide
End Sub  
 
 
Dans un module avec n'importe quel nom
Sub CATMain()
definicion_mano.Show
    If creation2 = "oui" Then
Else
    MsgBox "comando cancelado por el usuario", vbOKOnly, "Error"
End If
End Sub
 
Dans un autre module avec n'importe quel nom
Option Explicit
Public creation2 As String
Public cantidad As Double
 
maintenant que je viens de poser mon code, voici ce qu'il faut faire pour l'utiliser: ecrire une valeur dans la textbox1 et cliquer sur creación
un nombre de lignes avec capaX se creer.
 
maintenant passons aux questions et problèmes:
 
   si je lance deux fois de suite mon prog la valeur entrée la preñiere fois reste et mon formulaire ne se reactualise pas automatiquement.(en particulier quand je veux mettre une valeur plus petite la seconde fois)
 
   Comment réutiliser les valeurs rentrées à la main dans mon formulaire afin de créer mon aorte dans CATIA (ne serait que savoir quoi mettre dans MsgBox pour retrouver la valeur renseigner par exemple pour radio de capa0).
 
   Et pour finir est ce que je pars sur la bonne voie bien ou pas? y a t'il une manière plus simple de faire cela?
   Vais-je être obligé d'utiliser un module de classe?
   
voilivoilou
 
Merci d'avance  
 
Fabientoupeti
ps:les noms sont  en espagnol parce que je suis en stage en espagne en ce moment, voilà vous savez tout.
 

Reply

Marsh Posté le 29-05-2007 à 13:25:17   

Reply

Marsh Posté le 29-05-2007 à 16:01:48    

Pfiuu, il y aurait beaucoup à dire. Mais chaque chose en son temps.
D'abord, pour information, tu pourrais faire tous tes ajouts de controls en une seule boucle pour peu que tu changes un peu la formule de nommage de ceux-ci (cantidad à utiliser en incrément). C'est un détail.
 
Ensuite, et sauf contraintes spécifiques, je ne ferais clairement pas comme toi. On verra après.
 
Si j'ai bien compris, quand tu lances la deuxième fois ton programme, il ne fait qu'ajouter encore de nouvelles zones, non ?
Le minimum serait, soit de supprimer les zones existantes et de tout recréer, soit de ne supprimer ou n'ajouter que ce qui est nécessaire pour compléter à la nouvelle quantité demandée par rapport à l'ancienne.
Dans les deux cas, il faut jouer avec la méthode .RemoveControl des UserForm VBA (à voir dans CATIA ?) ou la méthode .Remove de la collection .Control de ton formulaire.
 
Si ton control TextBox est nommé "capa01" alors sa valeur est lisible par MsgBox capa01.text (capa01.value marche aussi)
 
Enfin, non je ne crois pas que tu partes dans la bonne direction (mais nous n'avons pas tous les détails) mais dans une direction qui devrait quand même t'amener à ton but.
 
Personnellement j'aurais gardé une interface avec un seul exemplaire de chaque zone de saisie.
J'aurais mis un control de liste quelconque dans lequel j'aurais stocké, ligne par ligne, chaque occurence d'aorte (1 ligne = 4 colonnes = 4 textbox).
Enfin tu ajoutes à cela un bouton qui permet de valider la saisie de tes 4 TextBox pour remplir la liste et un bouton pour valider la suppression de la liste d'une ligne sélectionnée.
Et là tu n'as plus à te soucier de la place à l'écran de tes zones, de leur création dynamique ni de leur nombre.
 
Je ne sais pas si j'ai été totalement clair, mais j'espère que ça t'aidera un peu.

Reply

Marsh Posté le 30-05-2007 à 14:16:42    

bonjour et tout d'abord merci tegu pour ta réponse.
 
alors j'ai pu régler un problème celui de la modification du nombre de lignes qui apparaisse dans mon formulaire.
j'ai crée un bouton de commande et est ecrit:
 
Private Sub CommandButton4_Click()
Unload definicion_mano 'déchargement des modifications apportées à la userform
definicion_mano.Show
End Sub
merci à la personne qui m'a donné ce tuyau.
 
par contre pour ce qui concerne la recuperation des valeurs de mes Textbox je n'y parviens pas, et je ne vois pas comment faire. j'ai essayé pas mal de truc mais la seule chose que je parviens a faire c'est recuperer le valeur de la derniere textbox en ecrivant MsgBox rad.value
 
voici le bout de programme
For i = 1 To cantidad 'boucle pour la création des textbox radio
    Set rad = definicion_mano.Controls.Add("forms.TextBox.1" )
    With rad
        .Name = "textrad" & i - 1
        .left = 138
        .top = 18 * i + 5
        .width = 40
        .height = 20
        .Value = i
    End With
Next i
 
Quand j'ecris Msgbox textrad0 ou Msgbox textrad1 ou un autre chiffre j'ai un message d'erreur. peut etre que j'oublie une chose essentielle plus grosse que moi???
 
quelqu'un aurait-il une piste pour moi? parce que là je commence à désespérer
 
Merci d'avance pour vos réponses
 
fabientoupeti
 
 

Reply

Marsh Posté le 30-05-2007 à 15:04:46    

Bonjour
Tu peux parcourir la collection de controles, sélectionner ceux dont le nom commence par "textrad" et ensuite récupérer la valeur.

Reply

Marsh Posté le 31-05-2007 à 11:50:42    

merci beaucoup paul hood,  
grâce à ton aide je pense avoir solutionner mon problème...jusqu'au suivant!
 
merci encore
 
voici ce que j'ai fait, (si ça peut aider quelqu'un):
 
For Each rad In definicion_mano.Controls
If rad.Name = "textrad0" Then
'MsgBox rad.Name
MsgBox "la valeur de " & rad.Name & " est : " & rad.Value
ra0 = rad.Value
End If
Next rad
MsgBox ra0
 
et avec ça je recupere la valeur de textrad0 que je stocke dans ra0 et comme ça la réutilisation est possible.
 
 
fabientoupeti

Reply

Marsh Posté le 31-05-2007 à 14:52:27    

La tu ne récupéres la valeur que pour textrad0.
Tu peux faire un
   if rad.Name like "textrad*" then
pour récupérer toutes les valeurs de tes Textbox

Reply

Marsh Posté le 04-06-2007 à 09:11:11    

Merci beaucoup paul hood pour ton suivi de mes avantures!
 
en fait j'avais poster cet exemple pour montrer la demarche general pour recuperer une valeur.
Ce que j'ai fait pour recuperer toutes les valeurs j'ai defini une liste avec une taille de 1000(normalement ce nombre ne pourra jamais etre atteint pour mon application) au debut de mon programme et j'ai utilisé une boucle for en faisant varier l'indice de ra et de textrad.
 
Comme je suis là pour apprendre, j'ai une petite question: quelle est la difference entre ta methode et celle que j'ai utilisé. Faut il éviter l'utilisation des boucles for par exemple?
 
merci beaucoup pour vos aides
 
Fabientoupeti

Reply

Sujets relatifs:

Leave a Replay

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