Objektvariable wird nicht freigegeben

10/12/2008 - 08:54 von Susann Markward | Report spam
Hallo,

ich habe ein anscheinend gerade einen Denkfehler. Ich möchte zur
Fehlerdokumentation es dem Kunden ermöglichen einen ScreenShot seines
Desktops anzufertigen (vielen Kunden kennen einfach nicht die
Tastenkombination ALT+DRUCK). Also habe ich einen Button implementiert,
der beim Drücken desselben einfach die Funktion ScreenShot aufruft.

Hier der relevante Teil des Codes:
Private Sub ButtonScreenShot_Click()

Call ScreenShot

End Sub

Private Sub ScreenShot()

Dim ScreenShotPicture As PictureBox
Set ScreenShotPicture = Me.Controls.Add("VB.PictureBox", _
"ScreenShotPicture")
...
<SourceCode für die Implementaion der ScreenShot-Funktion>
...
Set ScreenShotPicture = Nothing

End Sub

Also die ScreenShot-Funktion funktioniert wunderbar. Zumindest das erste
Mal. Nur wenn ich den ButtonScreenShot ein zweites Mal betàtige kommt
folgender Laufzeitfehler:

,--
|Laufzeitfehler '727':
|Es ist bereits ein Steuerelement mit dem Namen 'ScreenShotPicture'
|vorhanden.
`--

Ich dachte immer, dass durch 'Set xyz = Nothing' auch das Objekt
zerstört wird. Scheinbar wird aber nicht das Objekt zerstört, sondern
nur die Verbindung zwischen der Variablen und dem Objekt. Wie kann ich
das Objekt zerstören?


Danke für die Hilfe
Susann
 

Lesen sie die antworten

#1 Christian Zimmermann
10/12/2008 - 09:15 | Warnen spam
Hallo Susann,

Susann Markward schrieb:

ich habe ein anscheinend gerade einen Denkfehler. Ich möchte zur
Fehlerdokumentation es dem Kunden ermöglichen einen ScreenShot seines
Desktops anzufertigen (vielen Kunden kennen einfach nicht die
Tastenkombination ALT+DRUCK). Also habe ich einen Button implementiert,
der beim Drücken desselben einfach die Funktion ScreenShot aufruft.

Hier der relevante Teil des Codes:
Private Sub ButtonScreenShot_Click()

Call ScreenShot

End Sub

Private Sub ScreenShot()

Dim ScreenShotPicture As PictureBox
Set ScreenShotPicture = Me.Controls.Add("VB.PictureBox", _
"ScreenShotPicture")
...
<SourceCode für die Implementaion der ScreenShot-Funktion>
...
Set ScreenShotPicture = Nothing

End Sub

Also die ScreenShot-Funktion funktioniert wunderbar. Zumindest das erste
Mal. Nur wenn ich den ButtonScreenShot ein zweites Mal betàtige kommt
folgender Laufzeitfehler:

,--
|Laufzeitfehler '727':
|Es ist bereits ein Steuerelement mit dem Namen 'ScreenShotPicture'
|vorhanden.
`--

Ich dachte immer, dass durch 'Set xyz = Nothing' auch das Objekt
zerstört wird. Scheinbar wird aber nicht das Objekt zerstört, sondern
nur die Verbindung zwischen der Variablen und dem Objekt. Wie kann ich
das Objekt zerstören?



Per Me.Controls.Remove "ScreenShotPicture". Du hast einmal
ScreenShotPicture als Steuerelement und einmal als lokales Objekt in der
Prozedur ScreenShot. Daher müssen auch beide wieder entfernt werden bzw.
das passiert beim lokalen Objekt automatisch wenn die Prozedur beendet
wird. Controls.Add fügt persistent hinzu, d. h. das hinzugefügte
Steuerelement überlebt das Verlassen der Prozedur.

Aber warum gehst du den "Umweg" über eine PictureBox? Der Screenshot
soll doch nur im Hintergrund verarbeitet und nicht auf der Form
angezeigt werden, oder? Ein "As StdPicture" deklariertes Objekt sollte
dann ausreichen und du brauchst den Weg über Controls.Add und .Remove
nicht gehen.

Gruß

Christian

Ähnliche fragen