Adresser control d'une form depuis module

Résolu
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016 - 3 avril 2013 à 18:06
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016 - 4 avril 2013 à 13:56
Bonjour,

avant tout chose je migre depuis VB6 (cela peut expliquer certaines choses ;-)

Depuis un module j'essai d'accéder à une forme qui est chargée et visible.
j'ai bien saisi qu'en vb.net je ne peux pas accéder aux control de la form directement.
j'ai donc créé une fonction

 
Public Sub Change_Shape(colorShape As Color)
        Me.Shape_Com.BackColor = colorShape
End Sub


qui est dans ma form
depuis mon module je fait :
 FormAcq.Change_Shape(Color.Green)


mais la couleur de la shape ne change pas.
si j'appel cette fonction depuis un bouton_click dans la form contenant la shape pas de soucis...

je précise que la fonction qui appel
 FormAcq.Change_Shape(Color.Green)


est elle même appelé par un évènement receive_data levé par un event du port com....
je pense qu'il y a quelque chose avec les thread mais je vois pas comment solutionner ça !!!

Merci pour vos lumière :-)

10 réponses

Bonjour got.

En vb 2010, j'arrive sans difficulté à changer la taille d'un contrôle PictureBox déposé sur le formulaire principal, et ce depuis un module.

Cordialement.


Étant illettré, je signe d'une croix : ×
0
Utilisateur anonyme
3 avril 2013 à 20:36
Bonjour,

Voici un exemple à adapter:
(Je n'ai pas VB sous la main pour des shapes)

Dim ContrôleTexte as textbox = Form1.textbox1
dim letexte as string = contrôletexte.text
0
Profil bloqué
3 avril 2013 à 23:51
bonsoir Got

Code dans le module :

Public Sub Change_Shape(colorShape As Color, Forme as Form)
Forme.Shape_Com.BackColor = colorShape
End Sub

Code dans la form FormAcq :

Change_Shape(Color.Green,FormAcq)

il faut passer la form en paramètre à l'appel ! piste à explorer



La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016
4 avril 2013 à 09:01
Merci pour la piste mais c'est pas plutôt l'inverse :

la sub dans la form et l'appel dans le module?

en tout cas dans
Public Sub Change_Shape(colorShape As Color, Forme as Form) 
Forme.Shape_Com.BackColor = colorShape 
End Sub 


Forme.Shape_Com.BackColor ne passe pas le compilateur car il ne connait pas Shape_com ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
4 avril 2013 à 09:44
Salut

j'ai l'impression qu'il y a un problème au niveau
du design
As tu besoin de passer par un module pour modifier un control de ta form
et tu dis
est elle même appelé par un évènement receive_data levé par un event du port com....

pourquoi pas directement dans l'évenement receive_data
0
Bonjour Got.

Je suis intervenu dans cette discussion parce que j'y ai vu
j'ai bien saisi qu'en vb.net je ne peux pas accéder aux control de la form directement

Or, je suis persuadé du contraire. Pour le prouver, j'ai créé et testé le programme suivant.
1) Le formulaire principal se nomme Accueil. J'y ai déposé un contrôle PictureBox nommé pBox, colorié en rouge.
2) J'ai créé un module nommé Appel, dans lequel j'ai écrit la procédure
    Public Sub Recolorier()
        Accueil.pBox.BackColor = Color.Blue
    End Sub

dans le but évident d'accéder au contrôle pBox du formulaire Accueil.
3) J'ai déclenché dans ce formulaire la procédure Recolorier par le code
    Private Sub Accueil_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Recolorier()
    End Sub

Au débogage, le contrôle PictureBox apparaît en bleu. Cela vous paraît-il probant ?

Cordialement.


Étant illettré, je signe d'une croix : ×
0
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016
4 avril 2013 à 10:09
Bonjour,

l’évènement receivedata est dans mon module qui en fait regroupe la plupart des fonctions.

Mais je ne pense pas que le probleme viennet du module.. mais plutot du fait que receive data ce lance dans un thread spécifique. du coup quand j'appel le changement d'un control sur la form cela charge une nouvelle instance de la forme et ne modifie pas la forme déjà chargée...



@zermelo : peut être il me semblait avoir lu Tapez le texte de l'url ici.

que cela était plus compliqué qu'en VB6 mais je n'ai pas encore fait ces tests...


Merci à tous..
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
4 avril 2013 à 13:36
Bonjour,

Pourriez vous faire cet essai par rapport à votre exemple de base
Remplacez
FormAcq.Change_Shape(Color.Green)


Par
CType(My.Application.OpenForms("FormAcq"), FormAcq).Change_Shape(Color.Green)


Si cela fonctionne, j'expliquerai en détail.
0
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016
4 avril 2013 à 13:56
Merci à tous :-)
0
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016
4 avril 2013 à 13:55
j'ai enfin trouvé la solution après pas mal de recherche et de tests.. :

exemple avec une control text mais ça marche avec ma shape...
A ajouter au module :
Delegate Sub UpdateTextBox(ByVal message As String)

plus l'appel de la modificaton du control :
  Dim f As frmSerialInOut = My.Application.OpenForms("frmSerialInOut")
  f.Invoke(New UpdateTextBox( _
     AddressOf f.UpdateMessage), New Object() {strInMessage})


A ajouter à la form
Public Sub UpdateMessage(ByVal strInMessage As String)
  txtSerialIn.Text = strInMessage & vbCrLf & txtSerialIn.Text
End Sub


issu de : Solution forum msdn

Voila..
si ça peut aider quelqu'un.

Merci foliv pour la conversion de type pour le problème cité plus haut mais je pense que le problème initial ne venait pas de là...

voici l'explication en anglais du pb que j'avais.. :
VB.NET has a "default instance" feature for forms. This was created to help simulate VB 6 functionality with forms. The default instance means that instead of creating a new instance of the form and then acting on it, I can simply refer to the form by name, and a default instance will be created for me. These instances are thread specific, however. So, your serial port code (know it or not) is creating a second thread that retrieves/returns data. Normally, if you try to update your UI from a worker thread, a cross thread exception occurs. However, because VB.NET had default instances for forms, the secondary thread is creating another instance of your form in the background, updating the textbox on the NEW instance, and then releasing the second instance of the form for garbage collection when the worker thread is complete. This is why when you called "InvokeRequired" it returned false. It wasn't required on the SECOND instance of the form, because it was created in the SECONDARY thread -- i.e. it wasn't what you wanted to update.

By calling the form through the other method, it retreives the existing instance on the other thread. Of course, if you try to update the UI from that thread, you finally get the cross-thread exception we would normally expect to see. However, by calling Invoke on that instance, you can cause the code to execute on the UI's thread rather than from the worker thread.
-2
Rejoignez-nous