Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Property XYZ() As DataTable, Aufruf von anderer Klasse bringt Fehler

Frage Entwicklung Visual Studio

Mitglied: PCFJKG

PCFJKG (Level 1) - Jetzt verbinden

21.07.2013, aktualisiert 22.07.2013, 1530 Aufrufe, 10 Kommentare

In einer Klasse ABC wird eine Datatable erzeugt, welche in mehreren Formularen genutzt werden soll. Gefunden habe ich bisher, dass diese Aufgabe über eine Property gelöst werden kann. Trotz Recherche im Netz (und gefundenen Beispielen) fehlt mir als "VBA-Mensch" offensichtlich ein grundlegender Zugang zu OOP.
In einer Klasse (keine Form-Klasse) wird eine Tabelle erzeugt und als Property veröffentlicht wie folgt (DR("D4") = 8 dient zum Test:

Public Class C_ABC

Public DTL As DataTable
Property XYZ() As DataTable
Get
Return DTL
End Get
Set(ByVal value As DataTable)
DTL = value
End Set
End Property

Function DynamischeTabelle()
Dim DR As DataRow
Dim i As Byte
' --- Erzeugen einer dynamischen Tabelle
XYZ = New DataTable("Tabellenbezeichnung")
For i = 1 To 10
DTL.Columns.Add("D" & i, System.Type.GetType("System.Byte"))
Next i
For i = 1 To 2
DR = DTL.NewRow()
DR("D4") = 8
DTL.Rows.Add(DR)
Next i
DTL.Dispose()

END CLASS

Nun soll das Formular F_Start den Inhalt von XYZ nutzen, hier zur Anzeige von DT.Rows(1)("D4").

Public Class F_Start

Private Sub Btn_Datatable_Click(sender As System.Object, e As System.EventArgs) Handles Btn_Datatable.Click
Dim CA As New C_ABC
Dim DT As DataTable

DT = CA.DTL
MsgBox(DT.Rows(1)("D4").ToString)
End Sub

End Class

Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Wenn ich aber
CA.DynamischeTabelle () in einer Zeile vor DT = CA.DTL ausführe, funktioniert es.
Wo liegt das Problem ?

Vielen Dank für jede Hilfe

PCFJKG
Mitglied: colinardo
21.07.2013, aktualisiert um 11:26 Uhr
Hallo PCFJKG,
Das Problem ist bei deiner Klasse folgendes: wenn du ein Objekt deiner Klasse erzeugst ist die Datatable in deiner Klasse noch gar nicht erzeugt worden. Du musst also im Initializer(Public Sub New) deiner Klasse das Datatable-Objekt erzeugen damit es bei jedem erstellen eines neuen Objektes dieser Klasse automatisch erzeugt wird.

01.
Public Sub New() 
02.
   DynamischeTabelle() 
03.
End Sub
Grüße Uwe
Bitte warten ..
Mitglied: PCFJKG
21.07.2013 um 11:52 Uhr
Hallo Uwe,
erst einmal danke für die schnelle Antwort. Die dynamische Tabelle wird beim Start des Projektes mit dem Aufruf --> CA.DynamischeTabelle () erzeugt.
Erst danach clicke ich auf den Btn_Datatable im Formular. Es sollte doch dann auf die Tabelleninhalte der Datatable DTL - erzeugt in der Klasse C_ABC - ein Zugriff möglich sein oder ?

Viele Grüße

PCFJKG
Bitte warten ..
Mitglied: colinardo
21.07.2013 um 12:04 Uhr
Du kannst der Property mit dieser Zeile keine Datatable zuweisen:
01.
XYZ = New DataTable("Tabellenbezeichnung")
Schreib stattdessen
01.
DTL = New DataTable("Tabellenbezeichnung")
Du gibst die Public Variable DTL ja schon im GET Handler der Property zurück.
Bitte warten ..
Mitglied: PCFJKG
21.07.2013 um 12:17 Uhr
Hallo Uwe, das habe ich verstanden, geändert und kann die Änderung ohne Fehler in C_ABC debuggen, Jetzt bleibt nur noch die Frage, warum der Aufruf von DTL aus dem Startformular (Public Class F_Start) noch immer den Fehler: ... Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt ... bringt.
Viele Grüße
PCFJKG
Bitte warten ..
Mitglied: colinardo
21.07.2013 um 12:46 Uhr
Das habe ich doch oben schon geschrieben ; wenn du schon im Initialize Handler der Klasse C_ABC deine Datatable erzeugst brauchst du in deiner Form das Datatable-Objekt nicht erst mit CA.DynamischeTabelle() erzeugen, da es dann schon beim erstellen eines Objektes der Klasse C_ABC automatisch mit erzeugt wird.
Bitte warten ..
Mitglied: PCFJKG
21.07.2013 um 13:00 Uhr
Hallo Uwe, erst einmal danke für Deine Geduld und vor allem Deine schnellen Antworten. Vermutlich habe ich mich auch nicht ganz klar ausgedrückt, denn die DTL wird in der Form nicht erzeugt (nach meinem Verständnis), sondern lediglich ein Verweis (ist das der richtige Begriff ?) für den Zugriff auf die bereits in der der Klasse C_ABC erstellte Tabelle . Im Form selbst steht nur

Private Sub Btn_Datatable_Click(sender As System.Object, e As System.EventArgs) Handles Btn_Datatable.Click

Dim CA As New C_ABC
Dim DT As DataTable

DT = CA.DTL

erstellt, um dann die Testausgabe mit

MsgBox(DT.Rows(1)("D4").ToString)

End sub

aufzurufen. Dann kommt halt leider die Fehlermeldung ...

Vielleich hast Du trotzdem Lust, noch einmal zu antworten, auf jeden fall ist Deine schnelle Hilfe super.

Viele Grüße
PCFJKG
Bitte warten ..
Mitglied: colinardo
21.07.2013, aktualisiert um 13:28 Uhr
Code sagt mehr als 1000 Worte ...
In deiner Klasse liegt doch einiges im Argen. Schreib das ganze so um dann klappt das auch:

Deine Klasse C_ABC
01.
Public Class C_ABC 
02.
    Private DTL As DataTable 
03.
 
04.
    Public Sub New() 
05.
        DynamischeTabelle() 
06.
    End Sub 
07.
 
08.
   Public Property XYZ() As DataTable 
09.
        Get 
10.
            Return DTL 
11.
        End Get 
12.
        Set(ByVal value As DataTable) 
13.
            DTL = value 
14.
        End Set 
15.
    End Property 
16.
 
17.
    Private Sub DynamischeTabelle() 
18.
        Dim DR As DataRow 
19.
        Dim i As Byte 
20.
        ' --- Erzeugen einer dynamischen Tabelle 
21.
        DTL = New DataTable("Tabellenbezeichnung") 
22.
        For i = 1 To 10 
23.
            DTL.Columns.Add("D" & i, System.Type.GetType("System.Byte")) 
24.
        Next i 
25.
        For i = 1 To 2 
26.
            DR = DTL.NewRow() 
27.
            DR("D4") = 8 
28.
            DTL.Rows.Add(DR) 
29.
        Next i 
30.
    End Sub 
31.
End Class
und in deiner Form schreibst du folgendes:

01.
   Private Sub Btn_Datatable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Datatable.Click 
02.
        Dim CA As New C_ABC 
03.
        Dim DT As DataTable 
04.
        DT = CA.XYZ 
05.
        MsgBox(DT.Rows(1)("D4").ToString) 
06.
    End Sub
Wenn du den Code durchsiehst wird der Aha-Effekt schon kommen...

p.s. Bitte verwende in Zukunft Tags für das Posten von Programm-Code, merci..

Sonnigen Sonntag noch
Uwe
Bitte warten ..
Mitglied: PCFJKG
21.07.2013 um 13:37 Uhr
Hallo Uwe, es hat sofort funktioniert. Was soll ich sagen außer noch einmal vielen Dank ! Auch Dir einen schönen Sonn- und weitere schöne tage.
Herzliche Grüße
PCFJKG
Bitte warten ..
Mitglied: colinardo
22.07.2013 um 09:18 Uhr
noch bitte als gelöst markieren. Merci.
Bitte warten ..
Mitglied: PCFJKG
22.07.2013 um 12:26 Uhr
Ist soeben erfolgt, sorry. Nochmals vielen Dank und Grüße von
PCFJKG
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...