Form in TabControl kein Variablenzugriff

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Form in TabControl kein Variablenzugriff

    Hallo,

    ich habe ein Problem mit dem Aufruf von Variablen und Methoden in einer Form, die in einem Tab platziert wurde.
    Rufe ich die Form als Form an sich auf, kann ich alle Public Variablen und Public Methoden von anderen Formen aus zugreifen.

    Sobald die Form jedoch mit folgendem Code in einem Tab platziert wird, werden die Variablen beim Aufruf der anderen Form zurückgesetzt und die Methoden können nicht aufgerufen werden.
    edit: Methoden können aufgerufen werden, laufen im Debugger durch aber es passiert nichts. Alles bleibt unverändert. Bsp. Textakualisierung lbl,

    VB.NET-Quellcode

    1. Dim hmiForm As New frmHmiConfig
    2. Dim hmiTab As New TabPage()
    3. hmiForm.TopLevel = False
    4. hmiForm.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    5. hmiForm.Dock = DockStyle.Fill
    6. hmiForm.Show()
    7. hmiTab.Text = "HMI UserPage"
    8. hmiTab.Controls.Add(hmiForm)
    9. TabControl1.TabPages.Add(hmiTab)


    Hat jemand eine Idee, woran das liegen kann, bzw. wie ich das Problem am besten angehe?

    Viele Grüße,
    Michael

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

    Aldi schrieb:

    Sobald die Form jedoch mit folgendem Code in einem Tab platziert wird, werden die Variablen beim Aufruf der anderen Form zurückgesetzt
    Was meinst du mit "beim Aufruf der anderen Form"?
    Kannst du den Code "zum Aufruf der anderen Form" zeigen?
    Welche Variablen werden zurückgesetzt? die auf der gezeigten hmiForm oder auf der anderen?
    Wenn du die frmHmiConfig nicht außerhalb einer Methode deklariert hast, wäre das etwas, was geändert werden muss.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Aldi Willkommen im Forum. :thumbup:
    Offensichtlich willst Du die Form hmiForm auf dem TamControl anzeigen.
    Gib dieser Form mal Me als Parent: Finde SetParent() im Forum. ;)
    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,

    Vielen Dank für die Antworten.

    @RodFromGermany
    Genau so ist es. Ich möchte die Form hmiForm auf dem TabControl anzeigen.

    Leider habe ich das SetParent nicht hinbekommen. Entweder nicht verstanden, oder es funktioniert nicht.

    Zum Verständnis:
    Ich habe eine MDI Hauptform. In dieser Hauptform sitzt die Form Optionen, dessen Parent die Hauptform ist.
    Möchte ich der hmiForm die Form Optionen als Parent zuweisen funktioniert das nicht, weil Optionen kein "IsMdiContainer" ist.
    Umstellen kann ich es aber auch nicht, da die MDI Hauptform der "IsMdiContainer" ist.
    Ich habe testhalber versucht, die hmiForm direkt auf der MDI Hauptform anzuzeigen.

    Aktueller Stand:
    Die Variablen habe ich nun einfach in der MDI Hauptform als public deklariert. Nun habe ich vollen Zugriff darauf und sie werden nicht zurückgesetzt. :thumbup:
    Leider hatte ich trotzdem keinen Zugriff auf meine Methoden.

    Ich habe zum Verständis noch eine Skizze vom Aufbau angehängt.
    Die hmiForm sitzt in einem TabControl und beninhaltet die Methode reloadContent. Drücke ich den Button um diese Funktion aufzurufen funktioniert sie.
    Außerdem gibt es einen Button "edit". Edit öffnet eine neue Form. Diese Form beinhaltet den Aufruf hmiForm.reloadContent.
    Laut Debugger läuft alles durch, in Wirklichkeit passiert aber nichts.

    Ich hoffe, jetzt ist es ein wenig verständlicher.

    Viele Grüße,
    Michael

    /Vollzitat entfernt

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

    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,

    vielen Dank @RodFromGermany, das ist genau das, was ich die ganze Zeit gesucht habe. Hat mir im Grundverständnis zu Tabs sehr weitergeholfen.

    Leider besteht im aktuellen Fall das Problem weiterhin. Ich kann nicht wie in deinem Tut beschrieben alle auftretenden Fehler löschen, da die Zeilen benötigt werden.
    Bsp. das load Ereignis. Weiterhin kommt nun beim Aufruf einer Methode der Fehler "Der Verweis auf einen freigegebenen Member erfordert einen Objektverweis."
    Ich habe versucht, die Methode Public Shared zu machen, jedoch entstehen dadurch noch mehr Fehlermeldungen, mit denen ich nichts anfangen kann.

    *zu erwähnen ist außerdem, dass ich nicht alles grundlegend umbauen kann, da ich meinen Code in eine schon lange bestehende, umfangreiche TabControl einbauen muss.

    Hat denn noch jemand eine andere Idee?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Aldi“ ()

    Aldi schrieb:

    das load Ereignis
    musst Du durch ein äquivalentes Ereignis ersetzen, ggf. .Activate, sieh mal nach, was da hinpasst.

    Aldi schrieb:

    "Der Verweis auf einen freigegebenen Member erfordert einen Objektverweis."
    Da hast Du so was ähnliches stehen wie: ControlX.DoIt() und er will MyInstanceOfControl.DoIt()
    mit MyInstanceOfControl = New XControl().
    Ansonsten poste immer den Code zu einer Fehlermeldung, da lässt es sich viel besser helfen.
    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!
    Ich habe das Problem gelöst. Im Nachhinein vollkommen klar X/ . Es war ein Problem in der Vererbung.
    Der eigentliche Name meiner Form ist "frmHmiConfig".
    Ich habe dann ein neues Objekt Dim hmiForm As New frmHmiConfig defniniert.
    Wenn ich jetzt auf eine Methode in "frmHmiConfig" zugegriffen habe, ist klar, dass in dem Tab, in dem "hmiForm" angezeigt wird, nichts passiert.

    Lösung: "frmHmiConfig" direkt auf Tab angezeigt: Alles funktioniert.

    VB.NET-Quellcode

    1. Dim hmiTab As New TabPage()
    2. frmHmiConfig.TopLevel = False
    3. ​frmHmiConfig.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    4. frmHmiConfig.Dock = DockStyle.Fill
    5. frmHmiConfig.Show()
    6. hmiTab.Controls.Add(frmHmiConfig)
    7. TabControl1.TabPages.Add(hmiTab)

    Aldi schrieb:

    Es war ein Problem in der Vererbung.
    War es nicht.
    Es war ein Problem der Default-Instanz, die VB bei Forms im Hintergrund leider immer generiert.
    Daher gibts bei Forms immer sowohl die Klasse (hier: frmHmiConfig) als auch die Instanz (hier: frmHmiConfig As frmHmiConfig), und das macht für Anfänger extrem schwierig zwischen Datentyp und Instanz zu unterscheiden.
    Tatsächlich kann man unter diesen Umständen schon den Begriff "Instanz" nicht richtig verstehen.

    Meine Empfehlung: Füge keine Forms ins TabControl ein, sondern UserControls.
    UserControls sind dafür da - Forms nicht.
    Forms haben diese schreckliche DefaultInstanz - Ucls nicht.
    Forms sind dafür da, als eigenes Fenster aufzupoppen, Ucls sind dazu da, in Forms eingebaut zu werden - etwa auf TabControls.

    Übrigens sind Forms und Ucls ansonsten nahezu identisch - du kannst etwa im frmHmiConfig-DesignerCode das Inherits ändern auf UserControl.
    Dann treten ein paar Zeilen als Fehler auf, die auf Form-Eigenschaften zugreifen - die brauchste nur zu löschen, und deine Anwendung ist "sauber"