Discussion:
VBA: selbstdefinierter Variablentyp löschen...?
(zu alt für eine Antwort)
Roland Klassen
2007-01-10 12:57:30 UTC
Permalink
Hallo NG,

Ich habe in einem allgemeinen Modul einen Variablen-Typ definiert:

Type VarTyp
Eigenschaft1 as string
Eigenschaft2 as string
End type

Public VT as VarTyp

Nun werden in einem Formular die Daten gefüllt:

VT.Eigenschaft1 = "blabla"
VT.Eigenschaft2 = "blublu"

und ein Bericht geöffnet.

Beim Schließen des Berichts sollen sich die Variable VT jedoch wieder
"leeren". Gibts hier nicht etwas einfaches wie z. b. set VT = nothing (o.
ä.) oder muß ich die ganzen Eigenschaften separat löschen...?

Vielen Dank für Eure Hilfe...

Gruß Roland
Mark Doerbandt
2007-01-10 13:04:27 UTC
Permalink
Hallo, Roland,
Post by Roland Klassen
Beim Schließen des Berichts sollen sich die Variable VT jedoch wieder
"leeren". Gibts hier nicht etwas einfaches wie z. b. set VT = nothing (o.
ä.) oder muß ich die ganzen Eigenschaften separat löschen...?
Du koenntest Dir eine kleine Funktion schreiben, die eine solche
Variable uebergeben bekommt und alle Eigenschaften loescht.

Oder Du nutzt gleich eine Klasse, dann geht Dein gewuenschtes Set =
Nothing.

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Roland Klassen
2007-01-10 13:27:13 UTC
Permalink
Post by Mark Doerbandt
Post by Roland Klassen
Beim Schließen des Berichts sollen sich die Variable VT jedoch wieder
"leeren". Gibts hier nicht etwas einfaches wie z. b. set VT = nothing (o.
ä.) oder muß ich die ganzen Eigenschaften separat löschen...?
Du koenntest Dir eine kleine Funktion schreiben, die eine solche
Variable uebergeben bekommt und alle Eigenschaften loescht.
So hab ich's gemacht... :-)
Post by Mark Doerbandt
Oder Du nutzt gleich eine Klasse, dann geht Dein gewuenschtes Set =
Nothing.
Iss mir (noch) zu hoch... mit Klassen kenn ich mich nocht nicht so aus...

Vielen Dank für Eure Hilfe...

Gruß Roland
Mark Doerbandt
2007-01-10 13:33:53 UTC
Permalink
Hallo, Roland,
Post by Roland Klassen
Iss mir (noch) zu hoch... mit Klassen kenn ich mich nocht nicht so aus...
LOL - das ist ja echt der Bringer: Roland Klassen kennt sich mit
Klassen noch nicht so aus! ;-) Wird aber Zeit!

Gruss - Mark
Roland Klassen
2007-01-10 13:42:34 UTC
Permalink
Post by Mark Doerbandt
Post by Roland Klassen
Iss mir (noch) zu hoch... mit Klassen kenn ich mich nocht nicht so aus...
LOL - das ist ja echt der Bringer: Roland Klassen kennt sich mit
Klassen noch nicht so aus! ;-) Wird aber Zeit!
...können ein schwieriges Völkchen sein... die Klassens... ;-)
Reiner Wolff
2007-01-10 21:03:18 UTC
Permalink
Moin Roland,
Post by Roland Klassen
Post by Mark Doerbandt
Post by Roland Klassen
Beim Schließen des Berichts sollen sich die Variable VT jedoch wieder
"leeren". Gibts hier nicht etwas einfaches wie z. b. set VT = nothing (o.
ä.) oder muß ich die ganzen Eigenschaften separat löschen...?
[...]
Post by Roland Klassen
Post by Mark Doerbandt
Oder Du nutzt gleich eine Klasse, dann geht Dein gewuenschtes Set =
Nothing.
Iss mir (noch) zu hoch... mit Klassen kenn ich mich nocht nicht so aus...
Vielleicht wäre das ja der richtige Zeitpunkt, Deine erste Klasse zu
"schreiben".
Für Dein Typ-Beispiel sähe das (vorsicht, ist ganz kurz) wohl so aus:
'Code in der Klasse 'clsVar'
Public Eigenschaft1 As String
Public Eigenschaft2 As String

'Code in Deinem Formular
Private/Public VT As clsVar

Set VT = New clsVar
VT.Eigenschaft1 = "blabla"
VT.Eigenschaft2 = "blublu"
'.. weiterer Code
'und wieder zurücksetzen
Set VT = Nothing
<<<<

Ist nicht wirklich komplizierter oder komplexer als eine Type-Deklaration,
kann aber deutlich mehr, d.h. die Erweiterbarkeit ist groß.

Vielleicht hilft's ja...

Gruß aus Kiel
Reiner
--
airconditioned environent - do not open windows
Jörg Ostendorp
2007-01-10 21:09:57 UTC
Permalink
Moin Reiner,
Post by Reiner Wolff
'Code in der Klasse 'clsVar'
Public Eigenschaft1 As String
Public Eigenschaft2 As String
'Code in Deinem Formular
Private/Public VT As clsVar
Set VT = New clsVar
VT.Eigenschaft1 = "blabla"
VT.Eigenschaft2 = "blublu"
'.. weiterer Code
'und wieder zurücksetzen
Set VT = Nothing
<<<<
Ist nicht wirklich komplizierter oder komplexer als eine Type-Deklaration,
kann aber deutlich mehr, d.h. die Erweiterbarkeit ist groß.
Man könnte aus den beiden Variablen des ursprünglichen Types auch zwei
Klassen machen. SCNR :-)
--
Grüßle vom Bodensee
Jörg Ostendorp

- Access-FAQ: www.donkarl.com
- my home: www.meersburg.de
Reiner Wolff
2007-01-10 21:51:56 UTC
Permalink
Moin Jörg,
Post by Jörg Ostendorp
Man könnte aus den beiden Variablen des ursprünglichen Types auch zwei
Klassen machen. SCNR :-)
Man kann sich auch 'ne Frikadelle ans Knie nageln ...

Gruß aus Kiel
Reiner
--
Wenn eine Idee nicht zuerst absurd erscheint, taugt sie nichts.
(Albert Einstein)
Roland Klassen
2007-01-12 09:49:55 UTC
Permalink
Post by Reiner Wolff
Post by Roland Klassen
Post by Mark Doerbandt
Post by Roland Klassen
Beim Schließen des Berichts sollen sich die Variable VT jedoch wieder
"leeren". Gibts hier nicht etwas einfaches wie z. b. set VT = nothing (o.
ä.) oder muß ich die ganzen Eigenschaften separat löschen...?
[...]
Post by Roland Klassen
Post by Mark Doerbandt
Oder Du nutzt gleich eine Klasse, dann geht Dein gewuenschtes Set =
Nothing.
Iss mir (noch) zu hoch... mit Klassen kenn ich mich nocht nicht so aus...
Vielleicht wäre das ja der richtige Zeitpunkt, Deine erste Klasse zu
"schreiben".
'Code in der Klasse 'clsVar'
Public Eigenschaft1 As String
Public Eigenschaft2 As String
'Code in Deinem Formular
Private/Public VT As clsVar
Set VT = New clsVar
VT.Eigenschaft1 = "blabla"
VT.Eigenschaft2 = "blublu"
'.. weiterer Code
'und wieder zurücksetzen
Set VT = Nothing
<<<<
Ist nicht wirklich komplizierter oder komplexer als eine Type-Deklaration,
kann aber deutlich mehr, d.h. die Erweiterbarkeit ist groß.
Vielleicht hilft's ja...
In der Tat muß ich sagen, daß sieht recht unkompliziert aus - und für mein
Verständnis ist's sogar etwas einleuchtender als manch komplizierter
Erklärungsversuch in der Literatur...! (konnte bisher nicht viel mit
Klassenobjekten anfangen...) :-)

Gruß Roland
Reiner Wolff
2007-01-12 22:17:56 UTC
Permalink
Moin Roland,
Post by Roland Klassen
Post by Reiner Wolff
Ist nicht wirklich komplizierter oder komplexer als eine Type-Deklaration,
kann aber deutlich mehr, d.h. die Erweiterbarkeit ist groß.
Vielleicht hilft's ja...
In der Tat muß ich sagen, daß sieht recht unkompliziert aus - und für mein
Verständnis ist's sogar etwas einleuchtender als manch komplizierter
Erklärungsversuch in der Literatur...!
Vielen Dank für das (positive) Feedback.
Post by Roland Klassen
(konnte bisher nicht viel mit Klassenobjekten anfangen...) :-)
Mach' Dir nichts draus, wenn ich mir .Net ansehe, habe ich auch immer das
Gefühl, ich habe überhaupt keine Ahnung.

Gruß aus Kiel
Reiner
--
Wenn eine Idee nicht zuerst absurd erscheint, taugt sie nichts.
(Albert Einstein)
Roland Klassen
2007-01-18 12:14:16 UTC
Permalink
Post by Reiner Wolff
Post by Roland Klassen
Post by Reiner Wolff
Ist nicht wirklich komplizierter oder komplexer als eine
Type-Deklaration,
kann aber deutlich mehr, d.h. die Erweiterbarkeit ist groß.
Vielleicht hilft's ja...
In der Tat muß ich sagen, daß sieht recht unkompliziert aus - und für mein
Verständnis ist's sogar etwas einleuchtender als manch komplizierter
Erklärungsversuch in der Literatur...!
Vielen Dank für das (positive) Feedback.
Post by Roland Klassen
(konnte bisher nicht viel mit Klassenobjekten anfangen...) :-)
Mach' Dir nichts draus, wenn ich mir .Net ansehe, habe ich auch immer das
Gefühl, ich habe überhaupt keine Ahnung.
Habe jetzt meine Type-Lösung auf die Klassenmodul-Lösung umgestellt.
Funktioniert genauso. :-) Was sind denn nun eigentlich die Hauptvorteile an
dieser Methode...? Schätze, daß es bei meinem simplen Beispiel auf das
gleiche hinausläuft, ich aber mit einem Klassenmodul noch weitaus mehr
bewirken kann als mit einer "getypeten" Variablen...?

Danke + Gruß Roland
Reiner Wolff
2007-01-18 17:26:48 UTC
Permalink
Moin Roland,
Post by Roland Klassen
Habe jetzt meine Type-Lösung auf die Klassenmodul-Lösung umgestellt.
Funktioniert genauso. :-) Was sind denn nun eigentlich die Hauptvorteile an
dieser Methode...? Schätze, daß es bei meinem simplen Beispiel auf das
gleiche hinausläuft, ich aber mit einem Klassenmodul noch weitaus mehr
bewirken kann als mit einer "getypeten" Variablen...?
Richtig.
Als Vorteile von Klassen empfinde ich (im Gegensatz zu einer
Type-Deklaration):
- ich kann Variablen mit WithEvents deklarieren und so auf
Ereignisse anderer Objekte reagieren
- ich kann meinerseits eigene Ereignisse erzeugen und so
zB vorhandene Objekte um diese erweitern
- ich kann Eigenschaften lediglich schreibend oder lesend anlegen
- es treten Ereignisse ein, wenn die Variable initialisiert und/oder
wieder frei gegeben wird


Das ist sicherlich nur ein Ausschnitt, aber mehr fällt mir jetzt grad nicht
ein. In Deinem konkreten Beispiel sehe ich an der Lösung mit einer Klasse
überhaupt keine Vorteile ggü. einer Type-Deklaration.
Die Variante ist lediglich geeignet, um Dir vielleicht die Arbeitsweise
einer Klasse etwas näher zu bringen. Wenn man sich den Code dazu anschaut,
gibt es doch eigentlich nur zwei Gedankengänge, die einem dabei einfallen:
1. "Wieso geht das überhaupt?"
2. "Was, so einfach kann eine Klasse sein?"

Gruß aus Kiel
Reiner
--
COMPUTER ARBEITEN BINAER: ENTWEDER SIE FUNKTIONIEREN ODER SIE SIND KAPUTT.
Stefan Dase
2007-01-10 13:11:54 UTC
Permalink
Hallo Roland,
Post by Roland Klassen
Type VarTyp
Eigenschaft1 as string
Eigenschaft2 as string
End type
Public VT as VarTyp
(...)
Beim Schließen des Berichts sollen sich die Variable VT jedoch wieder
"leeren". Gibts hier nicht etwas einfaches wie z. b. set VT = nothing
(o. ä.) oder muß ich die ganzen Eigenschaften separat löschen...?
Im engeren Sinne des Interpreters sind die beiden Eigenschaften ab der
öffentlichen Deklaration der Variablen VT vorhanden und mit einem leeren
String vorbelegt. Wenn du andere Werte wünscht, musst du diesen jeweils
explizit zuweisen. Aus meiner Sicht macht es keinen Unterschied, ob eine
leere Zeichenkette oder ein anderer Wert enthalten ist, so lange in
deinem Programmcode vor jedem Auslesen das entsprechende Schreiben erfolgt.

Ansonsten könntest du eine Klasse definieren und diese mit einer Methode
"Clear" versehen, die dir die Eigenschaften der Klasse auf definierte
Werte zurücksetzt.

HTH,
Stefan
Jörg Ostendorp
2007-01-10 13:33:11 UTC
Permalink
Hallo Roland,
Post by Roland Klassen
Type VarTyp
Eigenschaft1 as string
Eigenschaft2 as string
End type
Public VT as VarTyp
VT.Eigenschaft1 = "blabla"
VT.Eigenschaft2 = "blublu"
und ein Bericht geöffnet.
Beim Schließen des Berichts sollen sich die Variable VT jedoch wieder
"leeren". Gibts hier nicht etwas einfaches wie z. b. set VT = nothing (o.
ä.) oder muß ich die ganzen Eigenschaften separat löschen...?
nein, verwende eine zweite, leere Variable:

dim vt2 as vartype
vt = vt2
--
Grüßle vom Bodensee
Jörg Ostendorp

- Access-FAQ: www.donkarl.com
- my home: www.meersburg.de
Roland Klassen
2007-01-10 13:44:32 UTC
Permalink
Post by Jörg Ostendorp
Post by Roland Klassen
Type VarTyp
Eigenschaft1 as string
Eigenschaft2 as string
End type
Public VT as VarTyp
VT.Eigenschaft1 = "blabla"
VT.Eigenschaft2 = "blublu"
und ein Bericht geöffnet.
Beim Schließen des Berichts sollen sich die Variable VT jedoch wieder
"leeren". Gibts hier nicht etwas einfaches wie z. b. set VT = nothing (o.
ä.) oder muß ich die ganzen Eigenschaften separat löschen...?
dim vt2 as vartype
vt = vt2
Na das iss ja mal ein "galanter" Weg... :-) Vielen Dank + Gruß, Roland
Mark Doerbandt
2007-01-10 14:07:17 UTC
Permalink
Hallo, Jörg,
also, nicht dass ich pingelig sein will: aber das verbraucht den
doppelten Speicherplatz.

Ich finde das unelegant! ;-)

Gruss - Mark
Jörg Ostendorp
2007-01-10 14:15:59 UTC
Permalink
Hallo Mark,
Post by Mark Doerbandt
also, nicht dass ich pingelig sein will: aber das verbraucht den
doppelten Speicherplatz.
Ich finde das unelegant! ;-)
Wie immer hast Du natürlich recht! Der richtige Weg wäre selbstredend:

Private Declare Sub CopyMemory _
Lib "kernel32.dll" _
Alias "RtlMoveMemory" ( _
ByRef Destination As Any, _
ByRef Source As Any, _
ByVal Length As Long _
)

Public Sub VTLeerMachen()
CopyMemory vt, 0&, Len(vt)
end sub

Sorry! ;-)
--
Grüßle vom Bodensee
Jörg Ostendorp

- Access-FAQ: www.donkarl.com
- my home: www.meersburg.de
Mark Doerbandt
2007-01-10 14:22:25 UTC
Permalink
Hallo, Jörg,
Post by Jörg Ostendorp
Private Declare Sub CopyMemory _
LOL! Eine /gute/ Antwort!

Gruss - Mark
Bernd Heumann
2007-01-10 13:44:37 UTC
Permalink
Post by Roland Klassen
Hallo NG,
Type VarTyp
Eigenschaft1 as string
Eigenschaft2 as string
End type
Public VT as VarTyp
VT.Eigenschaft1 = "blabla"
VT.Eigenschaft2 = "blublu"
und ein Bericht geöffnet.
Beim Schließen des Berichts sollen sich die Variable VT jedoch wieder
"leeren". Gibts hier nicht etwas einfaches wie z. b. set VT = nothing
(o. ä.) oder muß ich die ganzen Eigenschaften separat löschen...?
Vielen Dank für Eure Hilfe...
Gruß Roland
Hallo Roland
Du kannst einfach eine 'leere' Variable des gleichen Typs zuweisen:

sub clearVT()
Dim nt as VarTyp
VT=nt
end sub

Grüße
Bernd
--
FAQ: http://www.donkarl.com
Thomas Möller
2007-01-10 21:09:11 UTC
Permalink
Hallo Roland,
Post by Roland Klassen
Type VarTyp
Eigenschaft1 as string
Eigenschaft2 as string
End type
Antworten und Möglichkeiten hast Du ja jetzt.

Was mir noch auffällt, ist das Du den Scope / Gültigkeitsbereich der
Deklaration für den Type nicht explizit festlegst.
Du solltest generell schon festlegen, ob "Public" oder "Private". Wenn
Du es nicht tust, dann macht es VBA implizit für Dich. Aber wie ist es
denn nun? Public oder Private? Ist das in einem Formularmodul gar anders
als in einem Standardmodul?
Diese Fragen kannst Du Dir sparen, wenn Du gleich explizit den
Gültigkeitsbereich Deiner Type-Definition festlegst.

CU
--
Thomas

Homepage: www.Team-Moeller.de
Henry Habermacher [MVP Access]
2007-01-11 14:34:19 UTC
Permalink
Hallo Roland
Post by Roland Klassen
Type VarTyp
Eigenschaft1 as string
Eigenschaft2 as string
End type
Public VT as VarTyp
VT.Eigenschaft1 = "blabla"
VT.Eigenschaft2 = "blublu"
und ein Bericht geöffnet.
Wenn Du wirlich löschen willst, kannst Du die Erase Funktion benutzen.
Da Erase nur für Arrays geeignet ist, dort aber ein beschriebenes Verfahren
beinhaltet, wie es Arrays von UDDTs löscht, kannst Du folgendes machen:

VT.Eigenschaft1 = "blabla"
VT.Eigenschaft2 = "blublu"
MsgBox VT.Eigenschaft1 & " - " & VT.Eigenschaft2
Dim arrVT(1 To 1) As VarTyp
arrVT(1) = VT
Erase arrVT
VT = arrVT(1)
MsgBox VT.Eigenschaft1 & " - " & VT.Eigenschaft2

Alternativ: VT gleich als Array von VarTyp anlegen, also:

Public VT(1 to 1) as VarTyp

Dann kannst Du mit Erase VT() dieses direkt löschen. Die Referenzierung wird
dann aber ein bisschen umständlicher, weil Du überall (1) mit angeben musst.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Loading...