PDA

Vollständige Version anzeigen : DoEvents


FI_Simon
27.03.2006, 10:28
Hallo,
kennt ihr eine alternative DoEvents Funktion. Ich möchte ein Formular, indem ein Ladebalken laufen soll aktualisieren, so das sich die Anzeige in einem Textfeld erneuert und der Ladebalken weiterläuft.
Das Ganze mache ich aufgrund von Abfragen die im VBA-Code einzeln aus einer Liste von Werten durchgeführt werden. Sagen wir mal, ich habe 10000 Felder in einer Tabelle, aus denen ich in einer Schleife immer wieder eine neue Abfrage erstelle und diese ablaufen lasse. Wenn ich das Ganze mit DoEvents ablaufen lasse, so das sich die anzeige im Formular aktualisiert dauerts ca. 30min, ohne DoEvents, dauerts 3min. Gibt es etwas schnelleres als DoEvents oder eine alternative zum Aktualisieren der Textfeldinhalte?

Nouba
27.03.2006, 10:40
Hmm - man weiß leider nicht so genau, was Du wie machst. Wie soll man da Empfehlung abgeben?

khs-hh
27.03.2006, 10:55
ich verstehe nicht so ganz was DoEvents mit dem anzeigen bzw aktualisieren von Textfeldern zu tun hat.

FI_Simon
27.03.2006, 11:05
Hmm, ok, dann probiers ich anders:

Ich habe ein Formular, indem ich anzeigen möchte wie weit der Programmablauf ist.
Dort steht dann ein Textfeld, indem ich den aktuellen Datensatz anzeige
und ein Fortschrittsbalken(0-100%) indem der aktuelle Fortschritt angezeigt wird.

Der Programmcode sieht sagen wir mal so aus(sinngemäß):

----------
Tabelle A auslesen -> in Recordset speichern;
Schleife RS.EOF
Anfügeabfrage mit aktuellem Field aus dem Recordset;
Ladebalken aufrufen;
Textfeld neues Value zuweisen, wäre hier das aktuelle Recordset(RS.Field)("xyz");
DoEvents;
nächter Datensatz;
Schleife Ende

Ich muss ja DoEvents ausführen damit die Anzeige im Formular aktualisiert wird. Also wenn ich jetzt Me.Text1.Value=RS.Fields("Feld1").Value zuweise und dann doevents und das 10000 mal hintereinander in der schleife dauert das ewig. Ohne DoEvents, würde sich das Textfeld und der Ladebalken nie verändern. Gibt es eine andere(schnellere) Möglichkeit die Felder im Formular zu aktualisieren?

Wenn ihr wollt kann ich auch die mdb datei hier ablegen, wenn es noch nicht klar genug ist?
Gruß
Simon

Sascha Trowitzsch
27.03.2006, 11:17
Der Fehler ist, dass du DoEvents nach jedem Datensatz aufrufst.
Wenn du 10000 DS hast, dann gibt es wenig Sinn, den %-Ladebalken für jeden DS neu aufzubauen. Der Logik nach müsste es nur für jeden 100sten DS nötig sein. Und deshlab bautr man dann da auch einen Zähler ein:

Dim cnt As Long, cntmax as long
cntmax = rs.RecordCount
Do While Not rs.EOF
rs.DoSomeThing
If (cnt Mod (cntmax\100)) = 0 Then
Ladebalken (100 * cnt/cntmax)
DoEvents
End If
cnt = cnt +1
rs.MoveNext
Loop

Ciao, Sascha

Nouba
27.03.2006, 11:17
Ich würde eher das Recordset innerhalb einer Transaktion schreiben und nur beim 10., 50., oder 100. Schleifendurchlauf ein DoEvents absetzen - hier muß man halt experimentieren.

FI_Simon
27.03.2006, 11:26
Hmm, eigentlich habt ihr Recht, ich weiss zwar nicht immer obs nun 10000 oder 100000 Datensätze sind, aber man kann ja den Recordcount einmal durch 100 teilt und dann mit dem Ergebnis weiterarbeitet gehts, denke ich.

So in etwa:
a=1
i=RS.Recordcount
t=i/100
t2=t
Do while not RS.EOF
~~Ablauf~~
If a=t then
DoEvents
t=t+t2
End if

a=a+1

Loop


Danke Leute!

Sascha Trowitzsch
27.03.2006, 11:33
"So in etwa" war auch mein Code. ;) SCNR, Sascha

FI_Simon
27.03.2006, 11:40
Danke, habs ein wenig spät gesehen ;)
Schönen tag noch!