Frage zu einer Adressen-Klasse

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    Frage zu einer Adressen-Klasse

    Moin!

    nachdem ich kürzlich gute Erfahrung mit einer Klasse für meine DXF-Bausteine gemacht habe (der eine oder andere wird sich erinnern) wollte ich meine Adressen-Definition von Diciontary auch auf eine Klasse umstellen.

    Es wird dort viele Eigenschaften geben.

    VB.NET-Quellcode

    1. Public Property ID_AdressArt As Short
    2. Public Property Firma As String
    3. Public Property FirmaZusatz As String
    4. Public Property ID_Anrede_1 As Short
    5. Public Property ID_Titel_1 As Short
    6. Public Property VorName_1 As String
    7. Public Property NachName_1 As String
    8. Public Property ID_Anrede_2 As Short
    9. Public Property ID_Titel_2 As Short
    10. Public Property VorName_2 As String
    11. Public Property NachName_2 As String
    12. Public Property DebitorenNummer As String
    13. Public Property Strasse As String
    14. Public Property HausNr As String


    Zunächst dachte ich, dass ich diese alle so deklarieren kann.

    Dann habe ich aber festgestellt, dass bei

    VB.NET-Quellcode

    1. Private _Data As New Adresse
    2. ..
    3. _Data = Adresse.xxxx


    nicht alle Definitionen angezeigt werden(xxx)

    Dann habe ich etwas gesucht und die "große" Definition für die Properties angewandt werden müssen - wenn ich das richtig verstanden haben.

    VB.NET-Quellcode

    1. Private ID_AdressArt As AdressArt
    2. Private Firma As String
    3. Private FirmaZusatz As String
    4. Private ID_Anrede_1 As Anrede
    5. Private ID_Titel_1 As Titel
    6. Private VorName_1 As String
    7. Private NachName_1 As String
    8. Private ID_Anrede_2 As Anrede
    9. Private ID_Titel_2 As Titel
    10. Private VorName_2 As String
    11. ...
    12. Public Property MyAdressArt As AdressArt
    13. Get
    14. Return ID_AdressArt
    15. End Get
    16. Set(ByVal value As AdressArt)
    17. ID_AdressArt = value
    18. End Set
    19. End Property


    Ist das richtig??

    Das ist doch viel getippe und damit Fehler anfällig.

    Kann mir eine Richtung weisen??

    Gruß Jan
    Kannst du bitte einmal deine gesamte Klassendefinition posten und nicht nur Auszugsweise wie oben?

    Edit: Ich denke das hat sich nach der Antwort von @EaranMaleasi erledigt
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Wenn du deine Klasse Adresse so aufgebaut hast, wie in deinem ersten Code-Block, dann solltest du mit Adresse.xxxx überhaupt nichts sehen (abgesehen was statisch von Object vererbt wird). Alle diese Properties sind auf die Instanz bezogen.
    _Data.xxxx hingegen sollte dir alle Properties zeigen.

    Als nächstes, lass dir von Visual Studio helfen. Bei VS2019 (sehr wahrscheinlich auch schon in 2017/15), setzt du deinen Cursor auf den Namen der Property, betätigst strg + . Und du solltest die Option bekommen, diese Property in eine Vollständige Property zu verwandeln.

    Als nächstes gibt es (zumindest in C#) das snippet propfull. Das ausgetippt und 2x getabbt, hat man eine vollständige Eigenschaft mitsamt Feld, dessen Datentyp, und die Namen der beiden man mithilfe von Tab noch definieren kann.

    Edit auf Gefahr hin, dass dieser Beitrag evtl. überlesen wird:
    @jan99
    Moin!

    wie gesagt ich bin erst am Anfang und will primär dort die Daten zusammenhalten. Sollte einfacher sein als im Dic.

    VB.NET-Quellcode

    1. Public Class Adresse
    2. Public Enum AdressArt
    3. Firma
    4. Person
    5. End Enum
    6. Public Enum Anrede
    7. unbek
    8. Herr
    9. Frau
    10. End Enum
    11. Public Enum Titel
    12. kein
    13. Dr
    14. Prof
    15. End Enum
    16. Public Enum PostZustellung
    17. direkt
    18. Rechtsanwalt
    19. Verwalter
    20. End Enum
    21. Public Enum PostEmpfänger
    22. Standard = 1
    23. ZuHänden = 2
    24. Persönlich = 3
    25. End Enum
    26. Public Property ID_AdressArt As AdressArt
    27. Public Property Firma As String
    28. Public Property FirmaZusatz As String
    29. Public Property ID_Anrede_1 As Anrede
    30. Public Property ID_Titel_1 As Titel
    31. Public Property VorName_1 As String
    32. Public Property NachName_1 As String
    33. Public Property ID_Anrede_2 As Anrede
    34. Public Property ID_Titel_2 As Titel
    35. Public Property VorName_2 As String
    36. Public Property NachName_2 As String
    37. Public Property DebitorenNummer As String
    38. Public Property Strasse As String
    39. Public Property HausNr As String
    40. Public Property AdressZusatz As String
    41. Public Property Land As String
    42. Public Property PLZ As String
    43. Public Property Ort As String
    44. Public Property Telefon As String
    45. Public Property Telefax As String
    46. Public Property Mobil As String
    47. Public Property EMail As String
    48. Public Property Bemerkung As String
    49. Public Property DateCreated As Date
    50. Public Property UserCreated As String
    51. Public Property DateModified As Date
    52. Public Property UserModified As String
    53. Public Sub New()
    54. ReInit()
    55. End Sub
    56. Public Sub ReInit()
    57. ID_AdressArt = AdressArt.Person
    58. Firma = ""
    59. FirmaZusatz =""
    60. ID_Anrede_1 = Anrede.unbek
    61. ID_Titel_1 = Titel.kein
    62. VorName_1 = ""
    63. NachName_1 =""
    64. ID_Anrede_2 = Anrede.unbek
    65. ID_Titel_2 = Titel.kein
    66. VorName_2 = ""
    67. NachName_2 =""
    68. DebitorenNummer=""
    69. Strasse=""
    70. HausNr=""
    71. AdressZusatz=""
    72. Land = "D"
    73. PLZ =""
    74. Ort=""
    75. Telefon=""
    76. Telefax=""
    77. Mobil=""
    78. EMail = ""
    79. Bemerkung = ""
    80. DateCreated = DateTime.Now.Date
    81. UserCreated =""
    82. DateModified = DateTime.Now.Date
    83. UserModified =""
    84. End Sub
    85. End Class


    Da hat sich wohl schon etwas überlagert. Also wohl doch die Long-Version.

    Dann wollte ich zum Beispiel auf Reinit zurück greifen - was mir nicht angeboten wird.

    VB.NET-Quellcode

    1. Private _Data As New Adresse
    2. ...
    3. _Data = Adresse.xxxx


    Gruß Jan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jan99“ ()

    Darf ich einwerfen das die ganze ReInit() Methode unnötig ist?
    Du kannst hinter der Property einfach = DEIN_WERT machen.

    VB.NET-Quellcode

    1. ​Public Property DateCreated As Date = DateTime.Now.Date


    Das spart dir on mass Code den du da geschrieben hast.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Moin!

    EaranMaleasi schrieb:

    Und inwiefern würde das sinn ergeben? Entweder existiert die Property, oder sie existiert nicht. Da gibts kein "womöglich" oder "vielleicht".


    Dann könnte ich nicht auf den Gedanken kommen was abzufragen, was es nicht gibt. Vermeiden von Fehlern. Vielleicht denke ich auch in eine falsche Richtung.

    xChRoNiKx schrieb:

    Darf ich einwerfen das die ganze ReInit() Methode unnötig ist?
    Du kannst hinter der Property einfach = DEIN_WERT machen.

    VB.NET-Quellcode

    1. ​Public Property DateCreated As Date = DateTime.Now.Date


    Das spart dir on mass Code den du da geschrieben hast.


    Dann kann ich nicht auf Standard zurück setzen.

    Oder ein neues Objekt anlegen. ... vielleicht meinst Du das?

    Jan
    Du kannst ja nur eine Property abfragen, die du in der Klasse definiert hast.

    Wenn du das Objekt, die Instanz deiner Klasse nochmals brauchst, dann instanziierst du ein neues Objekt.

    Wenn du also erst Hans Müller in der Klasse hast, dann ist Ina Maier eine neue Instanz und nicht eine wiederverwendete Hans Müller Instanz.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    @jan99 Zwei Hinweise:
    Short-Properties sind eigentlich out, nimm Integer dafür. Alle Indizes sind Integer, und wenn Du nichts unternimmst, liegt der Speicherbedarf auch bei 32 Bit, der Adressbreite bei x86 (Short hat 16 Bit).
    Als zweites: Mach Dir eine ordentliche ToString()-Funktion für Deine Datenklasse, da gehst Du im Debug mit der Maus drüber und bekommst diesen Text angezeigt, genau so, wenn Du die Variable der Überwachung hinzufügst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Danke für den Short Hinweis.

    Das mit der ToString-Funktion habe ich nicht ganz verstanden!??

    Jan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    jan99 schrieb:

    ToString-Funktion
    So was:

    VB.NET-Quellcode

    1. Public Property Strasse As String
    2. Public Property HausNr As String
    3. Public Overrides Function ToString() As String
    4. Return String.Format("{0} {1}", Me.Strasse, Me.HausNr)
    5. End Function

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin!

    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Den Sinn verstehe ich nicht ganz!

    Ich habe ja noch mehr verkettbare Daten. Name und Vorname zum Beispiel.

    Ich hatte das in eigene Funktionen gelegt.

    Jan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    jan99 schrieb:

    Ich habe ja noch mehr verkettbare Daten.

    RodFromGermany schrieb:

    Mach Dir eine ordentliche ToString()-Funktion für Deine Datenklasse
    String.Format(...) kann ja auch wesentlich mehr Parameter. ;)
    ====
    Und:
    Fast 1000 Posts im Forum und immer noch Vollzitate?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin!

    neuer Tag - neue Fragen ...

    Kann man eigentlich irgendwie die Namen von Eigenschaften auch über Variablen abfragen.

    Was stelle ich mir vor?

    Ich habe ein Dict mit Variablen und Werten. Diese sollen nun den Eigenschaften der Klasse zugewiesen werden. Man könnte jeder Variablen den Wert zuweisen das wäre jedesmal eine Datenzeile.

    Mein Ziel wäre eine Schleife zu erstellen die die Werte aus dem Dict die Namen und Werte auslesen und dann den Eigenschaften zuweisen. Deshalb auch gestern die Frage nach dem Prüfen, ob eine Eigenschaft vorhanden ist.

    Eines solche Schleife könnte um einiges kleiner sein.

    Gruß Jan
    @jan99 Du kannst ein Dictionary mit Namen und Wert anlegen.
    Oder meinst Du Nameof(...):
    docs.microsoft.com/de-de/dotne…eference/operators/nameof
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin!

    nein nicht ganz. Ich baue einmal ein Beispiel:

    VB.NET-Quellcode

    1. Dim AdressData as new Adresse
    2. Private Daten As New Dictionary(Of String, String)
    3. Daten.Add("_Firma", "Mustermann")
    4. Daten.Add("_Ort", "Entenhausen")
    5. Daten.Add("_Land", "Deutschland")
    6. ''keyArray = _Data.Keys
    7. ''For Each Element In keyArray
    8. AdressData.Element = Daten.Item(Element))
    9. next


    (Code "trocken" außerhalb des VS erstellt und kann Fehler beinhalten)

    Mir geht es um die Zeile mit " AdressData.Element".

    Gruß Jan