none
Problem bei loop und .setfocus

    Allgemeine Diskussion

  • Hallo Zusammen,

    ich möchte gerne den Bearbeitungsfortschrift von Prozessen die ich in einem loop durchführe durch ein Formular monitoren.

    Das heist, ich öffne in der Prozedur ein Formular, dass die bspw. zu ändernden Daten zeigt - oder einfach nur ein ungebundenes Feld hat in das ich die Anzahl der bearbeiteten Datensätze schreibe. Danach verändere ich mit ADO den Datensatz. Sobald ich das getan habe will ich das Formular in den Fucus ziehen und aktualisieren:

    Forms!meinFormular.SetFocus

    Forms!meinFormular.Recalc

    'Danach dann

    cnn.MoveNext

    loop

    Leider klappt das neue Anzeigen aber nur bei den ersten 3-4 Datensätzen. Danachh passiert nichts mehr, bis wirklich alle Datensätze durchlaufen sind. Das können zuweilen schon mal einige hundert sein. Es läuft aber alles richtig durch und wenn es fertig ist, wird das Formular auch mit den korrekten Werten angezeigt.

    Ich würde es aber gerne nach jedem Datensatz aktualisieren. Was mache ich falsch?

    Vielen Dank und viele Grüße

    Patrick

    Montag, 12. März 2012 13:23

Alle Antworten

  • Ich denke mal, das es zuviele Ereignisse sind, die hier einer Optimierung zum Opfer fallen.

    In diesem Fall würde ich einen Ansatz mit einer Eigenschaft wählen, d.h. das Formular zur Fortschrittsanzeige bekommt (im einfachen Fall) zwei Eigenschaften AnzahlSchritte und aktueller Schritt, wobei die Set-Methoden das Neuzeichnen übernehmen. Z.B.

    Option Compare Database
    Option Explicit
    
    Private m_MaxSteps As Long
    Private m_CurrentStep As Long
    
    Public Property Get CurrentStep() As Long
    
      CurrentStep = m_CurrentStep
      
    End Property
    
    Public Property Let CurrentStep(AValue As Long)
    
      m_CurrentStep = AValue
      DisplayProgress
      
    End Property
    
    Public Property Get MaxSteps() As Long
    
      MaxSteps = m_MaxSteps
    
    End Property
    
    Public Property Let MaxSteps(AValue As Long)
    
      m_MaxSteps = AValue
      DisplayProgress
    
    End Property
    
    Private Sub DisplayProgress()
    
      Dim Percentage As Long
      
      Percentage = 0
      If m_MaxSteps > 0 Then
        Percentage = (m_CurrentStep * 100) / m_MaxSteps
      End If
      
      lblProgress.Caption = Percentage & "%"
      Me.Repaint
    
    End Sub

    Und Aufgerufen mit

    Option Compare Database
    Option Explicit
    
    Private Sub btnInit_Click()
    
      Forms!frmProgress.MaxSteps = 100
      Forms!frmProgress.CurrentStep = 0
      
    End Sub
    
    Private Sub btnStep_Click()
    
      Forms!frmProgress.CurrentStep = Forms!frmProgress.CurrentStep + 1
    
    End Sub
    

    Allerdings bevorzuge ich die SysCmd-Methode und der Anzeige in der Statusleiste.

    Montag, 12. März 2012 13:56
    Moderator
  • Am 12.03.2012 schrieb Patrick Pohlmann:

    Das heist, ich öffne in der Prozedur ein Formular, dass die bspw. zu ändernden Daten zeigt - oder einfach nur ein ungebundenes Feld hat in das ich die Anzahl der bearbeiteten Datensätze schreibe. Danach verändere ich mit ADO den Datensatz. Sobald ich das getan habe will ich das Formular in den Fucus ziehen und aktualisieren:

    Forms!meinFormular.SetFocus

    Forms!meinFormular.Recalc

    'Danach dann

    cnn.MoveNext

    Setz hier ein DoEvents ein.

    loop

    Evtl. hilft es.

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Montag, 12. März 2012 16:59
  • Winfried,

    genau das mache ich auch immer -> DoEvents

    Mit diesem Befehl erhält Windows die Möglichkeit "zwischendurch" auch andere Routinen durchzuführen z.B. das Formular am Bildschirm zu aktualisieren.

    Gruß

    Jürgen

    Dienstag, 13. März 2012 16:12
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************

    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 20. März 2012 13:42
    Besitzer