Problem: Objekte dereferenzieren

Hallo zusammen,

ich stehe vor einem fundamentalen Problem in VB6, weil ich meine bisherigen Typen in Klassen umwandeln muss, damit sie über ein VBScript zugänglich werden. Folgendes:

Sagen wir ich will einen Manager für Texturen schreiben, im Grunde also eine Sammlung von Funktionen wie z.B. LoadTexture oder UnloadTexture, die intern die Texturen verwaltet. Wenn das Programm beendet wird soll sie natürlich alle geladenen Texturen wieder releasen. Soweit so gut.

Logischerweise muss der Manager nun alle Texturen irgendwo speichern, in einem Array oder in einer Collection, spielt hierfür keine Rolle. Und jetzt kommt die Entscheidung ob die Texturen entweder Typen oder Objekte sein sollen - macht eigentlich auch keinen Unterschied weil sie am Ende einfach nur ein paar Eigenschaften beinhalten (z.b. Breite und Höhe der Textur sowie ein Verweise auf das DirectX-Surface).

Okay, sagen wir es sind Typen (wie ichs jetzt habe). Der Manager speichert die Typen in einem Array und gibt mir jeweils den Index zurück und wenn ich eine Textur auf den Bildschirm zeichnen will rufe ich DrawTexture auf und gebe diesen Index weiter (damit die Funktion dann auf den Array zugreifen und das Surface rausholen kann). Klappt soweit bestens. Nun sagen wir aber ich will eine Textur löschen, dann kann ich die nicht aus dem Array löschen weil sonst die nachfolgenden Indizes nicht mehr stimmen würden - alles was ich tun kann ist die Textur als gelöscht zu markieren und beim nächsten LoadTexture diesen Platz im Array wiederverwerten. Mit Klassen, die ja intern referenziert werden, könnte ich den Array beliebig verändern.
Dann kommt noch das Problem, dass ich zusätzlich VBScript verwenden möchte und dort nur Objekte verwenden kann - also schon zwei Punkte um auf Klassen umzusteigen.

Gut, sagen wir also ich schreibe dan Manager mit Klassen. Soweit alles wie vorher, Texturobjekt wird geladen und intern in einen Array oder eine Collection gespeichert, nur diesmal kriege ich ein Objekt zurück (also eine Referenz). Will ich die Textur entfernen genau dasselbe wie vorher, nur dass diesmal der Array geändert werden kann (weil die Referenzen erhalten bleiben) aber hier kommt nun das Problem:

Sowohl der Array wie auch meine Variable verweisen auf dieses Objekt, der Manager kann aber nur seine Referenz (den Array) auflösen. Angenommen mehrere Sprites benutzen dieselbe Textur, so kann ich unmöglich alle Referenzen löschen - was dazu führt, dass das Texturobjekt einfach im Speicher bleibt.

Der einzige Weg den ich bisher sehe ist, zwar Klassen zu verwenden, aber sie nicht zu referenzieren sondern (wie bei den Typen) mit Indizes zu arbeiten - wodurch ich wiederum den Array nicht verändern darf. Irgendwie ein Zweickmühle, hm?

Hat da jemand Erfahrung mit und kann mir einen guten Ratschlag geben?

Verbindlichsten Dank,

Jemrijà

Hi
ich kenne zwar den Unterschied nicht zwischen Klassen und Objekten (vielleicht sagt mir den ja jemand), daher denke ich jetzt vielleicht sehr einfach.
Wo liegt das Problem, wenn du der Textur die du löschen möchtest einfach eine sinnvolle logische Variable zuweist, aus der hervorgeht,
das diese Textur jetzt gelöscht wurde bzw. momentan leer ist.

Wenn vorher B60, H70, C871 oder was weiss ich drin steht, steht nach dem löschen eben XXX drin. dann weiss das Programm, das die Variable bzw. Textur gelöscht wurde oder jetzt leer ist. Damit kannst du dann wiederum den entsprechenden Knopf oder was weiss ich ansprechen und diesen evtl. dann auch löschen.

Keine gute Idee???

Mfg Werner

Du kannst mehrere Klassen z.B. auch in einer Collection speichern.

Dim col As Collection
Dim cls As Class1
Set col = New Collection
Set cls = New Class1
Call col.Add(cls, "K\_01") 'Klasse in der Collection speichern - mit einem Key
Set cls = Nothing
Set cls = New Class1
Call col.Add(cls, "K\_02") 'noch eine Klasse in der Collection speichern - mit einem anderen Key
Set cls = Nothing
Set cls = col.Item("K\_01") 'Klasse wieder auslesen
Set cls = Nothing
Call col.Remove("K\_01") 'Klasse aus Collection löschen
Set col = Nothing 'die Collection zerstören

Vielleicht hilft Dir das weiter?!?
greets from michL (vienna)