msgbox thread modal

Status
Niet open voor verdere reacties.

luck7

Gebruiker
Lid geworden
10 feb 2009
Berichten
791
hallo

normaal gesproken is het toch zo, dat je eerst de messagebox moet "beantwoorden" door op ok, yes, no of wat dan ook te klikken?

ik heb namelijk een programma en bij sommige msgboxen gebeurt dit niet wat erg vervelend is.

komt volgens mij omdat het in een Thread staat

BVD
Luck
 
Laatst bewerkt:
Welke programmeertaal gebruik je?

Als je de MessageBox 'System Modal' maakt, kun je die niet wegklikken ;).
 
vb.net
dat heb ik al geprobeerd maar dat werkt niet omdat de code in een thread staat, en die thread staat los van de form. daardoor werkt het niet. ik heb dus een code nodig die via de thread een msgbox in de form oproept.

mfg
Luck
 
Probeer dit eens:

[CPP]MsgBox("Bericht",4096+48+4,"Titel")[/CPP]

Dat '4096' betekent: System Modal
Dat '4' betekent: Ja/Nee
Dat '48' betekent: Waarschuwingsteken

71127658.jpg
 
Zoals ik al zij, het heeft temaken met die Thread. het werkt dus niet om de code voor de msgbox in de thread zelf te zetten.
ik heb een code nodig die via de Thread in messagebox in form 1 oproept.
 
Mag ik je code zien? Dan wordt het misschien iets duidelijker.
Wanneer wil je namelijk dat die MsgBox wordt getoond?
 
Code van de button:

Code:
PictureBox1.Visible = True
        Me.Cursor = Cursors.WaitCursor
        Contacting = True

        TimerShowState.Start()

        Dim Thread As Thread
        Thread = New System.Threading.Thread(AddressOf threadcodegetOffers)
        Thread.Start()

code van de thread:

Code:
Sub threadcodegetOffers()

        On Error GoTo errorhandler
        If RadioButton1.Checked = True Then
            Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://h1.ripway.com/CyberTech/Lost-Worlds%20Resource%20Exchange/OfferMetall/offermetall.txt")
            Dim response As System.Net.HttpWebResponse = request.GetResponse()

            Dim sr As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())

            onlinetext = sr.ReadToEnd()


        ElseIf RadioButton2.Checked = True Then
            Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://h1.ripway.com/CyberTech/Lost-Worlds%20Resource%20Exchange/OfferKristall/offerkristall.txt")
            Dim response As System.Net.HttpWebResponse = request.GetResponse()

            Dim sr As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())

            onlinetext = sr.ReadToEnd()


        ElseIf RadioButton3.Checked = True Then
            Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://h1.ripway.com/CyberTech/Lost-Worlds%20Resource%20Exchange/OfferDeuterium/offerdeuterium.txt")
            Dim response As System.Net.HttpWebResponse = request.GetResponse()

            Dim sr As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())

            onlinetext = sr.ReadToEnd()


        End If
        PictureBox1.Visible = False
        TimerShowState.Stop()
        Me.Text = "CyberTech Lost-Worlds Resource Exchange"
        Me.Cursor = Cursors.Default

    'Hier moetde msgbox komen

        Exit Sub

errorhandler:
        Button2.PerformClick()
    End Sub
 
OK, en onder welke omstandigheden moet die MsgBox worden opgeroepen? (Waar en wanneer?)
 
nadat de string onlinetext een waarde heeft gekregen en de cursor en picturebox weer normaal zijn. (zie 5 laatste regels van code)
 
de user kan met form1 verder gaan zonder ok op de messagebox te klikken. dat komt omdat de threadcode los staat van de form en hem dus niet tijdelijk deactiveerd todat er een reactie op de msgbox komt
 
Probeer dit eens:

[CPP]Form1.Enabled = False
MsgBox("blabla",64+3+4096,"Test")
Form1.Enabled = True[/CPP]
 
heb ik al geprobeerd. het zo zo moeten zijn - en at ken je vast en zeker -, dat als de user op form1 klikt de messageboc begint te knipperen.
 
Ik heb voor je gezocht, maar niets gevonden. Ik vraag me af of het mogelijk is :confused:
 
en als ik een dim aanmaak met een boolean waarde en de thread de boolean status laat veranderen. en dan in form1 een timer die de waarde checkt??
 
De code wordt dan wel ietwat rommelig, maar je kunt het proberen.
 
InvokeRequired:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx

Dan heb je dit nodig
http://msdn.microsoft.com/en-us/library/ms171728.aspx

Deze code heb ik gekopieerd van de bovenstaande link
Code:
' This method demonstrates a pattern for making thread-safe
   ' calls on a Windows Forms control. 
   '
   ' If the calling thread is different from the thread that
   ' created the TextBox control, this method creates a
   ' SetTextCallback and calls itself asynchronously using the
   ' Invoke method.
   '
   ' If the calling thread is the same as the thread that created
    ' the TextBox control, the Text property is set directly. 

    Private Sub SetText(ByVal [text] As String)

        ' InvokeRequired required compares the thread ID of the
        ' calling thread to the thread ID of the creating thread.
        ' If these threads are different, it returns true.
        If Me.textBox1.InvokeRequired Then
            Dim d As New SetTextCallback(AddressOf SetText)
            Me.Invoke(d, New Object() {[text]})
        Else
            Me.textBox1.Text = [text]
        End If
    End Sub

Dus je als je dit wil editen doe je iets zoals (uit losse hand geschreven, en schrijf eigenlijk geen vb.net (maar C# wat alleen een andere syntax heeft)):
Code:
Private Sub ShowMessageBox(ByVal [text] As String)

        If Me.form1.InvokeRequired Then 'Weet niet zeker of dit goed is, moet je maar uittesten!
            Dim d As New SetTextCallback(AddressOf ShowMessageBox)
            Me.Invoke(d, New Object() {[text]})
        Else
            'Code voor showmessagebox, weet niet precies wat hij is
        End If
    End Sub

Ik denk dat dit zou moeten werken.
 
Ik heb de code van wicherh iets aangepast: het werkt!


Voorbeeld:
[CPP]
Dim t As New System.Threading.Thread(AddressOf Test)
Delegate Sub SetTextCallback([text] As String)

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
t.Start()
End Sub

Private Sub Test()
ShowMessageBox("Bericht")
End Sub

Private Sub ShowMessageBox(ByVal [text] As String)
If Me.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf ShowMessageBox)
Me.Invoke(d, New Object() {[text]})
Else
MsgBox(text, 48 + 4096, "Titel")
End If
End Sub
[/CPP]
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan