Utiliser un Windows.Form depuis une Classe

johann77150 Messages postés 23 Date d'inscription mercredi 4 mars 2009 Statut Membre Dernière intervention 12 juillet 2012 - 12 juil. 2012 à 12:19
 Utilisateur anonyme - 13 juil. 2012 à 06:46
Bonjour, j'ai un problème avec un programme :s
J'essaye d'intérargir avec un webbrowser depuis une classe mais je reçois une erreur au lancement de l'application (pas à la compilation).

Voici l'erreur relevée complète :
{"Impossible d'instancier le contrôle ActiveX '8856f961-340a-11d0-a96b-00c04fd705a2', car le thread actuel n'est pas un thread cloisonné (STA, Single-Threaded Apartment)."}


Dans ma classe il y a un code qui permet de récupérer une commande tapée par un utilisateur.
Or, pour une commande j'ai besoin d'une vérification web via un WebBrowser.

Donc dans cette classe j'ai :
Dim Points As New AchatPoint()
Points.Show()Dim X As Integer
Dim Y As Integer
Dim code As String
Points.TestCode(X, Y, code)

Y et X sont définis mais je vais pas donner tout le code inutile ^^'

Ensuite dans la Form AchatPoint j'ai :

Public Class AchatPoint
    Public Sub TestCode(X As Integer, Y As Integer, code As String)

        WebBrowser1.Navigate("Lien qui contient les variables X, Y, code")
        If WebBrowser1.DocumentText.Contains("OUI") Then
            msgbox("Bon") 
        Else
            msgbox("Incorrect")
        End If
    End Sub


End Class


Et là j'ai l’erreur citée au dessus quand je fait la commande qui appelle la classe.

J'ai essayé d'ajouter un Shared à Public Sub TestCode mais le WebBrowser se souligne en bleu et soulève comme erreur :
Impossible de faire référence à un membre instance d'une classe à partir d'une méthode partagée ou d'un initialiseur de membre partagé sans une instance explicite de la classe


Merci d'avance ...

6 réponses

Utilisateur anonyme
12 juil. 2012 à 12:34
Bonjour,

Tu pourrais utiliser l'héritage. Voici un exemple :
Option Strict On
Public Class Form1
    Dim WithEvents MonWebBrowser As New clsWebBrowser

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MonWebBrowser New clsWebBrowser With {.Top 10, .Left = 20}
        Me.Controls.Add(MonWebBrowser)
        MonWebBrowser.TestCode(...
    End Sub

    Public Class clsWebBrowser
        Inherits WebBrowser

        Public Sub TestCode(ByVal X As Integer, ByVal Y As Integer, ByVal code As String)

            Me.Navigate("Lien qui contient les variables X, Y, code")
            If Me.DocumentText.Contains("OUI") Then
                MsgBox("Bon")
            Else
                MsgBox("Incorrect")
            End If
        End Sub
    End Class
End Class
0
Utilisateur anonyme
12 juil. 2012 à 12:35
Correction : juste supprimer 'new' dans la déclaration.
0
johann77150 Messages postés 23 Date d'inscription mercredi 4 mars 2009 Statut Membre Dernière intervention 12 juillet 2012
12 juil. 2012 à 14:21
Merci pour cette réponse, malheureusement ça ne fonctionne pas avec mon application.

Soit je suis complètement nul et j'ai mal retranscrit ce que tu m'as dit, soit tu n'as pas bien compris ma situation :s

Le lancement du webbrowser se fait dans la classe Commands.Vb
Le WebBrowser est bien dans la Form1

Or ici tu lances le WebBrowser depuis la Form1
J'ai essayé de l’appeler comme suit depuis commands.vb :
Form1.clsWebBrowser.TestCode(X, Y, code)


mais j'ai l'erreur suivante :
Une référence à un membre non partagé requiert une référence d'objet.


J’espère m'être trompé ...
0
Utilisateur anonyme
12 juil. 2012 à 16:56
Ta question n'étant pas posée dans le forum débutants, je te proposais, ici, une toute autre méthode qui consiste à faire hériter directement une classe d'un WebBrowser sans passer par un composant de la boîte à outils à déposer sur un formulaire.
Ainsi, cette classe se comporte comme un composant webBrowser auquel on peut rajouter des méthodes et des propriétés supplémentaires, tout en conservant les siennes.

J'ajoute qu'une classe publique peut être placée n'importe où. Ici, par commodité, je l'ai placée dans une autre classe.

Dans mon exemple, l'objet 'MonWebBrowser' est une instance de la classe clsWebBrowser, et c'est donc depuis cette instance que tu dois appeler la méthode TestCode.
Donc on écrit : MonWebBrowser.TestCode(X,Y,Code) pour appeler la méthode TestCode.

N'hésite pas à tester à part l'exemple proposé, d'observer le résultat et de demander plus de précisions si besoin
0

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

Posez votre question
johann77150 Messages postés 23 Date d'inscription mercredi 4 mars 2009 Statut Membre Dernière intervention 12 juillet 2012
12 juil. 2012 à 18:45
Merci, j'ai finalement compris mais j'ai trouvé bien plus simple :s
Je recherche le code source de la page et je vérifie son contenu :

Dim request As System.Net.HttpWebRequest = CType(System.Net.HttpWebRequest.Create("Mon lien"), Net.HttpWebRequest)
Dim response As System.Net.HttpWebResponse = CType(request.GetResponse(), Net.HttpWebResponse)
Dim sr As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())
Dim sourcecode As String = sr.ReadToEnd()

     If sourcecode.Contains("OUI") Then
Client.SendMessage("Correct")
     Else
Client.SendMessage("Incorrect.")
     End If


Merci de vous être intéressé à mon problème.

A bientôt.
0
Utilisateur anonyme
13 juil. 2012 à 06:46
mais j'ai trouvé bien plus simple
Il aurait été utile de préciser que tu n'avais pas besoin d'afficher la page.
Tu m'aurais évité de perdre mon temps
-1
Rejoignez-nous