output in TextBox tijdens lus

Status
Niet open voor verdere reacties.

alberto

Gebruiker
Lid geworden
25 mrt 2005
Berichten
9
Programmeeromgeving: Visual Basic 6, in Windows 98

Ik wil tijdens een programma-uitvoering de voortgang in de gaten houden via een output in een TextBox. Ik merk echter dat tijdens het uitvoeren van de subroutine de TextBox leeg blijft. Pas als de subroutine beëindigd wordt, verschijnt de tekst.

Voorbeeld:
Dim i as Integer
Private Sub cmdStart_Click()
textC.Text = ""
For i = 1 To 6
Call reken
textC.Text = textC.Text + Str(i)
Next i
End Sub

Private Sub reken()
..... ' deze bewerking duurt een 8 - 12 seconden
' textC wordt niet gebruikt
End Sub

Ik zou verwachten dat na ongeveer 10 seconden een 1 verschijnt, dan ongeveer 10 seconden later een 2, enz. Echter zie je pas na ongeveer 60 seconden 1 2 3 4 5 6 verschijnen. Wat is mijn fout? Hoe corrigeren?
 
In zo'n geval kun je beter niet met lussen gaan werken, daarvoor in de plaats kun je beter een Timer control gebruiken. Voeg dat eerst in het Form toe, tijdens Run-time zal VB ervoor zorgen dat het control onzichtbaar wordt.

Verder is het gebruik v.e. array (Str(i)) niet per sé noodzakelijk, aangezien het verplicht dimensioneren, in dit geval het declareren v.e. array: dim Str(), pas bij meer dan 10 elementen gebeurt, je gebruikt er slechts 6 elementen.

Het is beter om de code in zijn geheel anders te schrijven:

1) Plaats een Timer-control op het Form.
2) Bij General Declarations declareer je: Dim i As Integer
3) Bij subroutine Form_Load plaats je: textC.Text = ""
4) Bij subroutine cmdStart_Click() plaats je:
i = 0
Timer1.Interval = 1000 '1000 is ongeveer 1 seconde
5) De Subroutine v.d. Timer ziet er hieronder(in zijn geheel weergegeven) zo uit:
Code:
Private Sub Timer1_Timer()
    i = i + 1
    If i < 7 Then
       textC.Text = textC.Text & i
       Else
       Timer1.Interval = 0
       Exit Sub
    End If
End Sub

Dennis.
 
Beste Dennis,
Bedankt voor je tip. Ik heb die Timer ingevoerd, en inderdaad verloopt de output nu goed van mijn voorbeeldprogramma'tje. Mits je Timer1.Interval = 0 aan de start invoert. Hopelijk lukt het me ook in mijn "echte" programma.

Mijn grote vraag is echter nog wel: Waaróm kun je een TextBox niet vullen tijdens een lus? Die dingen zijn er toch voor het gemak van de programmeur?

Je scxhrijft: "je kunt het beter zo en zo doen". Zijn er nog andere opties? Anders zou je geschreven hebben "je moet het zo en zo doen."
Maar bedankt!
Alberto
 
Beste alberto,

In een lus kan dat natuurlijk ook. Met enige aanpassingen kun je je allereerste code hierboven ook gebruiken.

Daarbij moet nog het volgende extra gedeclareerd worden:

Dim Str(10) As String
Dim Teller As Long

En onder de regel, waar 'Call reken' staat, plaats je: Str(i) = i

EN bij de Subroutine reken plaats je:

Code:
Do
   DoEvents
      For Teller = 1 To 10000000
         'NOP (No OPerations) Deze regel kun ook weglaten hoor.
      Next Teller
Loop until Teller = (10000000 + 1)

Dennis.

PS. Een lus is bijvoorbeeld goed voor het vullen v.e. array, het manipuleren van strings e.d. meer.
 
alberto,

Vergat je even te zeggen, dat wanneer je onderstaande code bij de subroutine reken niet zou gebruiken, dan is het onmogelijk de text-box te vullen op de manier zoals je dat beoogt te wilen doen.
Code:
Do
   DoEvents
   For Teller = 1 To 10000000
      'NOP (No OPerations) Deze regel kun ook weglaten hoor.
   Next Teller
Loop until Teller = (10000000 + 1)

Dennis.
 
Hallo Dennis,
Weer bedankt voor je antwoord.
Ik heb de werking van die OnEvents Function bekeken in de Help van MSDN Library, en het lijkt me dat de oplossing met gebruik van de Timer toch fraaier is. Heb goede hoop dat het daarmee wel lukt.

Probleem dus (voorlopig?) opgelost!
alberto
 
Geplaatst door alberto
Ik heb de werking van die DoEvents Function bekeken in de Help van MSDN Library.
Ja, er staat boordevolle informatie in. Het kan goed van pas komen.
Geplaatst door alberto

en het lijkt me dat de oplossing met gebruik van de Timer toch fraaier is.
Is dat zo? (grapje)
En geen dank hoor.;)

Dennis.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan