| |
VB.NET - Ein- und UmsteigerCollections vb 2008 | | | Autor: mawu5007 | Datum: 20.03.21 15:29 |
| ich erstellte ein kleines pgm für Benutzung eines Collections:"clscustomer"
Public Class clscustomer
Public NameValue As String
Public VornameValue As String
Public Property get_name() As String
Get
Return NameValue
End Get
Set(ByVal value As String)
NameValue = value
End Set
End Property
Public Property get_Vorname() As String
Get
Return VornameValue
End Get
Set(ByVal value As String)
VornameValue = value
End Set
End Property
End Class
-------------------------------------------
Public Class Form1
Public clscustomer As New Collection
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim addcustomer As New clscustomer
Dim readcustomer As New clscustomer
Dim i, count As Long
i = 1
addcustomer.get_name = "Müller"
addcustomer.get_Vorname = "Hans"
clscustomer.Add(addcustomer)
'WriteLine(clscustomer.Item(i))
i = 2
addcustomer.get_name = "Schulze"
addcustomer.get_Vorname = "Gert"
clscustomer.Add(addcustomer)
count = clscustomer.Count
readcustomer = CType(clscustomer.Item(1), clscustomer)
MessageBox.Show("Name: " + readcustomer.get_name + _
"; Vorname: " + readcustomer.get_Vorname)
readcustomer = CType(clscustomer.Item(2), clscustomer)
MessageBox.Show("Name: " + readcustomer.get_name + _
"; Vorname: " + readcustomer.get_Vorname)
End
End Sub
End Class
Es funktioniert aber:
Warum wird mir nur der letzte Name= Schulze angezeigt?
Es werden nicht beide Namen gespeichert.
Danke.
mfg | |
Re: Collections vb 2008 | | | Autor: dj.tommy | Datum: 20.03.21 16:59 |
| Hallo mawu5007!
Ich würde vorschlagen das du es so machst
Public Class Form1
Public clscustomer() As clscustomer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
ReDim clscustomer(0) 'Erste erstellen
clscustomer(0) = New clscustomer
clscustomer(0).get_name = "Müller"
clscustomer(0).get_Vorname = "Hans"
ReDim Preserve clscustomer(1) 'Weitere erstellen
clscustomer(1) = New clscustomer
clscustomer(1).get_name = "Schulze"
clscustomer(1).get_Vorname = "Gert"
MessageBox.Show("Name: " + clscustomer(0).get_name + "; Vorname: " + _
clscustomer(0).get_Vorname)
MessageBox.Show("Name: " + clscustomer(1).get_name + "; Vorname: " + _
clscustomer(1).get_Vorname)
End
End Sub
End Class
Public Class clscustomer
Public NameValue As String
Public VornameValue As String
Public Property get_name() As String
Get
Return NameValue
End Get
Set(ByVal value As String)
NameValue = value
End Set
End Property
Public Property get_Vorname() As String
Get
Return VornameValue
End Get
Set(ByVal value As String)
VornameValue = value
End Set
End Property
End Class | |
Re: Collections vb 2008 | | | Autor: mawu5007 | Datum: 20.03.21 17:12 |
| Danke.
Ich baue es ein und melde mich "gleich" ca. 20 min. wieder.
mfg | |
Re: Collections vb 2008 | | | Autor: mawu5007 | Datum: 20.03.21 17:23 |
| Das gibt Fehlermeldungen: kann nicht in VB konvertriert werden
clscustomer(0) = New clscustomer
clscustomer(0).get_name = "Müller" | |
Re: Collections vb 2008 | | | Autor: dj.tommy | Datum: 21.03.21 16:11 |
| Hallo mawu5007!
Ich habe gestern noch getestet bei mir hat es aber funktioniert.
Was für eine Fehlermeldung gibt er aus? | |
Re: Collections vb 2008 | | | Autor: mawu5007 | Datum: 21.03.21 18:03 |
| Hallo dj.tommy
Zuerst einmal Danke für Ihre Antwort!
ich habe heute auf ArrayList umgestellt s.u..
Das funktioniert.
-------------------------------------------------------------------
Public Class Personen
Implements IComparable
Public Name As String
Public Vorname As String
Public GebDat As Date
Public ZSchalter As String
Public Sub New(ByVal _name As String, ByVal _vorname As String, ByVal _gebdat As Date, ByVal _schalter As String)
Me.Name = _name
Me.Vorname = _vorname
Me.GebDat = _gebdat
Me.ZSchalter = _schalter
End Sub
Public Function compareTo(ByVal obj As Object) As Integer Implements IComparable.CompareTo
' Sortieren (nach "Name/ etc") vorbereiten
If ZSchalter = "N" Then
Return Me.Name.CompareTo(DirectCast(obj, Personen).Name)
End If
If ZSchalter = "V" Then
Return Me.Vorname.CompareTo(DirectCast(obj, Personen).Name)
End If
End Function
End Class
----------------------------------------------------------------------
Public Class ArrayList
Public ZSchalter As String
Private Sub ArrayList_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Person As New Collections.ArrayList()
'Sortieren nach "name/ etc"
ZSchalter = "N"
Person.Add(New Personen("Müller", "Hans", Date.Now, ZSchalter))
Person.Add(New Personen("Schulze", "Gert", Date.Now, ZSchalter))
Person.Add(New Personen("Hallo", "", Date.Now, ZSchalter))
Person.Sort()
End
End Sub
End Class
-------------------------------------------------------------------
mfg | |
Re: Collections vb 2008 | | | Autor: mawu5007 | Datum: 21.03.21 21:19 |
| DerSort läuft ohne Fehlermeldung aber die SortReihenfolge kann ich nicht verändern. | |
Re: Collections vb 2008 | | | Autor: mawu5007 | Datum: 22.03.21 16:55 |
| Ich bedanke mich nochmals bei dj.tommy für seine Arbeit.
Ich entwickelte jetzt ein funktionsfähiges Pgm nach Vorbild von
https://www.youtube.com/watch?v=1p4iHGWt-XM
also Collections mit ArrayList + Sort und stelle es hier aus:
--------------------------------------------------------------------------------
Public Class Personen
Implements IComparable
Public Name As String
Public Vorname As String
Public GebDat As Date
Public ZSchalter As String
Public Sub New(ByVal _name As String, ByVal _vorname As String, ByVal _gebdat As Date, ByVal _schalter As String)
Me.Name = _name
Me.Vorname = _vorname
Me.GebDat = _gebdat
Me.ZSchalter = _schalter
End Sub
Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo
' Sortieren (nach "Name/ etc") vorbereiten
If ZSchalter = "N" Then
Return Me.Name.CompareTo(DirectCast(obj, Personen).Name)
End If
If ZSchalter = "V" Then
Return Me.Vorname.CompareTo(DirectCast(obj, Personen).Vorname)
End If
End Function
End Class
--------------------------------------------------------------------
Public Class Form1
Public ZSchalter As String
Private Sub ArrayList_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Person As New Collections.ArrayList()
'Sortieren nach "name/ vorname etc"
ZSchalter = "V"
Person.Add(New Personen("Müller", "Hans", Date.Now, ZSchalter))
Person.Add(New Personen("Schulze", "Gert", Date.Now, ZSchalter))
Person.Add(New Personen("Adam", "", Date.Now, ZSchalter))
Person.Add(New Personen("Hallo", "", Date.Now, ZSchalter))
If ZSchalter = "N" Then
Dim name_sort As IComparer = New SortPersonName
End If
If ZSchalter = "V" Then
Dim vorname_sort As IComparer = New SortPersonVorName
End If
Person.Sort()
End
End Sub
Class SortPersonName
Implements IComparer
Public Function compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim person1 As Personen = DirectCast(x, Personen)
Dim person2 As Personen = DirectCast(y, Personen)
Return person1.Name.CompareTo(person2.Name)
End Function
End Class
Class SortPersonVorName
Implements IComparer
Public Function compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim person1 As Personen = DirectCast(x, Personen)
Dim person2 As Personen = DirectCast(y, Personen)
Return person1.Vorname.CompareTo(person2.Vorname)
End Function
End Class
End Class
----------------------------------------------------------------------
mfg | |
Vorschlag zur Verwendung der Framework-Angebote | | | Autor: Manfred X | Datum: 02.04.21 11:54 |
| Für typsicheren Code stehen in System.Collections.Generic geeignete
Listen-Klassen zur Verfügung.
Um eine Klasse nach verschiedenen Kriterien vergleichen und
sortieren zu können, ist ein separater Comparer zweckmäßig.
Falls möglich, sollten Sortier-Vergleiche ein eindeutiges Ergebnis
liefern (z.b. hierarchisch)
Public Class Person
'Properties mit Defaultwerten z.B. um Nothing zu vermeiden
Public Property Name As String = ""
Public Property Vorname As String = ""
Public Property GebDat As Date = DateTime.MinValue
Public Sub New()
'parameterfreier Konstruktor für Default-Instanz
End Sub
Public Sub New(ByVal name As String, ByVal vorname As String, ByVal _
gebdat As Date)
Me.Name = name
Me.Vorname = vorname
Me.GebDat = gebdat
End Sub
End Class
'Sortierkriterien-Aufzählung
Public Enum PersonCompareEnum As Integer
Name
Vorname
Geburtsdatum
End Enum
'Parametrisierter Comparer zum (hierarchischen) Vergleichen und Sortieren
' von Personen
Public Class PersonComparer
Implements IComparer(Of Person)
Public Property CompareProperty As PersonCompareEnum = _
PersonCompareEnum.Name
Public Property CompareOrder As Windows.Forms.SortOrder
Public Function Compare(x As Person, y As Person) As Integer
Implements IComparer(Of Person).Compare
Dim c_name, c_vorname, c_geb, c As Integer
'Klassen-Properties einzeln vergleichen
c_name = x.Name.CompareTo(y.Name)
c_vorname = x.Vorname.CompareTo(y.Vorname)
c_geb = x.GebDat.CompareTo(y.GebDat)
'Hierarchischer Vergleich nach CompareProperty
Select Case CompareProperty
Case PersonCompareEnum.Name
c = getSortOrder(c_name, c_vorname, c_geb)
Case PersonCompareEnum.Vorname
c = getSortOrder(c_vorname, c_name, c_geb)
Case PersonCompareEnum.Geburtsdatum
c = getSortOrder(c_geb, c_name, c_vorname)
Case Else
Throw New NotImplementedException()
End Select
'Vergleichsrichtung einbeziehen
If CompareOrder = SortOrder.Descending Then
c *= -1
End If
'Vergleichsergebnis
Return c
End Function
Private Function getSortOrder(a As Integer, b As Integer, c As Integer) _
As Integer
'Aus Einzelvergleichen den Gesamtvergleich erstellen
Dim r As Integer = a
If r = 0 Then r = b
If r = 0 Then r = c
Return r
End Function
End Class
'Beispiel:
'Eine Zugriffsvariable auf eine Liste von Personen
Dim Personen As List(Of Person)
Private Sub Demo()
'Eine Liste erstellen und füllen (Nutzung der Defaultinstanz bei NEW)
Personen = New List(Of Person)
Personen.Add(New Person With
{.Name = "Müller", .Vorname = "Hans",
.GebDat = New DateTime(2010, 5, 18)})
Personen.Add(New Person With
{.Name = "Schulze", .Vorname = "Gert",
.GebDat = New DateTime(1995, 12, 24)})
Personen.Add(New Person With
{.Name = "Adam", .Vorname = "Hans",
.GebDat = New DateTime(1995, 11, 2)})
Personen.Add(New Person With
{.Name = "Adam", .Vorname = "Hans",
.GebDat = New DateTime(1995, 11, 4)})
'Die Liste fallend sortieren nach Vorname (incl. Name/Geburt)
Personen.Sort(New PersonComparer With
{.CompareProperty = PersonCompareEnum.Vorname,
.CompareOrder = SortOrder.Descending})
For i As Integer = 0 To Personen.Count - 1
With Personen(i)
System.Diagnostics.Debug.WriteLine
(.Name & " " & .Vorname & " " & .GebDat.ToString)
End With
Next i
End Sub | |
Re: Vorschlag zur Verwendung der Framework-Angebote | | | Autor: mawu5007 | Datum: 02.04.21 15:33 |
| Guten Tag,
vielen Dank für Ihre Arbeit.
Ich muss diese übernehmen und testen.
mfg | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere InfosTipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. 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
Nur 24,95 EURWeitere Infos
|