Anwendung mit Sub Main starten

    • Allgemein

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

      Anwendung mit Sub Main starten

      Üblicherweise packt man seine Anwendungs-Initialisierung einfach ins Form_Load-Event des Forms, welches man in den Anwendungseinstellungen als StartUp-Form festgelegt hat.
      Aber manchmal will man noch vor dem allerersten SichtbarWerden etwas erledigen, was entscheidend die Präsentation der Anwendung bestimmt.
      Etwa ein LogIn mag bestimmen, welche Daten geladen werden, welches Form angezeigt, und ob überhaupt eines.

      In solchen Fällen muß man halt in den Projekt-Eigenschaften das AnwendungsFramework deaktivieren, und eine Sub Main coden und als Einsprungspunkt der Anwendung festlegen.
      Mit ein paar Anweisungen hat man auch händisch erledigt, was das AnwendungsFramework normalerweise für einen tut:

      VB.NET-Quellcode

      1. Public Module Program
      2. <STAThread()> _
      3. Public Sub Main(ByVal commandLineArgs As String())
      4. Application.EnableVisualStyles()
      5. Application.SetCompatibleTextRenderingDefault(False)
      6. Dim frmStartup As Form = Nothing
      7. Using frmMenu As New frmMenu
      8. With frmMenu
      9. .ShowDialog()
      10. Dim activeCtl = .ActiveControl
      11. Select Case True
      12. Case activeCtl Is .btForm1 : frmStartup = New Form1
      13. Case activeCtl Is .btForm2 : frmStartup = New Form2
      14. Case activeCtl Is .btForm3 : frmStartup = New Form3
      15. Case activeCtl Is .btForm4 : frmStartup = New Form4
      16. Case activeCtl Is .btSettingsBinding : frmStartup = New frmSettingsBinding
      17. Case Else : Return
      18. End Select
      19. End With
      20. End Using
      21. Application.Run(frmStartup)
      22. My.Settings.Save()
      23. End Sub
      24. End Module
      Also von Belang sind in diesem Sample die Zeilen #5, #6 und #22, #23.
      • #5: passt die Optik an das im Windows festgelegte Theme an
      • #6: weiß ich garnet, was das macht - kann mir jmd helfen?
      • #22: startet die eigliche Anwendung, legt das angegebene Form als Mainform fest. Die Anwendung beendet, wenn dieses Form geschlossen wird.
      • #23: speichert bei Programm-Ende die Settings zurück (falls Veränderungen stattfanden - andernfalls: auch nicht schlimm)



      Übrigens: Diese Art, ein WinForms-Programm zu starten ist in c# die einzige ühaupt mögliche.
      Das Fehlen eines AnwendungsFrameworks in c# mag zwar primitiv erscheinen, aber eiglich isses doch transparenter vom Programm-Ablauf her.
      Dateien

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

      ErfinderDesRades schrieb:

      #6: weiß ich garnet, was das macht - kann mir jmd helfen?

      EInige Steuerelemente, Labels oder Buttons, haben ja die EIgenschaft UseCompatibleTextRendering. Mit SetCompatibleTextRenderingDefault(False) bestimmst du nun, dass alle Controls, die die Eigenschaft haben, diese auf False gesetzt bekommen.

      Zur Bedeutung von UseCompatibleTextRendering bediene ich mich mal bei MSDN:
      Bestimmte Windows Forms-Steuerelemente können für die Wiedergabe ihres Texts entweder die GDI-Grafikbibliothek oder die neuere GDI+-Bibliothek verwenden. Diese Änderung wurde aufgrund von Leistungs- und Lokalisierungsproblemen in Zusammenhang mit GDI+ vorgenommen. Vorhandene Steuerelemente, die die UseCompatibleTextRendering-Eigenschaft unterstützen, sind für Abwärtskompatibilität standardmäßig auf true festgelegt. Für alle neuen Steuerelemente in Umgebungen wie Visual Studio ist diese Eigenschaft jedoch auf false festgelegt. Verwenden Sie SetCompatibleTextRenderingDefault, wenn Sie die Standardtextwiedergabe für neue Steuerelemente ändern möchten.


      Und das sind dann die grafischen Auswirkungen:

      Wie man sieht, ist bei aktivierter Eigenschaft der Text etwas weicher. Außerdem wird scheinbar eine andere Metrik benutzt, da der Text des Labels weiter rechts anfängt und die Größe des Labels mit AutoSize auch eine andere ist.

      Skybird schrieb:

      Das sind ja Ubisoftmethoden hier !

      Wenn nicht unbedingt eine Form zum Starten ausgewählt werden muss, lässt sich solch Code auch in der MyApplication_Startup-Prozedur einfügen.
      In jedem Falle ist die eine oder andere Stelle im Programmablauf dafür prädestiniert, wichtige Einstellungen für das Programm vorzunehmen, z.B.
      um eine Sprache für das Programm zu selektieren
      oder
      um eine Console an das Programm zu hängen, wo Testausgaben vom Programm hineingeschrieben werden können, z.B. zur Überwachung von mehreren Threads.
      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!

      RodFromGermany schrieb:

      Wenn nicht unbedingt eine Form zum Starten ausgewählt werden muss, lässt sich solch Code auch in der MyApplication_Startup-Prozedur einfügen.

      Das hab ich jetzt glatt ausprobiert - und selbst das geht!
      In den Projekteigenschaften mw. Form1 als StartForm festlegen, dann aber "Anwendungsereignisse anzeigen" klicksen, und dort zB:

      VB.NET-Quellcode

      1. Namespace My
      2. ' Für MyApplication sind folgende Ereignisse verfügbar:
      3. '
      4. ' Startup: Wird beim Starten der Anwendung noch vor dem Erstellen des Startformulars ausgelöst.
      5. ' Shutdown: Wird nach dem Schließen aller Anwendungsformulare ausgelöst. Dieses Ereignis wird nicht ausgelöst, wenn die Anwendung nicht normal beendet wird.
      6. ' UnhandledException: Wird ausgelöst, wenn in der Anwendung eine unbehandelte Ausnahme auftritt.
      7. ' StartupNextInstance: Wird beim Starten einer Einzelinstanzanwendung ausgelöst, wenn diese bereits aktiv ist.
      8. ' NetworkAvailabilityChanged: Wird beim Herstellen oder Trennen der Netzwerkverbindung ausgelöst.
      9. Partial Friend Class MyApplication
      10. Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
      11. Me.MainForm = New Form2
      12. End Sub
      13. End Class
      14. End Namespace
      MainForm ist nun Form2 - anders als in den Projekteigenschaften angegeben - naja - ihr könnt euch sicher denken, ob ich das empfehle ;) - aber es ist möglich.