eigene Sub für den Aufruf mehrerer Forms?

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

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

    eigene Sub für den Aufruf mehrerer Forms?

    Hi,
    ich hab eine Anwendung in der ein Hauptfenster als IsMDI = True deklariert ist.
    Nun gibt es mehrere Formulare die aufgerufen werden können.

    Im Moment rufe ich beim Klick auf den entsprechenden Menüpunkt die Form so auf:

    VB.NET-Quellcode

    1. Using f As New frmCapMobile
    2. f.MdiParent = Me
    3. f.WindowState = FormWindowState.Maximized
    4. f.Show()
    5. End Using


    nun hab ich aber ziemlich viele dieser Formulare, die unterschiedliche Aufgaben erledigen.
    Damit ich nicht für alle Formulare immer das selbe schreiben muss, hab ich mir gedacht, ich schreib eine Sub dafür:

    VB.NET-Quellcode

    1. Private Sub ShowForm(ByVal frm As Form, Optional state As FormWindowState = FormWindowState.Normal)
    2. Using f As New frm
    3. f.mdiparent = Me
    4. f.windowstate = state
    5. 'noch mehr Einstellungen
    6. f.Show()
    7. End Using
    8. End Sub


    Das funktioniert so leider nicht, da frm nicht als Form Typ erkannt wird.
    Wie mache ich es richtig?
    Danke Euch
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Wie mache ich es richtig?
    Deine Denke würde mit Reflection funktionieren, was ich aber für etwas oversized halte.
    Mach Dir ein Enumber, dessen Elemente wie die Formen heißen.
    Übergib dann das Enum und erstell passend die richtige Form mit ihrem jeweiligen Konstruktor.
    Ja, die Liste kann dann etwas lang werden, aber dies kannst Du gut debuggen und beliebig erweitern.
    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!
    Danke @RodFromGermany das klappt bestens.
    Die Liste wird zwar Lang, aber das steht dann wenigstens in einer einzigen Sub die ich in eine andere Klasse auslagern kann...

    By the way... meine Klasse heisst frmMain (ist die Klasse der Form) könnte ich eine 2. Klasse Partitial Class frmMain (wobei das ist doch die Designer Klasse, oder?) erstellen und solchen Code da rein schieben?

    Hier noch die Codeteile, wie ich es jetzt gelöst habe

    VB.NET-Quellcode

    1. Public Enum ContainerForms
    2. frmOVMobile
    3. frmCapMobile
    4. '....weitere
    5. End Enum
    6. Private Sub ShowForm(ByVal frm As ContainerForms, Optional state As FormWindowState = FormWindowState.Normal)
    7. Select Case frm
    8. Case ContainerForms.frmOVMobile
    9. Dim f As New frmOVMobile
    10. f.MdiParent = Me
    11. f.WindowState = state
    12. f.Show()
    13. End Select
    14. End Sub

    der Aufruf erfolgt dann so:

    VB.NET-Quellcode

    1. ShowForm(ContainerForms.frmOVMobile, FormWindowState.Maximized)
    "Hier könnte Ihre Werbung stehen..."
    @MichaHo Du kannst zu einer Klasse beliebig viele Partial Classes erstellen, sie müssen nur einen anderen Namen haben.
    Füge sie zunächst als leere Hülse hinzu (Dateiname hier "frmMain.Sub1.vb"):

    VB.NET-Quellcode

    1. Partial Class frmMain
    2. End Class

    Damit die dann alle aufklappbar unter frmMain im Project Explorer liegen, entlade das Projekt:

    ==> Bearbeiten PROJEKT_NAME.vbproj
    Und dann dies:

    XML-Quellcode

    1. <Compile Include="frmMain.Sub1.vb">
    2. <SubType>Form</SubType>
    3. </Compile>
    machst Du

    XML-Quellcode

    1. <Compile Include="frmMain.Sub1.vb">
    2. <DependentUpon>frmMain.vb</DependentUpon>
    3. <SubType>Form</SubType>
    4. </Compile>
    Speichern, Projekt erneut laden:

    Und nun die Datei / Klasse befüllen.
    Feddich. :thumbsup:
    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!

    MichaHo schrieb:

    Was passiert wenn ich da controls drauf haue?
    Jou, das ist ein Makel an dem System.
    Eigentlich ist da diese Zeile in der vbproj-Datei zuständig.

    XML-Quellcode

    1. <SubType>Form</SubType>
    ==>

    XML-Quellcode

    1. <SubType>Code</SubType>
    Ändert man sie, wird sie beim Doppelklick auf frmMain.vb der Eintrag zurückgesetzt.
    Wenn Du da ein Control drauf ziehst, kommt ein Compilerfehler:

    ------ Erstellen gestartet: Projekt: PartialClass, Konfiguration: Debug Any CPU ------
    C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(2454,5): error MSB3577: Zwei Ausgabedateinamen wurden zum selben Ausgabepfad aufgelöst: "obj\Debug\WindowsApplication1.frmMain.resources"
    ========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========
    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!
    Hi @RodFromGermany
    aber wenn ich

    XML-Quellcode

    1. <SubType>Code</SubType>
    daraus mache, passiert nix wildes? denn Controls will ich da keine drauf packen, nur eben Functionen und Subs die ich ausschließlich in der Form brauche (frmMain).
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    passiert nix wildes?
    Nö, das ist für direkt abgeleitete UserControls (z.B. MyTextBox), da öffnet sich beim Doppelklick drauf der Code und nicht der Designer.
    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!