Zugriffsproblem innerhalb einer Klasse

02/05/2009 - 07:09 von Nicolas Nickisch | Report spam
Hi NG,
ich quàle mich mit einer selbstgeschriebenen Klasse herum.

Public Class xyz
Dim Withevents USB as new System.IO.Ports.SerialPort

...
Shared Sub SendMOB(msg)
USB.Write ...
End sub
end class

Ziel ist folgendes:
Ich möchte von aussen die Methode SendMOB der Klasse aufrufen können. Dazu
wurde im Hauptprogramm angegeben:
Dim WithEvents MyClass as new xyz

Gebe ich jetzt MyClass. ein, dann taucht die Methode SendMOb nicht in der
IntelliSense auf.
Ich muss xyz.SendMOb eingeben, damit die Methode SendMOb akzeptiert wird.

Warum kann ich nicht den Verweis Myclass verwenden ?

Nàchstes Problem:
Mit der oben geschilderten Schreibweise bleibt ein weiteres Porblem
bestehen:

Die Anweisung USB.Write verursacht einen Fehler mit dem Hinweis ' Auf einen
Instanzmember einer Klase kann nicht ohne explizite Instanz einer Klasse von
einer freigegebenen Methode aus verwiesen werden'

Meine Versuche an der Anweisung Dim WithEvens USB ... zu drehen haben nichts
gebracht.
Was kann ich tun ?

Gruss Nico
 

Lesen sie die antworten

#1 Peter Götz
02/05/2009 - 09:22 | Warnen spam
Hallo Nicolas,

Public Class xyz
Dim Withevents USB as new System.IO.Ports.SerialPort

...
Shared Sub SendMOB(msg)
USB.Write ...
End sub
end class

Ziel ist folgendes:
Ich möchte von aussen die Methode SendMOB der Klasse aufrufen
können. Dazu wurde im Hauptprogramm angegeben:
Dim WithEvents MyClass as new xyz



Damit hast Du eine Objektvariable erstellt, die einen Verweis
auf eine Instanz einer Klasse vom Typ xyz aufnehmen kann.
Diese Objektvariable zeigt aber noch auf keine Instanz sondern
erst mal auf Nothing, also auf nichts.


Gebe ich jetzt MyClass. ein, dann taucht die Methode
SendMOb nicht in der IntelliSense auf.



Bisher hast Du keine Instanz Deiner Klasse xyz erstellt.
Dazu müsstes Du nach der Deklaration

Dim WithEvents MyClass as new xyz

in irgendeiner Prozedur eine Instanz von xyz erstellen:

Private Sub AnySub ()
MyClass = New xyz
End sub

Mit dem Schlüsselwort "New" erstellst Du eine neue
Instanz der Klasse xyz und die Objektvariable MyClass
zeigt nun nicht mehr auf Nothing sondern auf eben diese
neue Instanz.

Nun gibt es aber noch zu bedenken, dass Du in Deiner
Klasse xyz die Sub SendMOB(msg) als "Shared"
deklariert hast. Dies bedeutet, dass diese Sub nur
einmal, unabhàngig von irgendeiner Instanz Deiner
Klasse xyz existiert und wg. "Shared" ohne vorherige
Instanzierung der Klasse direkt mit

xyz.SendMOB(msg)

aufzurufen ist.

Ich muss xyz.SendMOB eingeben, damit die Methode
SendMOb akzeptiert wird.

Warum kann ich nicht den Verweis Myclass verwenden ?



Weil Deine SubMOB() als Shared deklariert ist, also ein
statische Methode ist, und deshalb unabhàngig davon,
ob es keine, eine oder mehr Instanzen Deiner Klasse xyz
gibt, immer nur einmal existiert.

Hàttest Du Deine Sub SendMOB ohne Shared deklariert,
müsstest Du erst mal eine Instanz der Klasse xyz erstellen

Objektvariable = New xyz

und könntest erst dann Deine Sub SendMOB via

Objektvariable.SendMOB()

aufrufen.



Nàchstes Problem:
Mit der oben geschilderten Schreibweise bleibt ein
weiteres Porblem bestehen:

Die Anweisung USB.Write verursacht einen Fehler mit
dem Hinweis ' Auf einen Instanzmember einer Klase
kann nicht ohne explizite Instanz einer Klasse von
einer freigegebenen Methode aus verwiesen werden'



Du hast in Deinem Beispielcode nirgendwo eine Instanz
einer Klasse USB erstellt und offenbar ist in der Klasse
USB die Prozedur USB.Write ... nicht als Shared deklariert
und erfordert deshalb erst mal eine Instanz der Klasse USB

Dim USBVariable = New USB


Meine Versuche an der Anweisung Dim WithEvens USB ...
zu drehen haben nichts gebracht.
Was kann ich tun ?



Na ja, als erstes mal ein paar der wichtigsten Grundlagen
zu Klassen und deren Instanzierung anlesen. Die Online-
Hilfe bietet dazu reichlich Stoff. Du hast bisher offenbar
noch nicht den Unterschied zwischen

Private / Public Objektvariable as clsXYZ
Private / Public Objektvariable WithEvents as clsXYZ

' bis hierher gibt es nur eine Objektvariable, welche
' einen Verweis auf eine Klasseninstanz vom Typ clsXYZ
' aufnehmen kann, aber bisher noch auf Nothing zeigt.
' Prozeduren, die in der clsXYZ als Shared deklariert sind
' können bereits jetzt, aber auch ganz ohne Deklaration
' obiger Variable direkt aufgerufen werden:
' clsXYZ.Methode()

und dem danach folgenden

Objektvariable = New clsXYZ

' Jetzt gibt es eine Klasseninstanz und erst jetzt kannst
' Du Subs und Functions der Klasse xlsXYZ aufrufen, die
' nicht als Shared deklariert sind:
' Dim X As Datentyp = Variable.FunctionABC(Par)

Schau Dir u.a. auch unbedingt die Onlinehilfe zu "Shared" an!
Auch die Doku zu Dim, Private, Public usw. solltest Du
unbedingt ansehen und auch verstanden haben.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen