Form sichtbar machen

  • VB.NET

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

    Form sichtbar machen

    Hallo Community

    Eine vermutlich einfache Frage als .NET-Neuling (mit VB6-Erfahrung): Ich starte meine Applikation in einem Modul mit "Sub Main". Dort möchte ich eine vorhandene Form sichtbar machen mit dem Befehl "frmXY.Show() ". Das funktioniert auch, aber das Fenster verschwindet wieder, sobald "Sub Main" abgearbeitet ist. Bei VB6 blieb die Form sichtbar. Wie erreiche ich das mit .NET?

    Danke für Tipps

    Bernhard
    Uff, die andere Welt ist ja das.
    Also:
    Instanziierung von Forms und Aufruf von Dialogen
    Dann haben Module in .NET nichts mehr verloren, da arbeitet man komplett mit Klassen. Im Normalfall musst Du eigentlich das gar nicht machen, sondern kannst einfach in den Einstellungen Form1 als Startdialog wählen und den Rest macht's dann selber.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Grüter Willkommen im Forum. :thumbup:
    Erstell Dir eine WinForm-Anwendung, nicht aber eine Console.
    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 Trade und RodFromGermany

    Danke für die Replik. Ich hab (noch) keine grosse Ahnung von .NET - hab ich euch da richtig verstanden? Statt wie mein Vorschlag in einem Modul

    Sub Main
    ...
    Wenn dieses, zeige Form1
    Wenn jenes, zeige Form2
    Wenn drittes, zeige gar nichts und beende
    End Sub

    wollt Ihr besser in z.B. Form1

    Sub Form1_Load
    Wenn dieses, mache nichts [denn Form1 wird automatisch gezeigt]
    Wenn jenes, zeige Form2 und mache Form1 unsichtbar
    Wenn drittes, mache Form1 unsichtbar und beende
    End Sub

    Scheint mir aber vom Denken her eher komplizierter zu sein... Oder bin ich da komplett auf dem Holzweg???

    Danke, Bernhard

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Grüter“ ()

    Willkommen,

    erstell dir ein neues Projekt und verwende statt eine Konsolenanwendung eine "Windows Forms-Anwendung".
    Unter (Projekt -> Eigenschaften) kannst du dann unter "Anwendung" die Option für "Modus für das Herunterfahren" umstellen.

    Mfg
    Hallo NXGENMeteora

    Ich habe schon seit Anfang an keine Konsolenanwendung, sondern eine Windows Forms-Anwendung (mit 3 Forms und einem zusätzlichen Modul, welches die Start-Sub enthält).
    Um diese Sub als Start-Sub auszuwählen, muss ich aber auf deiner erwähnten Seite "Anwendung" das Anwendungsframework deaktivieren, sodass ich "Modus für das Herunterfahren" jetzt nicht mehr auswählen kann.

    Danke trotzdem, Bernhard
    Wenn du das Framework aktivierst, was du logischerweiße bei einer WinForms Anwendung machen solltest, dann brauchst du auch ein Startformular und kein Startobjekt.

    Sub Main = Objekt
    Form1 = Formular

    Also wähle eine Form als Startformular aus und kein Objekt.
    Probier mal das Form Load Event aus :) Scheint dir eventuell komplizierter, doch du wirst merken dass es wirklich nicht der Fall ist ;-).
    Starte dein Programm nicht von einem Modul aus. Dann klappt dein Vorhaben.

    EDIT: Die Oma war schneller :{ :-]
    Hey,

    Du kannst durchaus auch bei einer WinForms-Anwendung die Sub-Main als Einstiegspunkt wählen. Genau dies macht auch C#. Dazu dekativierst Du das Anwendungsframework und wählst als Einstiegspunkt Sub Main.

    Am besten Du erstellst Dir ein C#-Projekt und siehst dort nach, welche Aufrufe dann von Nöten sind, um z. B. die Visual-Styles wieder zu aktivieren. Ich weiß die Aufrufe jetzt leider nicht aus dem Kopf.

    Es macht aus meiner Sicht auch durchaus Sinn, generell auch mit WinForms so zu arbeiten.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Grüter schrieb:

    welches die Start-Sub enthält
    Das solltest Du erst machen, wenn Du tiefer in die Materie eingestiegen bist.
    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 nochmals

    @ SpacyX: Ja, das wäre eine elegante Lösung. Nur funktioniert sie (bei meinem VisualStudio 2012) nicht. Sobald ich in Form1.vb eine "Sub Main" erzeuge, meckert die IDE.

    Bleibt noch der (für mich ziemlich kuriose) Lösungsansatz von Posting Nr. 4. Nur: Wie kann man dort die Anzeige von Form1 in "Sub Form1_Load" verhindern? "form1.hide" funktioniert nicht, "Me.Opacity = 0" würde gehen, aber das ist ja wirklich nicht professionell, da im TaskManager die Form1 trotzdem sichtbar ist. Wie löst Ihr denn dieses Problem elegant?

    Danke für Tipps, Bernhard

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Grüter“ ()

    Wie ich beschrieben habe, musst Du unter den Projekteinstellungen das Anweundungsframework deaktivieren und als Einsteigspunkt die Sub-Main wählen, dann funktioniert es. Kann Dir atm. leider nicht bildliche weiterhelfen, da ich in der Arbeit bin.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hallo spaceyX und timonator

    Wie im Posting 6 beschrieben, weiss ich, wie man den Einstiegspunkt "Sub Main" wählt. Aber das geht - im Gegensatz zu deiner Behauptung im Posting 9 - nur, wenn ein Modul mit dieser "Sub Main" vorliegt (mit dem unschönen, im Posting 1 beschriebenen Effekt). Eine "Sub Main" in Form1.vb gibt nämlich wie in 11 erwähnt eine Fehlermeldung, siehe remob.lima-city.de/main.png
    Geht das bei dir wirklich? Oder meinst du nur, dass es funktionieren sollte?

    Danke, Bernhard

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Grüter“ ()

    Grüter schrieb:

    Hallo nochmals
    Sieh Dir mal dies und die Umgebung an.
    -----------------
    Die Public Sub Main gehört nicht in eine Form, sondern in das Public Module Program

    RodFromGermany schrieb:

    Das solltest Du erst machen, wenn Du tiefer in die Materie eingestiegen bist.


    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!

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

    Hallo Rod

    Ich denke, du meinst, dass der Rahmen meiner Form1.vb so aussehen soll:

    Quellcode

    1. Public Module Program
    2. Public Sub Main()
    3. If ... then Form2.Show()
    4. If ... then Form3.Show()
    5. If ... then Form4.Show()
    6. End Sub
    7. ...
    8. End Module


    Diese Sub Main kann ich tatsächlich starten, aber damit bin ich gleich weit wie bei meinem ersten Posting: Form2 und 3 verschwinden, sobald Sub Main abgearbeitet ist. Und ShowDialog löst das Problem nicht, da ich beide Forms gleichzeitig brauche.

    Bin immer noch ratlos. Es kann doch nicht sein, dass folgender Programmrahmen so schwer von VB6 nach .NET zu migrieren ist:

    Quellcode

    1. Sub Main
    2. ...
    3. Wenn dieses, zeige Form2 und 3
    4. Wenn jenes, zeige Form4
    5. Wenn drittes, zeige gar nichts und beende
    6. End Sub


    Danke für alle konstruktiven Beiträge

    Bernhard
    Du musst die entsprechende Form mit Application.Run() ins Leben rufen. Ich habe Dir ja oben gesagt, schau bei C#, wie es da gemacht wird.

    VB.NET-Quellcode

    1. Module Program
    2. Private _someCondition As Boolean
    3. Public Sub Main(args As String())
    4. Application.EnableVisualStyles()
    5. Application.SetCompatibleTextRenderingDefault(False)
    6. If _someCondition Then
    7. Application.Run(New Form1())
    8. Else
    9. Application.Run(New Form2())
    10. End If
    11. End Sub
    12. End Module
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Grüter schrieb:

    Ich denke, du meinst
    dass ich mein Problem noch nicht perfekt beschrieben habe ...
    VB.NET funktioniert nun mal völlig anders als VB6.
    Es hibt genau ein Hauptfenster, also ist Dein Wunsch nach Anzeige von Form2 und 3 so nicht machbar.
    Es wäre hilfreich, Du schreibst mal auf, was tatsächlich passieren soll, ohne einen Bezug auf VB6 oder VB.NET zu nehmen.
    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:

    Es wäre hilfreich, Du schreibst mal auf, was tatsächlich passieren soll

    Kann ich gerne machen:

    In einer Access-DB sind alle Termine meiner Agenda, in der ich u.a. auch eingetragen habe, wie lang im Voraus ich erinnert werden soll. Das Programm läuft jede Stunde an und testet, ob es etwas anzeigen muss (meistens merke ich also gar nichts von dieser Hintergrundarbeit, es erscheint keine Form, auch nicht aufblitzend). Sollte ein oder mehrere Termine anstehen, werden diese in einem DataGrid (=Form 1) angezeigt. Wenn ich z.B. einen neuen Termin eingeben will, starte ich das Programm im Editiermodus ("/e") und dann zeigt mir das Programm sämtliche Termine und Informationen in einem umfangreichen, editierbaren DataGrid und einem Kalenderfenster an (=Form 2 + 3).

    Natürlich könnte ich zwei verschiedene exe schreiben (eines für allfällige Erinnerungen, eines für Editiermodus). Beide exe hätten dann aber viele Parallelen, und Änderungen müssten immer in beiden exe gemacht werden. Drum möchte ich gerne alles in einer einzigen Anwendung.

    Danke fürs Mitdenken,

    Bernhard

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Grüter“ ()

    Grüter schrieb:

    in einer einzigen Anwendung
    Na also.
    Gib Deiner (unsichtbaren) Form ein Notify Icon, dort kannst Du dann ein Popup-Menu öffnen und Deine Edit-Form anzeigen.
    Feddich. :D
    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!