September 19, 2021, 06:39:11

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Formular schließt zu langsam

Begonnen von Florian-BGL, April 28, 2010, 18:03:49

⏪ vorheriges - nächstes ⏩

Florian-BGL

Hallo zusammen,

ich habe eine Datenbank, in deren Verlauf ein Formular mit eien Web Fenster geöffnet wird. Wird nun das Fenster geschossen geht die Anwendung zurück ins das vorherige VBA und arbeitet das weiter ab.
Das Problem ist, das ich eine Fehlermeldung bekomme bevor der nächste Schritt vollzogen wird. Wenn ich das ganze in Einzelschritten ausführe funktioniert das. Es funktioniert auch, wenn ich eine MsgBox einbaue. Dann scheint genug Zeit für das Schließen vorhanden zu sein. Ich habe schon versucht eine Zeitschleife einzubauen funktioniert aber nicht.
Vieleicht noch wichtig, das Webfenster öffnet eine Datei in einem Temp-Verzeichnis. Nach dem Schließen soll über Kill zunächst die Datei und dann das Verzeichnis gelöscht werden. Genau hier kommt es zu dem Problem.

Habt ihr eine Idee?

Vorab danke

Florian BGL

DF6GL

HAllo,

ohne den Code zu sehen, ist nur zu mutmaßen.


Du kannst mal versuchen, an ein paar Stellen im Code
DoEvents
einzubauen.

Florian-BGL

April 28, 2010, 21:01:26 #2 Letzte Bearbeitung: April 28, 2010, 21:06:22 von Florian-BGL

Hallo,
hier ist der Code aus dem WebFormular:

Option Compare Database
Private Declare Function RemoveDirectory Lib _
"kernel32" Alias "RemoveDirectoryA" _
(ByVal lpPathName As String) As Long

Private Sub Btn_Beenden_Click()

Dim Conn6 As New ADODB.Connection
Dim DBS6 As ADODB.Recordset
Set Conn6 = CurrentProject.Connection
   Set DBS6 = New ADODB.Recordset
       DBS6.Open "Tab_Zwischenablage", Conn6, adOpenKeyset, adLockOptimistic
       DBS6.MoveFirst
       DBS6.Delete
       DBS6.Close
DoCmd.Close
DoCmd.OpenForm "Frm_Postbuch_Suche"
End Sub



Private Sub Form_Close()
Dim Conn6 As New ADODB.Connection
Dim DBS6 As ADODB.Recordset
Dim Str_Datenanzahl As String
Set Conn6 = CurrentProject.Connection
Set DBS6 = New ADODB.Recordset
DBS6.Open "Tab_Zwischenablage", Conn6, adOpenKeyset, adLockOptimistic
Str_Datenanzahl = DBS6.RecordCount
 'Wenn ein Datensatz erfasst wurde dann geht es weiter; ansonsten Aufruf der Erfassung für die Ablagepfad der Anlagen
If Str_Datenanzahl = "0" Then GoTo Weiter Else
DBS6.MoveFirst
DBS6.Delete
Weiter:
  DBS6.Close
End Sub

Private Sub Form_Open(Cancel As Integer)
Dim Conn6 As New ADODB.Connection
Dim DBS6 As ADODB.Recordset

Set Conn6 = CurrentProject.Connection
       Set DBS6 = New ADODB.Recordset
       DBS6.Open "Tab_Zwischenablage", Conn6, adOpenKeyset, adLockOptimistic
       DBS6.MoveFirst
       Str_Zwischenablage = DBS6!Zwischenablage
       DBS6.Close
Me.MeinWebBrowser.Navigate Str_Zwischenablage
End Sub



Und hier dann der Code vom Unterformular:

Private Sub Anlage_Click()
   Dim Str_Anlage As String
   Const Verz = "Temp"
   Set Conn4 = CurrentProject.Connection
   Set DBS4 = New ADODB.Recordset
   Set Conn6 = CurrentProject.Connection
   Set DBS6 = New ADODB.Recordset
   DBS4.Open "Tab_Anlagenpfad", Conn4, adOpenKeyset, adLockOptimistic
   DBS4.MoveFirst
   Str_Anlagenpfad = DBS4!Ablage_Anlagen
   DBS4.Close
   Str_Anlage = Me!Anlage
MkDir "V:\Abt3\3.6\Temp"
RestoreBinFile Me!Anlage, "V:\Abt3\3.6\Temp\", True
DBS6.Open "Tab_Zwischenablage", Conn6, adOpenKeyset, adLockOptimistic
DBS6.AddNew
DBS6!Zwischenablage = "V:\Abt3\3.6\Temp\" & Me!Anlage
DBS6.Update
DoCmd.OpenForm "MeinWebBrowser", , , , , acDialog
Kill ("V:\Abt3\3.6\Temp\*.*")
RmDir ("V:\Abt3\3.6\Temp")
 
End Sub


Ich hoffe das hilft weiter.

Gruß
Florian-BGL

Florian-BGL

Hallo zusammen,

hat keiner eine Idee?
Ich habe zwischenzeitlöich verschi9ede Dinge ausprobiert. Wenn ich die Befehle Kill... und RmDir auseinander ziehe also z.B. in unterschiedlichen Formularen ablege funktioniert es.  Es liegt offensichtlich an der Art der Datei. Bei Jepg funktioniert es und bei doc oder xls Dateien wiederum nicht. Wahrscheinlich brauchen diese Dateien länger bis sie geschlossen und gelöscht wurden. Es ist ein eindeutiges Laufzeitproblem. Der Befehl RmDir will das Verzeichnis löschen obwohl noch Dateien enthalten sind.
Vieleicht gibt es einen Befehl der sowohl das Verzeichnis als auch die Dateien löscht. Analog der Verfahrensweise in Explorer.
Was macht denn der Befehl DoEvents? Ich konnte damit nichts anfangen.

Beste grüße
ein ratloser Florian


Florian-BGL

Hallo zusammen,

ich habe mich für folgende Variante entschieden:
Public Function DelTreeVB(ByVal Path As String) As Boolean
Dim sName As String
  If Right$(Path, 1) <> "\" Then
Path = Path & "\"
  End If 
  DelTreeVB = True
  On Error GoTo Error_DelTree1
  sName = Dir$(Path & "*.*", vbHidden + vbDirectory)
  While Len(sName)
If (sName <> ".") And (sName <> "..") Then
   If (GetAttr(Path & sName) Or vbDirectory) = vbDirectory Then
  DelTreeVB = DelTreeVB(Path & sName & "\")
  sName = Dir$(Path & "*.*", vbHidden + vbDirectory)
   Else
  SetAttr Path & sName, vbNormal ' Attribute zurücksetzen
  Kill Path & sName 
  sName = Dir$()  ' nächste Datei suchen
   End If
Else
   sName = Dir$()
End If
  Wend

  RmDir Path
Exit_DelTreeVB:
  Exit Function
Error_DelTreeVB:
 
  DelTreeVB = False
  Resume Next
End Function

Nun meine Frage:
Wo lege ich fest welches Verzeichnis gelöscht wird?
Mache ich das mit Path = "C:\Temp\"

lDanke vorab Florian

DF6GL

Hallo,

den Pfad legst Du beim Aufruf der Funktion als Parameter für deren Argument fest....

Florian-BGL

Hallo,

kannst du mir dafür ein Beispiel nennen?

Das Verzeichnis könnte Beispielhaft "C:\Temp" sein.

danke
Gruß
Florian

DF6GL

Hallo,

wirklich?

If  DelTreeVB("C:/temp")  then
Msgbox "alles paletti"
Else
Msgbox "irgendwas stimmt nicht"
End if

Florian-BGL

Hallo,

vielen Dank funktioniert alles .

Das mit den Parametern hatte ich bislang noch nicht.

Danke
Florian