Jag försöker göra refresh på ett form när den uppdaterar informationen i dom olika labels och gör en massa korrigeringar men den "fryser" sig efter ett tag. Programmet fortsätter köra men det sker inget med formet. Är det någon form av säkerhetsspärr som slår till för att jag uppdaterar den förofta? löste det men några välplacerade doevents men vad är farligheten med att använda doevents? Ingen fara som jag ser det.Programmet gör halt och låter varje process köra färdigt. Tja, om användaren gör något under DoEventen, som gör så att koden du var i startas hamnar du i ett odefinierat läge. Kommentera bort alla doevents för tillfället för att testa följande: Jag går recursivt igenom en disk och jag vill att den ska skriva ut var den befinner sig. Har skrivit om det i en annan tråd här på forumet. Men nu funkar programmet som jag vill. Använt att när den hoppar upp-ner recursivt så gör den doEvents. Funkar helt ok Rekursiva anrop är spännande,man hamnar lätt i den binära rymden. Tips: Titta lite på det här med trådar ;) På så sätt slipper du köra doevents vilket är jobbigt och långsamt. Du kommer att öka hastigheten enormt om du kör loopningen i en egen tråd ;) Varför recursivt? Det slösar med mer resurser än nödvändigt.Refresh form?
Vad kan man göra för att den inte ska frysa?Sv: Refresh form?
Sv: Refresh form?
Om du tex vill uppdatera en Label i en loop så händer ingenting om du inte lägger in ett DoEvents.
Labeln kommer inte att uppdateras förän du går ur loopen.Sv: Refresh form?
Typ:
<code>
Public Sub MinSub()
Do While X
'...
DoEvents
Loop
End Sub
Public Sub Command1_Click()
MinSub
End Sub
</code>
Om du då trycker på Command_1 när DoEventen reagerar så kommer du anropa en funktion som redan är igång.Sv: Refresh form?
Testa att tillfälligt sätta alla kontrollerna som ska uppdateras till visible = false innan någon uppdatering sker.
Då behöver inte programmet använda resurser för att rita om kontrollerna under tiden.
När alla uppdateringar är klara så sätt dem visible = true igen.
(Förutsatt att uppdateringarna inte tar för lång tid för då ser det bara knasigt ut om kontrollerna försvinner och kommer tillbaka)
Försök hitta i koden om det är någon rutin som tar extra lång tid som fryser programmet och se om du kan optimera den rutinen eller utföra rutinen vid ett tidigare tillfälle.Sv: Refresh form?
Sv: Refresh form?
Behärskar man och förstår så är det ett kanon verktyg.Sv: Refresh form?
Sv: Refresh form?
<code>
Public Function IsDir(Path As String) As Boolean
On Error GoTo IsDir_Error
IsDir = GetAttr(Path) And vbDirectory
Exit Function
IsDir_Error:
Select Case Err.Number
Case Else
Debug.Print "IsDir: " & Err.Number & " - "; Err.Description
Resume Next
End Select
End Function
Public Function Scan(Path As String) As Collection
Dim FullName As String
Dim FileName As String
Dim Directory As String
Dim Directories As Collection
On Error GoTo Scan_Error
Set Scan = New Collection
Set Directories = New Collection
If Path Like "*\" Then
Directories.Add Left(Path, Len(Path) - 1)
Else
Directories.Add Path
End If
Do While Directories.Count
Directory = Directories(1)
Directories.Remove 1
FileName = Dir(Directory & "\*.*", vbDirectory Or vbHidden Or vbReadOnly Or vbSystem)
If FileName = "." Then
Dir
FileName = Dir
End If
Do While Len(FileName)
FullName = Directory & "\" & FileName
If IsDir(FullName) Then
If Directories.Count Then
Directories.Add FullName, , 1
Else
Directories.Add FullName
End If
Else
Scan.Add FullName
End If
FileName = Dir
Loop
Loop
Exit Function
Scan_Error:
Select Case Err.Number
Case Else
Debug.Print "Scan: " & Err.Number & " - "; Err.Description
Resume Next
End Select
End Function
</code>
Om du vill göra doevents bör du göra på följande sätt:
<code>
Public Sub TestDoevents()
Dim I As Long
Dim TimeOut As Singel
For I = 1 To 10000000
If Timer > TimeOut Then
Debug.Print Now
DoEvents
TimeOut = Timer + .2
End If
Next
End Sub
</code>
Du kan givetvis ha kortare eller längre intervall mellan uppdateringarna. Men behöver du verkligen uppadtera skärmen mer än fem gånger i sekunden?
Du ersätter givetvis <code>Debug.Print Now</code> med den skärmuppdatering du önskar.