Vraag & Antwoord

Programmeren

Loop probleem in Visual Basic

12 antwoorden
  • Hallo allemaal, ik ben bezig met vb onder de knie te krijgen gaat redelijk maar nu zit ik toch met een probleem. ik heb in een form een mouse move controle voor als er een mouse move is dan naar een module te gaan waar een tijd routine is . dit om er voor te zorgen dat als er te lang geen mouse move is dat het proggie weer naar het begin menu gaat. maar als ik een tijdje als een idioot met de muis beweeg (als test gedaan ) krijg ik een error 28 stack over flow dat is dus iets niet goed met de loop. in de form: [color=green:dc598c2ef1]Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Globale.tijdroutine End Sub[/color:dc598c2ef1] in de module Globale: [color=green:dc598c2ef1]Public Sub tijdroutine() Max_log_time = 5 start_time = Timer Do While Timer < start_time + Max_log_time DoEvents Loop Storing_aanmeld_frm.Hide frmBegin_Scherm.Show End Sub[/color:dc598c2ef1] er gaat dus iets fout kan iemand me een beetje op weg helpen waar het nou eigenlijk mis gaat. of misschien wel een betere manier dan dat ik heb gedaan is natuurlijk ook welkom. ik heb er voor gekozen om een module te gebruiken omdat ik meerdere formulieren heb waar ik de zelfde tijd aan wil vast zetten
  • Probeert u dit eens: Private Sub Form_MouseMove (Button As Integer, Shift As Integer, _ X As Single, Y As Single) Static count As Integer If count > 2 Then ' <DOE IETS> End Else count = count + 1 End If End Sub
  • het lijkt veel op stack opbouw waar de c64 en 128 ook last van hebben (hadden). je moet de uitlees routine zo schrijven dat als hij er uit gaat er geen stack meer is tot in het hoofd programma. normaal (c basic) schrijf je gosub en return. ik begon er ook tegen aante lopen en maakte er goto met een variabele en on variabele goto terug springen dit is c basic niet qbasic of vb
  • Ik ga het zeker proberen nu even geen tijd . als het werkt dan laat ik het wel weten. bedankt voor de reactie's Ronald Peters
  • [quote:1ea149ce8d="typhoon"] ik heb in een form een mouse move controle voor als er een mouse move is dan naar een module te gaan waar een tijd routine is . dit om er voor te zorgen dat als er te lang geen mouse move is dat het proggie weer naar het begin menu gaat. maar als ik een tijdje als een idioot met de muis beweeg (als test gedaan ) krijg ik een error 28 stack over flow dat is dus iets niet goed met de loop. [/quote:1ea149ce8d] Uiterst vervelend gedrag van Visual Basic. Als er een "event" binnen komt dan onderbreekt Visual Basic de huidige code en gaat het event afhandelen. Zodra dat afgehandeld is, dan wordt de onderbroken stuk code weer hervat. Zeer tricky dus allemaal. [code:1:1ea149ce8d] [i]programmacode1[/i] [i]programmacode2[/i] [i]programmacode3[/i] --> mouse event [i]--- programmacode 1[/i] [i]--- programmacode 2[/i] [i]--- programmacode 3[/i] --> mouse event [i]--- programmacode 1[/i] [i]--- programmacode 2[/i] [i]--- programmacode 3[/i] --> mouse event [i]--- programmacode 1[/i] [i]--- programmacode 2[/i] [i]--- programmacode 3[/i] --> mouse event etc. totdat het 'stack geheugen" vol is. [i]--- programmacode 4[/i] [i]--- programmacode 5[/i] [i]--- programmacode 6[/i] [i]etc.[/i] [i]--- programmacode 4[/i] [i]--- programmacode 5[/i] [i]--- programmacode 6[/i] [i]etc.[/i] [i]--- programmacode 4[/i] [i]--- programmacode 5[/i] [i]--- programmacode 6[/i] [i]etc.[/i] [/code:1:1ea149ce8d] [quote:1ea149ce8d="typhoon"] [color=green:1ea149ce8d]Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Globale.tijdroutine End Sub[/color:1ea149ce8d] in de module Globale: [color=green:1ea149ce8d]Public Sub tijdroutine() Max_log_time = 5 start_time = Timer Do While Timer < start_time + Max_log_time DoEvents Loop Storing_aanmeld_frm.Hide frmBegin_Scherm.Show End Sub[/color:1ea149ce8d] er gaat dus iets fout kan iemand me een beetje op weg helpen waar het nou eigenlijk mis gaat. of misschien wel een betere manier dan dat ik heb gedaan is natuurlijk ook welkom. ik heb er voor gekozen om een module te gebruiken omdat ik meerdere formulieren heb waar ik de zelfde tijd aan wil vast zetten[/quote:1ea149ce8d] Voeg een Timer component toe op elk form die om de x seconden afgaat. [code:1:1ea149ce8d]Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Static IsBusy As Boolean on error goto ErrorHandler if (not IsBusy) then IsBusy = True Globale.tijdroutine IsBusy = False endif exit sub ErrorHandler: IsBusy = False End Sub Private Sub Timer1_Timer() Static IsBusy As Boolean On error goto errhandler if (not IsBusy) then IsBusy = True Call CheckTijdroutine(me) IsBusy = False end if exit sub ErrorHandler: IsBusy = False End Sub Private Sub Storing_aanmeld_frm_Show() Timer1.Enabled = True End Sub Private Sub Storing_aanmeld_frm_Hide() Timer1.Enabled = False End Sub [/code:1:1ea149ce8d] in de module Globale: [code:1:1ea149ce8d] Public Const Max_log_time = 5 Public IsBusy As Boolean Public LastMouseEvent As Date Public Sub tijdroutine() LastMouseEvent = Now End Sub Public Sub CheckTijdroutine(byref frm As Form) if (DateDiff("s",Now, LastMouseEvent) > 5*60) then frm.Hide frmBegin_Scherm.Show endif End Sub[/code:1:1ea149ce8d] [color=blue:1ea149ce8d]Copyright (c) 2003 H4xX0r[/color:1ea149ce8d]
  • Hallo. is ik weer Ik heb de code van E. Cle geprobeerd maar werkte niet helemaal zoals het zou moeten, ik ben er ook nog niet achter wat er mis gaat . Dan de reactie van sjouwer. Ben er wel van bewust dat het een stack is maar hoe je dat kunt oplossen is me weer een tweede. Dat met goto en gosub zou misschien kunnnen maar of dat een stack volloop voorkomt weet ik niet. Ik ga me nu eens bezig houden me de code van h4xX0r. Bedankt ook weer voor de reactie. ik ga eens uitpuzzelen wat er allemaal gebeurd in de code want het is wel handig dat ik weet wat ik in het proggie verwerk. Is een tamelijk lange code voor een simpele tijdmodule, ik bedoel ik had verwacht dat het wel korter zou kunnen maar goed dat is dus misschien niet het geval. Bedankt nog maals en ik ga een skijken wat ik kan doen als ik iets meer weet dan laat ik het hier wel weer weten. Grtx. Ronald Peters
  • Hi, Het kleine stukje code dat ik heb gegeven is uiteraard onvoldoende om u een pasklare oplossing te bieden. Wat ik hiermee heb willen aangeven is een 'denkpiste' die kan worden gevolgd. De teller is uiteraard maar een middel om een 'break' op te werpen. Dit zou in feite een procedure of functie moeten zijn die een tijd genereert. Eerst en vooral moet u goed weten wat de precieze werking van een Static inhoudt. In de Else blok wordt een procedure geplaatst die cumuleert, bijvoorbeeld een teller of een tijdgenerator die de waarde in de teller plaatst. De teller kan bijvoorbeeld worden uitgedrukt in seconden. In de If blok wordt er getest of het aantal seconden die in de Else blok werden opgebouwd overschreden is. Indien JA, dan kan je een bijvoorbeeld een boodschap weergeven dat de tijd verlopen is. Tevens kan je hier de teller (Count in dit geval) terug op nul plaatsen. Vervolgens verlaat je de module. Indien NEE, dan gaan we verder met de Else blok totdat aan de voorwaarde is voldoen. Succes!
  • A op die manier nou dan puzzel ik gewoon nog ff door tot ik het goed onder de knie heb. ben er ook nog maar net mee bezig en wil misschien al te veel ( slechte eigenschap van me denk ik ). dank dank grtx. Ronald Peters
  • Veel simpeler :) Voeg aan je form een timer object aan (naam timer1), met als interval 5000 ms, enabled=false [code:1:30c69a5ba5] Private Sub Timer1_Timer() timer1.enabled=false 'timer heeft zijn werk gedaan, dus kan hij uit. Storing_aanmeld_frm.Hide frmBegin_Scherm.Show End Sub [/code:1:30c69a5ba5] je mousemove pas je als volgend aan: [code:1:30c69a5ba5] Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) timer1.enabled=false timer1.enabled=true End Sub [/code:1:30c69a5ba5] elke keer als de muis beweegt zal de timer herstarten, en de vijf seconden weer overnieuw beginnen. wordt er binnen 5 seconden niets gedaan, wordt de code in timer1 uitgevoerd. Activeer de timer1 pas nadat de initialisatie klaar is, en het scherm visible is voor de gebruiker, dus of in je form.load, of na je form.show.
  • [quote:34a74b7642] Uiterst vervelend gedrag van Visual Basic. Als er een "event" binnen komt dan onderbreekt Visual Basic de huidige code en gaat het event afhandelen. Zodra dat afgehandeld is, dan wordt de onderbroken stuk code weer hervat. [/quote:34a74b7642] Tsja, dat is nu eenmaal het principe van event driven. Dat is niet vervelend maar precies de bedoeling. Als je wilt dat je programma en niet de gebruiker de baas is moet je gewoon procedureel werken.
  • [quote:b3dd13d042="Laurens"][quote:b3dd13d042] Uiterst vervelend gedrag van Visual Basic. Als er een "event" binnen komt dan onderbreekt Visual Basic de huidige code en gaat het event afhandelen. Zodra dat afgehandeld is, dan wordt de onderbroken stuk code weer hervat. [/quote:b3dd13d042] Tsja, dat is nu eenmaal het principe van event driven. Dat is niet vervelend maar precies de bedoeling. Als je wilt dat je programma en niet de gebruiker de baas is moet je gewoon procedureel werken.[/quote:b3dd13d042] Je hebt ook nog zoiets als een message queue waarin alle events worden opgevangen en normaal gesproken volgens het FIFO principe worden afgehandeld. Visual Basic lapt dit zoals gewoonlijk voor het grootste gedeelte aan z'n laars en laat alle user events synchroon afhandelen waardoor dit effect optreedt. [url=http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/MessagesandMessageQueues/MessagesandMessageQueuesReference/MessagesandMessageQueuesFunctions/GetMessage.asp]GetMessage[/url]
  • Het gaat om optimale controle door de gebruiker. Daar is VB voor gemaakt. Niks aan de laars lappen, gewoon behaviour by design. Als je af wilt dwingen dat stukken code hoe dan ook afgehandeld worden zul je semaforen moeten gebruiken of events (tijdelijk) uitsluiten door bijv. knoppen en menuopties tijdelijk te disablen.

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.