Zugriff auf zwei ähnliche Forms von einem Modul

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Zugriff auf zwei ähnliche Forms von einem Modul

    Hallo,

    ich beschäftige mich noch nicht so lange mit VB und objektorientierter Programmierung und auch auf die Gefahr hin, dass ich mich bis auf die Knochen blamiere stelle ich trotzdem mal meine Frage.

    Ich habe in meinem Projekt 2 Forms die sich bisweilen sehr ähnlich sind. Das eine Form gehört zu einem HW-Modul, dessen Entwicklung abgeschlossen ist, die Darstellung innerhalb des Forms wird sich also nicht mehr ändern. Das neue, nachfolge HW-Modul basiert auf dem alten, aber wird stetig weiter entwickelt werden. Dadurch wird sich auch der dargestellte Inhalt des neuen Forms im Laufe der Zeit immer mehr verändern und nicht mehr dem alten entsprechen, was es nicht möglich macht die selbe Klasse dafür zu verwenden.

    Der nachfolgende Code ist nur Beispielhaft um mein Problem zu erklären.

    VB.NET-Quellcode

    1. 'Struktur
    2. Public Structure strct_Values
    3. Public ValueA As Integer
    4. Public ValueB As Integer
    5. End Structure
    6. 'altes Form
    7. Public Class frm_old
    8. Friend Array(10) As strct_Values
    9. '(...)
    10. End Class
    11. 'neues Form
    12. Public Class frm_new
    13. Friend Array(10) As strct_Values
    14. '(...)
    15. End Class


    In beiden Forms wird (da sich die Forms bisweilen sehr ähneln) ein Array benutzt. Diese sind (weil unterschiedliche Klassen) unabhängig voneinander auch lebensfähig.

    Ich hatte bisher (als es nur das alte Form gab) in einem Modul einen Aufruf wie diesen

    VB.NET-Quellcode

    1. Public Sub ReadValues()
    2. Dim frmAccess As frm_old
    3. 'im geöffneten Form Werte setzen
    4. frmAccess.Array(1).ValueA = 1
    5. frmAccess.Array(1).ValueB = 1
    6. End Sub


    Soweit so gut. Jetzt gibt es aber neuerdings noch frm_new auf welches ich alternativ zugreifen möchte.
    Nachfolgendes funktioniert natürlich nicht, das ich frmAccess nicht wahlweise auf frm_old oder frm_new festlegen kann:

    VB.NET-Quellcode

    1. Public Sub ReadValues(ByVal AccessNewForm As Boolean)
    2. 'testen ob altes oder neues Form geladen ist
    3. 'abhängig davon frmAccess dimensionieren
    4. 'entweder
    5. If AccessNewForm = False Then
    6. Dim frmAccess As frm_old
    7. Else
    8. 'oder
    9. Dim frmAccess As frm_new
    10. End If
    11. 'und im geöffneten Form Werte setzen
    12. frmAccess.Array(1).ValueA = 1
    13. frmAccess.Array(1).ValueB = 1
    14. End Sub


    Und daran scheiterte dann auch das gesamte Vorhaben.

    Vielleicht hat ja jemand einen Tipp für mich, wie ich das Problem möglichst elegant lösen kann.

    Ginge es nur um einzelne Aufrufe, dann würde ich einfach zwei unterschiedliche aufrufende Subs in dem Modul schreiben. Das Problem liegt aber auch darin, dass frm_old einige hundert Zeilen Code hat und ich darin immer und immer wieder mit frmAccess auf unterschiechste Variablen und Controls zugreifen, auf die ich in frm_new nun alternativ (abhängig davon welche Hardware verwendet wird) zugreifen möchte.
    Hallo und Willkommen im Forum

    Mir würde jetzt auf die schnelle einfallen das du eine Basisklasse erstellst wo alle Properties enthalten sind.
    Beide Forms erben von dieser und haben die selben Properties (jedes kann aber eigene noch hinzufügen welche nur dieses hat).

    Dann mit DirectCast(frmAccess,TestFormBase).Array(1).ValueA = 1.
    PS: Oder noch schöner über ein Interface!

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

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

    @roepke Willkommen im Forum. :thumbup:
    Zwei Möglichkeiten:
    Die erste ist die von @Nofear23m .
    Die andere:
    Du lässt frm_new von frm_old erben:

    VB.NET-Quellcode

    1. Public Class frm_new
    2. Inherits frm_old
    3. ' ...
    4. End Class
    da hast Du alles sofort bei der Hand.
    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!
    Hallo und danke für die prompten Antworten.
    Ich hatte die Arbeiten am VB Projekt die letzten Wochen aufgrund anderer Dringlichkeiten nahezu eingestellt und hatte das Forum schon fast vergessen. Heute hatte ich endlich mal wieder etwas Zeit mich darum zu kümmern.
    Die Idee mit dem frm_new erbt von frm_old gefällt mich eigentlich ganz gut. Nur was ist dabei mit den grafischen Elementen? Wenn ich frm_old an frm_new vererbe und will in frm_new nun grafische Änderungen durchführen (neue Controls hinzufügen, alte verschieben oder evtl. sogar entfernen) würde das funktionieren?

    roepke schrieb:

    würde das funktionieren?
    Probiere es aus.
    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!