Seite 1 von 1

Referenz löschen?

Verfasst: Mo, 05.11.2007 03:07
von Bubi Meier
Guten Abend, meine Damen und Herren,

weiß zufällig jemand, wie man in Open Office Basic eine Objektreferenz löschen kann? Ich meine nicht dispose(), damit wird das Objekt ins Nirvana geschickt. Ich meine, wie kann ich einer Objektreferenz die 'Null' zuweisen.

z.B.

Code: Alles auswählen

Dim DLG As Object

Sub Main
DialogLibraries.LoadLibrary("Standard")
Dlg=CreateUnoDialog(DialogLibraries.Standard.Dialog1)
DLG.execute()
DLG.dispose()
end sub


erzeugt einen Dialog, führt diesen aus und vernichtet ihn anschliesend. Wie bekomme ich jetzt die Null ins DLG, sodas isNull(DLG) = True ist?

Re: Referenz löschen?

Verfasst: Mo, 05.11.2007 06:40
von komma4

Code: Alles auswählen

DLG = NULL
NULL ist eine undokumentierte Variable (?) mit konstatem (!) Nicht-Inhalt und ohne Deklaration des Typs

... oder so ... :-)

Re: Referenz löschen?

Verfasst: Mo, 05.11.2007 18:35
von Bubi Meier
Hmm,

DLG = NULL

führt bei mir zu:

<Palim palim> 'Kein Zugriff auf Objekt , Falsche Verwendung eines Objektes'

Geht DLG = NULL bei dir?

Re: Referenz löschen?

Verfasst: Di, 06.11.2007 08:36
von Toxitom
Hey Bubi,

mit ist zwar überhaupt nicht klar, was du eigentlich erreichen willst???
Aber: "Null" ist - wie komma4 schon erwähnt hat, eine Sonderform des Objektes - tritt ein, wenn ein Objekt zwar deklariert wurde (also erzeugt), noch nicht aber zugewiesen:

Code: Alles auswählen

dim oObj as object
msgbox isNull(oObj)  'liefert -> true
Wenn du das also wieder erreichen willst, so deklariere das Objekt einfach neu - dann ist es wieder "Null".

Code: Alles auswählen

dim oObj as object
msgbox isNull(oObj)  'liefert -> true
oObj = thisComponent
msgbox isNull(oObj)  'liefert -> false
redim oObj as object
msgbox isNull(oObj)  'liefert -> true
Nur - wie gesagt, mir ist dein Wunsch nicht klar. Wahrscheinlich gibt es andere, sinnvollere Möglichkeiten zir Erreichung deines Ziels. Nur dafür müsste man mehr wissen ;-)

Gruss
Thomas

Re: Referenz löschen?

Verfasst: Di, 06.11.2007 23:45
von Bubi Meier
Nun, mein Anliegen kommt aus der Erkenntnis, dass ooBasic mit den Objekten scheinbar ähnlich wie Java umgeht. Z.B.

Code: Alles auswählen

type Struktur1
	a as integer
end type

Sub Main

Dim Obj1 as Struktur1
Dim Obj2 as object

Obj1.a = 100  '(1)

print "isNull(Obj1)";isNull(Obj1); "    isNull(Obj2)";isNull(Obj2)

Obj2 = Obj1 ' (2)
print "Obj1.a: "; Obj1.a ;"  Obj2.a: "; Obj2.a 
Obj2.a = 200
print "Obj1.a: "; Obj1.a ;"  Obj2.a: "; Obj2.a 
end sub

zeigt, dass die 'Variable' Obj2 nach der Deklaration mit NULL versehen ist, Obj1 offenbar nicht. Bei (2) wird diese 'Referenz' auf Obj1 ausgerichtet und sämtliche Änderungen an Ob2 wirken auch auf Obj1. Wobei Obj1 und Obj2 sowieso dasselbe Objekt sind.
Dies Verhalten ist wenig anders als in Java, auch C++ kann mit solchen Referenzen funktionieren.

Allerdings hat man in Java oder C++ die beiden schönen Operatoren new und delete, die die Geburt und die Vernichtung der Objekte sicherstellen. In ooBasic gibts es auch new, oder auch entsprechende CreateUno... Funktionen, ein delete gibts meines Wissens nicht. Ich denke mal, dispose() ist kein wirklicher Ersatz, weil man dispose nicht für eigene Objekte realisieren kann.

Nun, wie dem auch sei, in Java oder C++ wird die NichtExistens eines Objektes gerne mit der Referenz NULL dokumentiert. Das macht in vielen Fällen Sinn. Der eingängigste Sinn liegt beispielsweise im Epilog eines Programms: Wenn ich mehrere Resourcen im Program geöffnet habe, aber nicht so genau weiß welche, so könnte man diese einfach mit

if isNull(Resource) then Resource.dispose()

wieder freigeben. Das klappt allerdings nicht, wenn die Resource im Prgramm schon mal geöffnet und disposed wurde, weil man scheinbar die Null nicht in die Referenz schreiben kann.

Ganz interessant ist in diesem Zusammenhang, dass eine NULL als Funktionsparameter ganz selbstverständlich akzeptiert wird:

Wenn irgendwo

SUB Funktion (Para1 AS Object)

steht, und man schreibt irgendwo anders als Funktionsaufruf

Funktion(NULL)

klappt das so, wie man sich das denkt.

Das übergebene Objekt ist dann eben Null, was in meinen Augen auch sehr viel Sinn machen kann.
Offenbar ist NULL eine 'Quasi Konstante'.

-bm