PDA

Vollständige Version anzeigen : Instanz einer Klasse


Ernestin
25.06.2001, 09:22
hallo,
ich bräuchte das Äquivalent zu 'me' (für Forms) für die Instanz einer Klasse - z.B. möchte ich aus einer Methode dieser Klasse das sich die Instanz selbst an ein Formular weiterreicht (Daten aus der Instanz werden im Formularkopf angezeigt) - oder hat jemand einen anderen Lösungsansatz? - Bitte um Hilfe!

Stefan Kulpa
26.06.2001, 05:11
<font face="Verdana" size="2">Hallo,

ehrlich gesagt, habe ich nicht ganz verstanden, was Du vor hast ...
Dir ist sicherlich bekannt, dass jede Form in Visual Basic selbst eine Klasse ist und als solche entsprechend referenziert werden kann. Um nun in einer referenzierten Klasse eine Form anzusprechen, kann dies beispielsweise in der Klasseninitialisierung automatisch durchgeführt werden. Dabei kann die Form entweder direkt über deren Namen oder über eine ggf. öffentliche Klasseninstanz der Form angesprochen werden.
Was ist denn genau die Aufgabe?

Gruß</font>

Ernestin
26.06.2001, 05:59
hallo nochmal, das Problem ist wirklich nicht gut rübergekommen - ich probier's nochmal: ich habe eine Klasse A und das dazugehörige Form B zur Detailanzeige. In der Methode A.Show rufe ich B.Show und möchte A in B bekanntmachen, ohne in B.Load nochmals lesen zu müssen, also wollte ich in B ein Set-Property schreiben (Property Set A (byval as Object)) und in A.Show vor dem Aufruf von B.Show sozusagen als Übergabeparameter setzen??? Vielleicht den Echtcode?
Friend Function Show_New()
On Error GoTo Err_Show_New

Dim aFrmAutLSingle As New frm_AutL_Single 'Initialized (erzeugt)
aFrmAutLSingle.mode = "NEW"
...und hier .....
Set aFrmAutLSinge.A=???me???
.................
aFrmAutLSingle.Show vbModal 'geladen
Unload aFrmAutLSingle

Exit_Show_New:
Set aFrmAutLSingle = Nothing
Exit Function
Err_Show_New:
gIErr.InitializeFromAccess
gIErr.Show "clsSecAutL::Show_New"
Resume Exit_Show_New
End Function

vielen Dank für deine Hilfe!

Stefan Kulpa
26.06.2001, 07:53
<font face="Verdana" size="2">Hallo,


das Problem ist die "Lebensdauer" der Objekte.
Wenn man nicht mit einer ActiveX-DLL arbeitet (und nicht die dort möglichen Klasseneingenschaften nutzen kann), wäre wohl der einfachste Weg über eine öffentliche Klassenvariable zu arbeiten.

Beispiel:
Das Ganze startet in einem Modul über eine Sub Main():</font>
<PRE><FONT SIZE=1 FACE=Courier New><FONT COLOR=#000080>Option</FONT> <FONT COLOR=#000080>Explicit</FONT>

<FONT COLOR=#000080>Public</FONT> g_objData <FONT COLOR=#000080>As</FONT> Object
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Sub</FONT> Main()
<FONT COLOR=#000080>Dim</FONT> cDemo <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>New</FONT> CTest
cDemo.Show
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Sub</FONT>

</FONT></PRE>
<hr>
<font face="Verdana" size="2">Die Klasse (CTest) sieht wie folgt aus:</font>
<PRE><FONT SIZE=1 FACE=Courier New><FONT COLOR=#000080>Option</FONT> <FONT COLOR=#000080>Explicit</FONT>

<FONT COLOR=#000080>Dim</FONT> m_sNachname <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>Dim</FONT> m_sVorname <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>Dim</FONT> m_objForm <FONT COLOR=#000080>As</FONT> Form
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Private</FONT> <FONT COLOR=#000080>Sub</FONT> Class_Initialize()
Nachname = "Kulpa"
Vorname = "Stefan"
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Sub</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Sub</FONT> Show()
<FONT COLOR=#000080>Set</FONT> m_objForm = <FONT COLOR=#000080>New</FONT> frmTest
Load m_objForm
frmTest.DataClass = Me
m_objForm.Show
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Sub</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Property</FONT> <FONT COLOR=#000080>Get</FONT> Nachname() <FONT COLOR=#000080>As String</FONT>
Nachname = m_sNachname
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Property</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Property</FONT> Let Nachname(<FONT COLOR=#000080>ByVal</FONT> sNewValue <FONT COLOR=#000080>As String</FONT>)
m_sNachname = sNewValue
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Property</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Property</FONT> <FONT COLOR=#000080>Get</FONT> Vorname() <FONT COLOR=#000080>As String</FONT>
Vorname = m_sVorname
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Property</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Property</FONT> Let Vorname(<FONT COLOR=#000080>ByVal</FONT> sNewValue <FONT COLOR=#000080>As String</FONT>)
m_sVorname = sNewValue
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Property</FONT>

</FONT></PRE>
<font face="Verdana" size="2">Die Klasse ruft eine Instanz der Form auf und "meldet sich dort" via Property als Objekt an.
In der Form selbst kann dann direkt auf die Daten der Klasse zugegriffen werden:
</font>
<PRE><FONT SIZE=1 FACE=Courier New><FONT COLOR=#000080>Option</FONT> <FONT COLOR=#000080>Explicit</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Property</FONT> <FONT COLOR=#000080>Get</FONT> DataClass() <FONT COLOR=#000080>As</FONT> Object
<FONT COLOR=#000080>Set</FONT> DataClass = g_objData
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Property</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Property</FONT> Let DataClass(<FONT COLOR=#000080>ByVal</FONT> vNewValue <FONT COLOR=#000080>As</FONT> Object)
<FONT COLOR=#000080>Set</FONT> g_objData = vNewValue
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Property</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Private</FONT> <FONT COLOR=#000080>Sub</FONT> cmdGetData_Click()
<FONT COLOR=#008000>'** Datenzugriff auf die Klassen-Mitglieder</FONT>
txtNachname.Text = DataClass.Nachname
txtVorname.Text = DataClass.Vorname
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Sub</FONT>

</FONT></PRE>

<font face="Verdana" size="2">Einziger Wermutstropfen ist die globale Klasseninstanz - aber als Alternative zu einer deutlich komplexeren ActiveX-DLL vielleicht akzeptabel, oder?

Gruß</font>