Msgbox verschijnt te vaak

Status
Niet open voor verdere reacties.

JaapHuisman

Gebruiker
Lid geworden
23 feb 2010
Berichten
48
Beste mensen,

Ik ben net begonnen met Visual Basic dus loop tegen een aantal problemen aan. Een aantal heb ik zelf op kunnen lossen maar met 1 ervan lukt het nog niet.. Ik hoop dat jullie mij kunnen helpen.

Ik werk in Microsoft Visual Basic 2008 Express Edition en probeer een programma te maken waarin je een tijd op kan geven wanneer Windows afgesloten moet worden. De tijd werkt allemaal wel, alleen het probleem zit hm in 't weergeven van de msgbox.

Dit is de code waar het volgens mij fout gaat:

Code:
If Label4.Text = "Deze computer wordt op de aangegeven tijd door dit programma afgesloten" Then
            If VAR_uur.Text + ":" + VAR_minuut.Text + ":" + VAR_seconde.Text = (TimeOfDay.ToString("HH:mm:ss")) Then
                MsgBox("het is " & TimeOfDay.ToString("hh:mm:00"), MsgBoxStyle.YesNo + MsgBoxStyle.Question, "weet u het zeker?")
            End If
        End If

Het probleem is dat de MsgBox overdreven vaak wordt weergegeven... Ik heb geen idee meer hoe ik het op moet lossen, misschien hebben jullie een idee...?
 
Check eens of die 'VAR_uur.Text + ":" + VAR_minuut.Text + ":" + VAR_seconde.Text ' wel de waarde heeft die jij verwacht.
 
Ik zelf probeer in mijn programma's vaak een 'presentatielaag' en een 'logische laag' uitelkaar te houden.

Voorbeeld van presentatielaag:
- Ik toon een message op een label
- Ik vuur een messagebox af
- De gebruiker voert iets in een textbox in
- Ik probeer de inhoud van de textbox te interpreteren als bedrag
- etc.

Voorbeeld van logische laag:
- Ik voer berekeningen uit
- Ik neem beslissingen
- Ik controleer of het tijdstip, waarop het programma moet sluiten, inmiddels verstreken is
- etc.

Als je dit onderscheid zou maken, dan zou jouw volgende code falikant fout zijn:
Code:
   If Label4.Text = "Deze computer wordt op de aangegeven tijd door dit programma afgesloten" Then
Want hier zou je je 'presentatielaag' misbruiken om beslissingen te nemen ('logische laag')

Snap je het idee een beetje?
 
Aller eerst, bedankt voor jullie snelle reactie's!

Check eens of die 'VAR_uur.Text + ":" + VAR_minuut.Text + ":" + VAR_seconde.Text ' wel de waarde heeft die jij verwacht.

Wat bedoel je met een waarde die ik verwacht? Ik voer zelf een tijd in om te testen.. Dus volgens mij klopt die waarde dan wel, toch?

________


Ik zelf probeer in mijn programma's vaak een 'presentatielaag' en een 'logische laag' uitelkaar te houden.

Voorbeeld van presentatielaag:
- Ik toon een message op een label
- Ik vuur een messagebox af
- De gebruiker voert iets in een textbox in
- Ik probeer de inhoud van de textbox te interpreteren als bedrag
- etc.

Voorbeeld van logische laag:
- Ik voer berekeningen uit
- Ik neem beslissingen
- Ik controleer of het tijdstip, waarop het programma moet sluiten, inmiddels verstreken is
- etc.

Als je dit onderscheid zou maken, dan zou jouw volgende code falikant fout zijn:
Code:
   If Label4.Text = "Deze computer wordt op de aangegeven tijd door dit programma afgesloten" Then
Want hier zou je je 'presentatielaag' misbruiken om beslissingen te nemen ('logische laag')

Snap je het idee een beetje?

Ik snap het idee wel, maar ik heb geen idee hoe ik het zou moeten verwerken. Wat zou een mogelijkheid zijn om die anders te doen?
 
Doe voor alle zekerheid eens:
Code:
  hulpstring = VAR_uur.Text + ":" + VAR_minuut.Text + ":" + VAR_seconde.Text
  MsgBox "hulpstring : " & hulpstring
 
Ik snap het idee wel, maar ik heb geen idee hoe ik het zou moeten verwerken. Wat zou een mogelijkheid zijn om die anders te doen?

Ik weet niet wat jouw programma allemaal precies moet gaan doen, dus ik kan een paar suggesties geven en hopen dat ze binnen jouw project bruikbaar zijn.

- Declareer een variabele, b.v. AfsluitTijdstip, waarin je het tijdstip waarop de computer moet worden afgesloten kunt opslaan.
- Maak een aparte procedure, b.v. VulAfsluitTijdstip, waarin je VAR_uur, VAR_minuut en VAR_seconde uitleest en aan de hand daarvan AfsluitTijdstip vult.
- In VulAfsluitTijdstip kun je dan meteen Label4.Text vullen met jouw message.
- De code uit jouw 1e post ziet er dan veel simpeler uit:
Code:
            If AfsluitTijdstip >= TimeOfDay Then
                MsgBox("het is " & TimeOfDay.ToString("hh:mm:00"), MsgBoxStyle.YesNo + MsgBoxStyle.Question, "weet u het zeker?")
            End If
 
Ik weet niet wat jouw programma allemaal precies moet gaan doen, dus ik kan een paar suggesties geven en hopen dat ze binnen jouw project bruikbaar zijn.

- Declareer een variabele, b.v. AfsluitTijdstip, waarin je het tijdstip waarop de computer moet worden afgesloten kunt opslaan.
- Maak een aparte procedure, b.v. VulAfsluitTijdstip, waarin je VAR_uur, VAR_minuut en VAR_seconde uitleest en aan de hand daarvan AfsluitTijdstip vult.
- In VulAfsluitTijdstip kun je dan meteen Label4.Text vullen met jouw message.
- De code uit jouw 1e post ziet er dan veel simpeler uit:
Code:
            If AfsluitTijdstip >= TimeOfDay Then
                MsgBox("het is " & TimeOfDay.ToString("hh:mm:00"), MsgBoxStyle.YesNo + MsgBoxStyle.Question, "weet u het zeker?")
            End If

Daar ga ik mijn best voor doen :-) Ben benieuwd of het dan werkt!
 
Die moet je er nog bij declareren als string.
Code:
   dim hulpstring As string

Dit heb ik gedaan, met als gevolg dat de msgbox bij het opstarten van het programma gelijk komt, en ook niet meer weg te krijgen is... Je ziet er een stuk of 50, maar bij het weg klikken komt er gelijk een nieuwe...
 
Dit heb ik gedaan, met als gevolg dat de msgbox bij het opstarten van het programma gelijk komt, en ook niet meer weg te krijgen is... Je ziet er een stuk of 50, maar bij het weg klikken komt er gelijk een nieuwe...

Ik snap het denk ik al:
Je krijgt een messagebox omdat een of ander tijdstip is verstreken.
Een fractie van een seconde later is nog steeds datzelfde tijdstip alweer verstreken.:rolleyes:
Etc. etc.
Dus ik weet niet waar je precies die messagebox afgeeft, maar je moet er een voorwaarde bij programmeren: als die messagebox al is getoond dan hoeft hij niet nog een tweede keer te worden getoond.
 
Ik snap het denk ik al:
Je krijgt een messagebox omdat een of ander tijdstip is verstreken.
Een fractie van een seconde later is nog steeds datzelfde tijdstip alweer verstreken.:rolleyes:
Etc. etc.
Dus ik weet niet waar je precies die messagebox afgeeft, maar je moet er een voorwaarde bij programmeren: als die messagebox al is getoond dan hoeft hij niet nog een tweede keer te worden getoond.

ja precies :) heb je enig idee hoe ik dat zou kunnen doen dan?
 
Ik had iets soortgelijks gemaakt laatst, dat ging zo:
Code:
        Label4.Text = Date.Now.ToLongTimeString

        If Label4.Text = "21:30:00" Then

        MessageBox.Show("Het is half 10!", "Weet u het zeker?", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
 
Hier met een duidelijk voorbeeld:

Code:
Public Time_ToShutDown As String = "19:45:30"

        Dim Current_Time As String = Date.Now.ToLongTimeString
        MsgBox(Current_Time)
        If Time_ToShutDown = Current_Time Then
            Timer1.Stop()
            Dim Result As MsgBoxResult
            Result = MsgBox("De door u opgegeven tijd is bereikt..." & _
                              "Wilt u nu afsluiten?", MsgBoxStyle.Information + MsgBoxStyle.YesNo)

            If Result = MsgBoxResult.Yes Then
                'laat hem de opdracht voor Ja doen
            Else
                'laat hem de opdracht voor Nee doen
            End If
        End If

Die code zet je in een timer_tick:thumb:
 
heb je enig idee hoe ik dat zou kunnen doen dan?
Ik heb maar eens een voorbeeldje geprutst:
Code:
Public Class Form1
    Dim SchedulerTime As DateTime
    Dim SchedulerActive As Boolean

    Private Sub btnActivate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnActivate.Click
        Dim MyHH As Long
        Dim MyMM As Long
        Dim MySS As Long
        Dim hTimestr As String

        If IsNumeric(VAR_uur.Text) Then
            MyHH = CLng(VAR_uur.Text)
        Else
            MyHH = 0
        End If

        If IsNumeric(VAR_minuut.Text) Then
            MyMM = CLng(VAR_minuut.Text)
        Else
            MyMM = 0
        End If

        If IsNumeric(VAR_seconde.Text) Then
            MySS = CLng(VAR_seconde.Text)
        Else
            MySS = 0
        End If

        If MyHH < 0 Or MyMM < 0 Or MySS < 0 Then
            LblMessage.Text = "Negatieve waarden zijn hier niet toegestaan"
            Application.DoEvents()
            Exit Sub
        End If
        If MyHH > 23 Then
            LblMessage.Text = "Uren lopen slechts tot en met 23"
            Application.DoEvents()
            Exit Sub
        End If
        If MyMM > 59 Then
            LblMessage.Text = "Minuten lopen slechts tot en met 59"
            Application.DoEvents()
            Exit Sub
        End If
        If MySS > 59 Then
            LblMessage.Text = "Seconden lopen slechts tot en met 59"
            Application.DoEvents()
            Exit Sub
        End If

        VAR_uur.Text = Format(MyHH, "00")
        VAR_minuut.Text = Format(MyMM, "00")
        VAR_seconde.Text = Format(MySS, "00")

        hTimestr = Format(MyHH, "00") & ":" & Format(MyMM, "00") & ":" & Format(MySS, "00")
        SchedulerTime = TimeValue(hTimestr)

        Activate_Scheduler()
    End Sub

    Private Sub Activate_Scheduler()
        If SchedulerTime.ToString("HH:mm:ss") > TimeOfDay.ToString("HH:mm:ss") Then
            SchedulerActive = True
            LblMessage.Text = "Scheduler actief " & SchedulerTime.ToString("HH:mm:ss")
        Else
            LblMessage.Text = "Scheduler inactief (opgegeven tijdstip reeds gepasseerd) " & SchedulerTime.ToString("HH:mm:ss")
        End If
        Application.DoEvents()
    End Sub

    Private Sub DeActivate_Scheduler()
        SchedulerActive = False
        LblMessage.Text = "Scheduler inactief"
        Application.DoEvents()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        DeActivate_Scheduler()
        Timer1.Enabled = True
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If SchedulerActive And SchedulerTime.ToString("HH:mm:ss") <= TimeOfDay.ToString("HH:mm:ss") Then
            DeActivate_Scheduler()
            MsgBox("het is " & TimeOfDay.ToString("HH:mm:ss"), MsgBoxStyle.YesNo + MsgBoxStyle.Question, "weet u het zeker?")
        End If
    End Sub
End Class
 
Hartstikke bedankt allemaal!!! :thumb:

Ik ga met alle tips die jullie mij gegeven hebben stoeien en jullie horen het resultaat zo snel mogelijk van mij!

Bedankt voor alle hulp en reactie's tot nu toe!
 
Sorry voor de late reactie!! Had het nogal druk, dus kwam er niet aan toe te reageren hier. Sorry!

Ik heb je code geprobeerd. Alleen ik heb geen idee wat ik met Submain, LblMessage, Controls etc. moet doen... Krijg bijv. de fout melding: 'Controls' is not a member of 'Project1.Form1'

Is er niet een regel die je in kan voegen om 1 msgbox te zien te krijgen ipv 50?


Ik heb maar eens een voorbeeldje geprutst:
Code:
Public Class Form1
    Dim SchedulerTime As DateTime
    Dim SchedulerActive As Boolean

    Private Sub btnActivate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnActivate.Click
        Dim MyHH As Long
        Dim MyMM As Long
        Dim MySS As Long
        Dim hTimestr As String

        If IsNumeric(VAR_uur.Text) Then
            MyHH = CLng(VAR_uur.Text)
        Else
            MyHH = 0
        End If

        If IsNumeric(VAR_minuut.Text) Then
            MyMM = CLng(VAR_minuut.Text)
        Else
            MyMM = 0
        End If

        If IsNumeric(VAR_seconde.Text) Then
            MySS = CLng(VAR_seconde.Text)
        Else
            MySS = 0
        End If

        If MyHH < 0 Or MyMM < 0 Or MySS < 0 Then
            LblMessage.Text = "Negatieve waarden zijn hier niet toegestaan"
            Application.DoEvents()
            Exit Sub
        End If
        If MyHH > 23 Then
            LblMessage.Text = "Uren lopen slechts tot en met 23"
            Application.DoEvents()
            Exit Sub
        End If
        If MyMM > 59 Then
            LblMessage.Text = "Minuten lopen slechts tot en met 59"
            Application.DoEvents()
            Exit Sub
        End If
        If MySS > 59 Then
            LblMessage.Text = "Seconden lopen slechts tot en met 59"
            Application.DoEvents()
            Exit Sub
        End If

        VAR_uur.Text = Format(MyHH, "00")
        VAR_minuut.Text = Format(MyMM, "00")
        VAR_seconde.Text = Format(MySS, "00")

        hTimestr = Format(MyHH, "00") & ":" & Format(MyMM, "00") & ":" & Format(MySS, "00")
        SchedulerTime = TimeValue(hTimestr)

        Activate_Scheduler()
    End Sub

    Private Sub Activate_Scheduler()
        If SchedulerTime.ToString("HH:mm:ss") > TimeOfDay.ToString("HH:mm:ss") Then
            SchedulerActive = True
            LblMessage.Text = "Scheduler actief " & SchedulerTime.ToString("HH:mm:ss")
        Else
            LblMessage.Text = "Scheduler inactief (opgegeven tijdstip reeds gepasseerd) " & SchedulerTime.ToString("HH:mm:ss")
        End If
        Application.DoEvents()
    End Sub

    Private Sub DeActivate_Scheduler()
        SchedulerActive = False
        LblMessage.Text = "Scheduler inactief"
        Application.DoEvents()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        DeActivate_Scheduler()
        Timer1.Enabled = True
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If SchedulerActive And SchedulerTime.ToString("HH:mm:ss") <= TimeOfDay.ToString("HH:mm:ss") Then
            DeActivate_Scheduler()
            MsgBox("het is " & TimeOfDay.ToString("HH:mm:ss"), MsgBoxStyle.YesNo + MsgBoxStyle.Question, "weet u het zeker?")
        End If
    End Sub
End Class
 
Wordt de timer gestopt als de tijd bereikt is? Dat moet trouwens voor de MsgBox...
Dus wordt het volgens mij:

Code:
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If SchedulerActive And SchedulerTime.ToString("HH:mm:ss") <= TimeOfDay.ToString("HH:mm:ss") Then
            DeActivate_Scheduler()
[COLOR="Blue"]Timer1.Stop()[/COLOR]
            MsgBox("het is " & TimeOfDay.ToString("HH:mm:ss"), MsgBoxStyle.YesNo + MsgBoxStyle.Question, "weet u het zeker?")
        End If
 
Nee... Ik denk dat dat het probleem is. Zoals ook in een andere post staat, op het moment dat de ingevulde seconde gelijk is aan de seconde van dat moment worden er die hele seconde lang msgboxen geopend... Dus er moet ergens op een of andere manier een stop op die msgbox komen...

Heb jij een idee hoe?


Wordt de timer gestopt als de tijd bereikt is? Dat moet trouwens voor de MsgBox...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan