Adresser control d'une form depuis module [Résolu]

cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention - 3 avril 2013 à 18:06 - Dernière réponse : cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention
- 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 :-)
Afficher la suite 

10 réponses

Répondre au sujet
0
Utile
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 : ×
Commenter la réponse de Zermelo
Utilisateur anonyme - 3 avril 2013 à 20:36
0
Utile
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
Commenter la réponse de Utilisateur anonyme
cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 3 avril 2013 à 23:51
0
Utile
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
Commenter la réponse de cs_Galain
cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention - 4 avril 2013 à 09:01
0
Utile
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 ...
Commenter la réponse de cs_got
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 4 avril 2013 à 09:44
0
Utile
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
Commenter la réponse de cs_ShayW
0
Utile
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 : ×
Commenter la réponse de Zermelo
cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention - 4 avril 2013 à 10:09
0
Utile
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..
Commenter la réponse de cs_got
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 4 avril 2013 à 13:36
0
Utile
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.
Commenter la réponse de foliv57
cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention - 4 avril 2013 à 13:56
0
Utile
Merci à tous :-)
Commenter la réponse de cs_got
cs_got 139 Messages postés lundi 7 janvier 2002Date d'inscription 15 mars 2016 Dernière intervention - 4 avril 2013 à 13:55
-2
Utile
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.
Commenter la réponse de cs_got

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.