Ableiten von Windows.Forms.Form (brauche Nachhilfe in Vererbung...)

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Ole.Grossklaus.

    Ableiten von Windows.Forms.Form (brauche Nachhilfe in Vererbung...)

    Hallo zusammen,

    ich benötige mal wieder eine kleine Nachhilfe.

    Ich habe 2 Projekte (jeweils mit einer frmMain) in der ich jeweils eine Sub habe, die als Public Sub MeineSub() deklariert ist.

    Diese Formulare vererbe ich in eine neue Klasse myForm (Inherits Windows.Forms.Form).

    Dann instanziiere ich in einem weiteren Projekt folgendermaßen

    dim frm as new myForm1

    oder

    dim frm as new myForm2

    Jetzt möchte ich die Funktion myForm1.MeineSub oder myForm2.meineSub aufrufen. Das klappt aber nicht, denn der Ausdruck

    frm.MeineSub

    ist nicht zulässig (da er in der Basisklasse Windows.Forms.Form nicht enthalten ist.

    Wie muss ich das regeln, dass ich einen eigene (MeineSub()) in unterschiedlich instanzierten Forms aufrufen kann?

    Danke schonmal vorab

    Ole
    Vielleicht hilft dies:
    (der Code läuft!)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Inherits System.Windows.Forms.Form
    3. Public Sub MeineSub()
    4. End Sub
    5. End Class
    6. Public Class Form2
    7. Inherits System.Windows.Forms.Form
    8. Public Sub MeineSub()
    9. End Sub
    10. End Class
    11. Public Class xxx
    12. Public Sub New()
    13. Dim frm1 As New Form1
    14. frm1.MeineSub()
    15. Dim frm2 As New Form2
    16. frm2.MeineSub()
    17. End Sub
    18. End Class
    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!

    Ist bei mir etwas anders, und läuft daher leider so nicht


    Das läuft bei mir leider nicht, denn die globale currForm kennt die Public MeineSub natürlich nicht

    Hier mal ein konkreter Code Ausschnitt
    PublicWithEvents currForm AsclsMyForm
    Dim
    UserForm AsclsMyForm = NewfrmOptionenverwaltung

    currForm = UserForm

    oder

    Dim UserForm AsclsMyForm = NewfrmBenutzergruppenverwaltung

    currForm = userForm

    Wenn ich jetzt versuche, currForm.MeineSub aufzurufen, dann wird die Routine MeineSub als unbekannt unterstrichen (ist ja auch klar, denn erst zur Laufzeit kennt er die Routine, wenn die Form instanziiert ist.)

    Kannst Du vielleicht mal einen konkreten Codeausschnitt, am besten die ganze Klasse, unter Verwendung des VB-Tags ohne sonstige Formatierung posten?
    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!
    OK - ich versuchs mal:

    Vorweg zur Übersicht:

    Navigator ist mein Haupt-Projekt 1 (hat Verweise auf meine Module z.B. modOptionen, modPersonen, was eigene Projekte sind)
    clsMyForm kapselt meine Childprojekte (meine Module)

    modOptionen ist eines von mehreren Childs mit der Public Sub MeineSub, die ich vom Navigator aufrufen möchte.

    (Anhang Problem.bmp beschreibt das noch mal grafisch)

    Navigator Call
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public WithEvents currForm As clsMyForm.clsMyForm ' je nach Modul stecken hier unterschiedliche frm*'s dahinter
    2. ' Aus dem Navigator rufe ich diese Funktion auf
    3. Public Sub StartBenutzergruppenverwaltung(CurrUser As clsMyForm.clsMyForm.sCurrentUser)
    4. Dim UserForm As clsMyForm.clsMyForm = New modBenutzergruppenverwaltung.frmBenutzergruppenverwaltung
    5. currForm = UserForm
    6. End Sub


    clsMyForm
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class clsMyForm
    2. Inherits System.Windows.Forms.Form
    3. Public Sub ChangeButtonWidth()
    4. If CurrentButtonSize = eButtonSize.eSizeNormal Then
    5. CurrentButtonSize = eButtonSize.eSizeCondensed
    6. Else
    7. CurrentButtonSize = eButtonSize.eSizeNormal
    8. End If
    9. ' Aufgerufewn aus Navigator. Soll eigentlich in meiner Zielform eine Sub aufrufen, die ein Refresh des Screens macht.
    10. ' Hier weiss ich nicht, wie ich aus der clsMyForm weiter komme in meine Zielform.
    11. End Sub
    12. End Class
    13. [/spoiler]




    Das Child-Modul ist eine von Windows.Forms.Form abgeleitete clsMyForm Anwendung in der ich meine Public Sub MeineSub habe, die ich vom Navigator aus über clsMyForm aufrufen möchte...



    Ich hoffe, das ist verständlich genug geschrieben. Das gesamte Projekt hochladen würde ebenfalls gehen, ist aber mit inzw. 11 Teilprojekten noch deutlich komplexer als dieses Problem.



    Danke schonmal.
    Dateien
    • problem.zip

      (15,42 kB, 124 mal heruntergeladen, zuletzt: )
    Wenn ich das richtig verstehe ist Dein Problem das Du über die gehaltene Form-Reference die dort verfügbaren Public Methods nicht ansprechen kannst weil der Compiler meckert das er die Form-Referenzen nicht kennt ... richtig?

    Dafür gibt es folgende Lösungsansätze:

    1. Du guckst Dir mal die Methode CallByName genauer an. Hier kann man Methoden über einen STRING aufrufen. Ist aber sackdumm wenn die Form diese Methode dann doch nicht beinhaltet, da kracht es richtig im Gebälk.

    2. Die deutlichere komplexere aber auch zuverlässigere Variante wäre eine eigene Handlingsklasse anzulegen und darauf in der Form eine Referenz zu halten. Den Constructor der Klasse gleich eine Form-Referenz übergeben die dieser dann an Hand Form.Name dem richtigen Class-Member zuordnet der eine voll qualifizierte Referenz auf die Form darstellt (oder per Enum-Choice die Form auswählen und die Klasse handelt inklusive startet die Form komplett selbstständig). Also quasi eine Zwischenklasse die die Form die aufzrufen ist komplett handelt (das mache ich z.B. immer so und arbeite im Code ausschließlich nur mit dieser Klasse ... das ist genial easy wenn Du dann mal die Form ändern willst/musst ^^ ... bei mir ist dann natürlich die Klasse direkt mit einer Form verbunden, bei Dir müsste man eben eine Klasse für mehrere Forms gestalten).

    Die möglichen Methoden der verschiedenen Forms kann man dann als Enum der Klasse zur Ansprache zur Verfügung stellen und in der Klasse dann eine Public Method ala CallMethode(ByVal Choice As EnMethod).

    An Hand der Enum Übergabe sucht sich die Klasse dann die passende Aufrufmethode raus.

    Da die Klasse weiss welche Form sie hält kann sie auch problemlos die Events der Form abhorchen und per eigenes Event zurück werfen. Dadurch kannst Du dann in Deiner MainForm das komplette Handling gegen diese Holder-Klasse programmieren und der Compiler hat nichts zu maulen und es ist absolut fehlerunanfällig.

    Gruß

    Rainer

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