Als ich das erste mal die neuen Objekte der Collection-Klasse ausprobiert habe, fragte ich mich, wie man die Daten denn jetzt eigentlich wieder aus diesen ominösen Strukturen herausbekommt. Da ich annehme, dass dies auch anderen Leuten Probleme bereiten könnte, habe ich mich entschieden, diese Hilfe zu verfassen. Zum Problem: Wenn man da in gewohnter Manier "Liste.item(0)." eintippt und darauf wartet, dass die darin enthaltenen Elemente bzw. deren Variablen angezeigt werden, dann hat man Pech! Da kommt nämlich nichts! Der durchschnittliche VB'ler wird sich da (zu Recht) denken: "Ja, da ist halt nix drin, was man abrufen könnte!" Tja, das ist leider falsch. Die Daten sind schon drin, man muss nur einen kleinen Trick anwenden. Eine einfache Testklasse: Public Class Bundesland Private Bevölkerung As Long Dim Hauptstadt As String Public Fläche As Integer Public Sub New(ByVal lBevölkerung As Long, ByVal iFläche As Integer, ByVal sHauptstadt As String) Bevölkerung = lBevölkerung Fläche = iFläche Hauptstadt = sHauptstadt End Sub Public Sub New() End Sub Public Function Dichte() As Single Dichte = Bevölkerung / Fläche End Function End Class Der Code zum Belegen der Liste folgt im Weiteren: ' 2 Bundesländer erstellen Dim Bayern As New Bundesland(12100000, 70352, "München") Dim BadenWürtemberg As New Bundesland(10400000, 35752, "Stuttgart") ' 2 Bundesländer speichern Dim Liste As New ArrayList Liste.Add(Bayern) Liste.Add(BadenWürtemberg) ' Jetzt die Daten abrufen For i = 0 To Liste.Count - 1 ' MsgBox(Liste.Item(i).Bevölkerung) -> geht nicht, da private!! ' MsgBox(Liste.Item(i).Hauptstadt) -> geht nicht, da ebenfalls private!! ' Dim in Klassendefinition == private-Deklaration MsgBox(Liste.Item(i).Fläche) 'funktioniert MsgBox(Liste.Item(i).dichte) 'funktioniert Next Wie wir sehen, können wir auf die Daten ganz einfach dadurch zugreifen, indem wir in der Klassendefinition nachschauen, welche Elemente es gibt und dann tippen wir die gnadenlos ein. Wie im Code bereits vermerkt, funktioniert dieses Vorgehen bei privaten Mitgliedervariablen natürlich nicht! Es gibt jedoch noch eine andere Methode, um die abrufbaren Daten etwas schöner zu bekommen (ohne dass man extra in der Klassendefinition nachschauen muss): For i = 0 To Liste.Count - 1 Dim Temp As New Bundesland ' (1) Temp = Liste.Item(i) ' (2) MsgBox(Temp.Fläche) Next Was geschieht hier? Nach Eingabe von "Temp." klappt die bekannte Liste auf, in der folgendes steht: Dichte
Fläche
GetType ' gehört eigentlich nicht zur Bundesland-Klasse, sondern ist geerbt
Schwierig wird es, wenn in der Liste Instanzen verschiedener Klassen abgespeichert sind, denn dann haben wir sowohl mit der einen als auch mit der anderen Methode ein Problem. Neue Klasse: Public Class Land Public BruttoSozialProdukt As Long Public Sub New(ByVal BS As Long) BruttoSozialProdukt = BS End Sub Public Sub New() End Sub End Class Der geänderte Belegungscode lautet wie folgt: ' 2 Bundesländer erstellen Dim Bayern As New Bundesland(12100000, 70352, "München") Dim BadenWürtemberg As New Bundesland(10400000, 35752, "Stuttgart") Dim Deutschland As New Land(3240) ' 2 Bundesländer speichern Dim Liste As New ArrayList Liste.Add(Bayern) Liste.Add(BadenWürtemberg) Liste.Add(Deutschland) For i = 0 To Liste.Count - 1 Dim NamederKlasse As String = Liste.Item(i).GetType().Name.ToString() If (NamederKlasse.Equals("Bundesland")) Then Dim Temp As New Bundesland Temp = Liste.Item(i) MsgBox(Temp.Fläche) End If If (NamederKlasse.Equals("Land")) Then Dim Temp As New Land Temp = Liste.Item(i) MsgBox(Temp.BruttoSozialProdukt) End If Next Wir lösen das Problem dadurch, indem wir einfach nachschauen, welcher Typ die gespeicherte Klasseninstanz entspricht und dann dynamisch darauf reagieren. Wenn wir natürlich überhaupt nicht wissen, welche Daten wir in der ArrayList erwarten können, dann macht es keinen Sinn, irgendwas anzusprechen (in diesem Fall tun wir gar nichts). Ich hoffe mit den gezeigten Techniken ein bisschen geholfen zu haben. Die größte Schwierigkeit für mich war die Wahl des Betreffs Dieser Tipp wurde bereits 36.257 mal aufgerufen.
Anzeige
![]() ![]() ![]() Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevOutBar 4.0 ![]() Vertikale Menüleisten á la Outlook Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Tipp des Monats ![]() Dieter Otter sevTabStrip: Rechtsklick auf Reiter erkennen Eine Funktion, mit der sich prüfen lässt, auf welchen Tab-Reiter ein Mausklick erfolgte Access-Tools Vol.1 ![]() Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |