Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Bugs / With...EndWith

With...EndWith-Problem

Das With ... End With-Konstrukt ist ein schönes Hilfmittel, um mehrfach hintereinander auf dasselbe Objekt zuzugreifen (und die Programmausführung wird sogar schneller dadurch). Jedoch gibt es ein wenig bekanntes Problem damit.

Wenn VB auf With obj stößt wird der interne Referenzzähler des Objekts um eins erhöht. Nur wenn VB im weiteren Programmverlauf auf das zugehörige End With stößt, wird dieser Referenzzähler wieder um eins verringert. Passiert dies nicht, so bleibt der Referenzzähler erhöht und das Objekt wird nie mehr freigegeben (zumindest nicht vor der Terminierung der Anwendung)! Auch ein Set obj = Nothing kann dann nicht weiterhelfen!

Hier ein Beispiel, wie man unvermittelt auf das Problem stoßen kann:
Sub Test()
  Dim db As Database
On Error Goto ErrorHandler

  Set db = OpenDatabase(Connect)
  With db
    .TimeOut = 1000
    '...mehr Code...
    .Close
  End With

ErrorHandler:
  Set db = Nothing
  '...mehr Code...
End Sub
Wenn nun ein Fehler innerhalb des With-Blocks auftaucht (z.B. wegen eines Typkonflikts), wird das Objekt "db" trotz Set db = Nothing nie terminieren (solange das Programm läuft).
Übersetzung eines Artikels von Dave Jewell (PC Pro).

© Jost Schwider, 30.04.2000-30.04.2000 - http://vb-tec.de/with.htm