none
Probleme mit Public-Variable und Form RRS feed

  • Frage

  • Hallo,
    ich habe eine Forms-Anwendung mit folgendem Code:

    Public Class MainForm Public Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Call MainFormInit(Me) End Sub
    End Class

    Module mMainFormInit Sub MainFormInit(ByVal OBJ As Object) pMainForm = OBJ pMainForm.WindowState = FormWindowState.Maximized End Sub
    End Module

    Die Variable ist deklariert in:
    (Ich weiß, dass es modernere Möglichkeiten als Publics gibt, aber das ist ein existierendes Programm)

    Module PublicsFormulare Public pMainForm As Object
    End Module

    Nach dem Start wird auch MainFormInit korrekt aufgerufen, es öffnet sich jedoch mit dem Befehl pMainForm = OBJ das bei der Erstellung des Projektes verwendete kleine Startfenster.
    Zum Befehl pMainForm.WindowState.... kommt er gar nicht mehr .
    Das Programm hat vor einigen Tagen noch korrekt gelaufen, nach einer Änderung (welche, weiss ich auch nicht mehr) kam dieser Fehler.

    VB 2010 Express; Projekt (neu) erstellen brachte keinen Erfolg.

    Hat jemand eine Idee und kann mir weiterhelfen?


    Dienstag, 10. Juli 2012 17:28

Antworten

  • Hallo Sven,

    die "Publics" sind weniger das Problem, mehr das Verwenden von Object, dort wo es gar nicht nötig ist.
    So wird Dein Code nur mit später Bindung laufen und Fehler findest erst zur Laufzeit.
    Sinnvoll - gerade für Anfänger - ist es durchgängig mit Option Strict On und dies für das Projekt zu aktivieren.

    Und damit der Compiler Ruhe gibt:

      Private Sub MainForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            mMainFormInit.MainFormInit(Me) ' Übergabe der aktuellen Instanz
      End Sub
    
    Module PublicsFormulare
        Public pMainForm As Form
    End Module
    
    Module mMainFormInit
        Sub MainFormInit(ByVal form As Form)
            PublicsFormulare.pMainForm = form
            PublicsFormulare.pMainForm.WindowState = FormWindowState.Maximized
        End Sub
    End Module
    
    Das nur zu zeigen wie es funktioniert könnte. Denn die vielen Module sind überhaupt nicht notwendig.
    Du kannst über Application.OpenForms auf alle zur Zeit geöffneten Formulare zurückgreifen.

    Und wenn Dein Code den zuletzt gesicherten Stand (Vollbild oder nicht herstellen soll, könntest Du z. B. etwas
    verwenden wie http://www.codeproject.com/Articles/12252/Application-settings-in-VB-NET-2-0-and-Visual-Stud

    Solltest Du andere Ziele verfolgen, erzähl uns davon. Dafür gibt es auch Lösungen.

    Gruß Elmar

    Dienstag, 10. Juli 2012 18:19
  • Hallo Sven,

    es funktioniert doch. Ich kann Elmar unterstützen.

    Public Class Form1
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            MainFormInit(Me)
        End Sub
    End Class

    Und der code für das Module (wieso Modul?)

    Module Module1
        Sub MainFormInit(ByVal OBJ As Form)
            OBJ.WindowState = FormWindowState.Maximized
        End Sub
    End Module

    Gruss Ellen

    Ich benutze/ I'm using VB2008 & VB2010

    Samstag, 21. Juli 2012 21:31

Alle Antworten

  • Hallo Sven,

    die "Publics" sind weniger das Problem, mehr das Verwenden von Object, dort wo es gar nicht nötig ist.
    So wird Dein Code nur mit später Bindung laufen und Fehler findest erst zur Laufzeit.
    Sinnvoll - gerade für Anfänger - ist es durchgängig mit Option Strict On und dies für das Projekt zu aktivieren.

    Und damit der Compiler Ruhe gibt:

      Private Sub MainForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            mMainFormInit.MainFormInit(Me) ' Übergabe der aktuellen Instanz
      End Sub
    
    Module PublicsFormulare
        Public pMainForm As Form
    End Module
    
    Module mMainFormInit
        Sub MainFormInit(ByVal form As Form)
            PublicsFormulare.pMainForm = form
            PublicsFormulare.pMainForm.WindowState = FormWindowState.Maximized
        End Sub
    End Module
    
    Das nur zu zeigen wie es funktioniert könnte. Denn die vielen Module sind überhaupt nicht notwendig.
    Du kannst über Application.OpenForms auf alle zur Zeit geöffneten Formulare zurückgreifen.

    Und wenn Dein Code den zuletzt gesicherten Stand (Vollbild oder nicht herstellen soll, könntest Du z. B. etwas
    verwenden wie http://www.codeproject.com/Articles/12252/Application-settings-in-VB-NET-2-0-and-Visual-Stud

    Solltest Du andere Ziele verfolgen, erzähl uns davon. Dafür gibt es auch Lösungen.

    Gruß Elmar

    Dienstag, 10. Juli 2012 18:19
  • Hallo Elmar,

    leider hat Dein Vorschlag keinen Erfolg gebracht: Sobald ich in mMainFormInit die Form der Public-Variablen zuweise, öffnet das kleine Fenster - zum Maximieren kommt er nicht mehr.

    Ich habe daraufhin weiter gesucht - und auch den Fehler gefunden. Und obwohl es ein ziemlich dummer Fehler von mir ist, teile ich ihn trotzdem mit: In den Publics habe ich eine neue Bitmap aus einer .png-Datei erstellt - dabei aber eine Pfadangabe verwendet, die erst später zur Laufzeit gesetzt wird.
    Ist halt vom Compiler auch nicht ganz sauber: Keine Fehlermeldung, auch nicht zur Laufzeit.

    Mit Strict On hätte ich das aber auch nicht gefunden.

    Trotzdem: Vielen Dank für Deine Bemühungen.

    Gruß Sven


    Sven Grabau

    Mittwoch, 11. Juli 2012 13:35
  • Hallo Sven,

    es funktioniert doch. Ich kann Elmar unterstützen.

    Public Class Form1
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            MainFormInit(Me)
        End Sub
    End Class

    Und der code für das Module (wieso Modul?)

    Module Module1
        Sub MainFormInit(ByVal OBJ As Form)
            OBJ.WindowState = FormWindowState.Maximized
        End Sub
    End Module

    Gruss Ellen

    Ich benutze/ I'm using VB2008 & VB2010

    Samstag, 21. Juli 2012 21:31
  • Hallo SvenGrab,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 3. August 2012 13:29