none
Verhindern das Startformular mehrfach geladen wird (StartupNextInstance) RRS feed

  • Frage

  • Hallo Leute,

    ich habe ein kleines Problem.

    In meinem Programm muss ich ja ein Startformular immer angeben. Ferner habe ich das Programm als Einzelinstanz definiert und überprüfe mit dem StartupNextInstance-Ereignis den Mehrfachstart. So weit, so gut.

    Aber wie kann ich das Laden des Startformulares denn verhindern?

    Hier mein StartupNextInstance-Code:

    Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
    
    Dim inputArgument As String = "/"
    Dim inputName As String = ""
    
     For Each s As String In e.CommandLine
      If s.ToLower.StartsWith(inputArgument) Then
       inputName = s.Remove(0, inputArgument.Length)
      End If
      Call MainLoadNotizen(CInt(inputName))
    Next
    
     End Sub
    

    Ich bin da etwas ratlos.

    Danke schon einmal im voraus.

    Gruß Ahmed

    Montag, 29. November 2010 08:58

Antworten

  • Hallo Ahmed,

    wenn Du unter den Projekt-Einstellungen bei den Anwendungs Eigenschaften  die Einstellung
    "Einzelinstanzanwendung erstellen" aktivierst,  so wird die Anwendung nur einmalig gestartet,
    siehe Gewusst wie: Angeben des Instanziierungsverhaltens für eine Anwendung (Visual Basic)

    Gruß Elmar

    Montag, 29. November 2010 10:40
    Beantworter
  • Hallo Ahmed,

    Skydrive kenne ich zwar nicht, aber ich habe mein Projekt einmal als ZIP auf Upload.to online gestellt:

    mit Deiner Live ID für die MSDN Foren stehen Dir auf Skydrive 25 GB Speicherplatz zur Verfügung über die Du Dateien für andere freigeben kannst. Auch mit Zugriffsbeschränkung, Freigabe für bestimmte Live IDs etc. Aber andere Dienste gehen natürlich auch.

    1. Es wird ein frmStart geladen und die Systray minimiert.

    Dieses unwichtige und unwesentliche Detail erwähnst Du zum ersten Mal. Hier wird Dein Formular nicht mehrfach angezeigt, sondern es wird aus dem minimierten Status schlicht wiederhergestellt. Wenn das unerwünscht ist, kannst Du das im StartupNextInstance Ereignis über e.BringToFront = False verhindern:

      Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, _
              ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs _
                  ) Handles Me.StartupNextInstance
       e.BringToForeground = False
    
       ' Dein weiterer Code ...
      End Sub

    Das sollte es gewesen sein.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Montag, 29. November 2010 12:19
    Moderator

Alle Antworten

  • Hallo Ahmed,

    In meinem Programm muss ich ja ein Startformular immer angeben. Ferner habe ich das Programm als Einzelinstanz definiert und überprüfe mit dem StartupNextInstance-Ereignis den Mehrfachstart. So weit, so gut.

    Aber wie kann ich das Laden des Startformulares denn verhindern?

    wenn Du Deine Anwendung als Einzelinstanzanwendung definiert hast, erledigt VB dies eigentlich bereits automatisch und lädt kein zweites Mal Deine Anwendung bzw. das Startformular.

    Hier mein StartupNextInstance-Code:

    Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
     Dim inputArgument As String = "/"
     Dim inputName As String = ""
    
     For Each s As String In e.CommandLine
      If s.ToLower.StartsWith(inputArgument) Then
       inputName = s.Remove(0, inputArgument.Length)
      End If
     <br/>
      Call MainLoadNotizen(CInt(inputName))
    <br/>
     Next
     End Sub
     

    Ich kenne Deine Methode 'MainLoadNotizen' nicht. Aber ich vermute hier lädst Du das Startformular erneut, oder? Ansonsten kann ich in Deinem Code nicht erkennen, wo das Startformular erneut geladen werden sollte. Sonst kannst Du auch einen Haltepunkt in Form_Load bzw. im Konstruktor Deines Startformulars setzen, führst dieses in der IDE aus und startest die zweite Instanz über den Explorer (Anwendung im bin\debug Verzeichnis Deines Projekts). Dann kannst Du Dir die Aufrufliste (Callstack) anzeigen lassen und den Aufruf zurückverfolgen.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Montag, 29. November 2010 09:28
    Moderator
  • Hallo Thorsten,

    nein, mein frmStart wird beim Programmstart automatisch geladen. Ich kann in den Einstellungen keine vernünftige andere Einstellung als

    Anwendungstyp: Windows-Forms-Anwendung und

    Startformular: frmStart definieren.

    Und jetzt möchte ich einfach nicht, dass das Formular 'frmStart' erneut geladen wird.

    Ich habe es auch irgendwie nicht hinbekommen, dass ich vernünftig alles über ein Sub-Routine Main() starte.

    Gruß Ahmed

    Montag, 29. November 2010 09:41
  • Hallo Ahmed,

    wenn Du unter den Projekt-Einstellungen bei den Anwendungs Eigenschaften  die Einstellung
    "Einzelinstanzanwendung erstellen" aktivierst,  so wird die Anwendung nur einmalig gestartet,
    siehe Gewusst wie: Angeben des Instanziierungsverhaltens für eine Anwendung (Visual Basic)

    Gruß Elmar

    Montag, 29. November 2010 10:40
    Beantworter
  • Das Formular 'frmStart' wird aber mehrfach geladen und das möchte ich unterbinden.

    Montag, 29. November 2010 11:04
  • Hallo Ahmed,

    Das Formular 'frmStart' wird aber mehrfach geladen und das möchte ich unterbinden.

    wenn Du so vorgegangen bist, wie Elmar beschrieben, liegt es definitiv an Deinem Code, der frmStart mehrfach lädt. Wenn Du allerdings das Anwendungsframework nicht verwendest, sondern Sub Main, funktioniert das mit der Einzelinstanzanwendung und dem StartupNextInstance Ereignis ohnehin nicht. Am einfachsten wäre ein reproduzierbares Beispielprojekt, das Du hier bereitstellst (via Skydrive).


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Montag, 29. November 2010 11:16
    Moderator
  • Skydrive kenne ich zwar nicht, aber ich habe mein Projekt einmal als ZIP auf Upload.to online gestellt:

    http://ul.to/9qk628

    Was macht mein Projekt:

    1. Es wird ein frmStart geladen und die Systray minimiert.

    2. Aus einer Access-DB sollen alle Desktop-Notizen in eigenständige Formulare auf den Desktop geladen  werden. Das erfolgt nur einmal beim Systemstart.

    3. Aus einem anderen Programm wird jetzt nach der Erstellung weiterer Notizen, mein Programm per Batchbefehl z.B. Notizen_Desktop /612 die neue DokId übergeben und es soll ein weiteres Notizformular geladen werden.

    4. Dabei darf natürlich das frmStart nicht mehr angesprochen werden. Derzeit ist es aber so, dass das frmStart aus dem minimize erneut angezeigt wird.

    Ich hoffe das ist etwas verständlicher.

    Danke für die Hilfe.

    Gruß Ahmed

    P.S. Das Programm befindet sich noch im frühen Stadium. Das Grundsätzliche funktioniert aber einwandfrei.

    Montag, 29. November 2010 11:49
  • Hallo Ahmed,

    Skydrive kenne ich zwar nicht, aber ich habe mein Projekt einmal als ZIP auf Upload.to online gestellt:

    mit Deiner Live ID für die MSDN Foren stehen Dir auf Skydrive 25 GB Speicherplatz zur Verfügung über die Du Dateien für andere freigeben kannst. Auch mit Zugriffsbeschränkung, Freigabe für bestimmte Live IDs etc. Aber andere Dienste gehen natürlich auch.

    1. Es wird ein frmStart geladen und die Systray minimiert.

    Dieses unwichtige und unwesentliche Detail erwähnst Du zum ersten Mal. Hier wird Dein Formular nicht mehrfach angezeigt, sondern es wird aus dem minimierten Status schlicht wiederhergestellt. Wenn das unerwünscht ist, kannst Du das im StartupNextInstance Ereignis über e.BringToFront = False verhindern:

      Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, _
              ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs _
                  ) Handles Me.StartupNextInstance
       e.BringToForeground = False
    
       ' Dein weiterer Code ...
      End Sub

    Das sollte es gewesen sein.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Montag, 29. November 2010 12:19
    Moderator
  • Danke, genau das war es.

    Ich tue mich mit dem VBNet unheimlich schwer. Die Möglichkeiten sind schon toll, aber es ist wirklich komplett anders als VB6.

    Nächstes mal liefere ich gleich mehr Infos.

    Gruß Ahmed

    Montag, 29. November 2010 13:18