Formular aus Modul heraus aufrufen und Parameter übergeben

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Formular aus Modul heraus aufrufen und Parameter übergeben

    Hi zusammen,

    vielleicht könnt ihr mir weiterhelfen:

    In einer Access Anwendung öffne ich mit einer Shell Anweisung eine VB2010 *.exe und übergebe einen Parameter mit (ID=3152675).
    Das funktioniert auch soweit gut und die ID kommt auch in der exe an.
    Anschließend möchte ich gerne die ID in der exe verwenden um weitere Aktion auszuführen. Allerdings bekomme ich den Parameter NICHT vom Modul an das Hauptformular frmMain übergeben!

    Hier ist mein Code:

    Module basParameter

    Public sParameter as string

    Public Sub main()
    sParameter = Command$()
    MsgBox(sParameter) 'hier sehe ich, dass die ID auch tatsächlich ankommt
    Application.Run(frmMain)
    End Sub

    End Module


    Public Class frmMain

    Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    MsgBox(sParameter) ' an dieser Stelle FEHLT der Inhalt des Parameters! Hier wird eine leere MsgBox ausgegeben!

    End Sub

    End Class


    Hat vielleicht irgendjemand eine Idee wie ich es schaffe den Parameter vom Modul in das frmMain zu übergeben?
    Ich komme einfach nicht weiter :(

    Dickes DANKE und LG
    Sabrina

    Edit by ~blaze~:
    *Rot ist den Moderatoren vorbehalten*

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

    Command$ ist out.

    VB.NET-Quellcode

    1. Dim txt() As String = Environment.GetCommandLineArgs()
    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!
    Bitte präzise.
    In was für einer Codezeile kommt denn diese Meldung?

    VB.NET-Quellcode

    1. Dim txt() As String = Environment.GetCommandLineArgs()

    ist überall aufrufbar und bringt keinen Fehler! :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!
    Err.Erl :thumbdown:
    .NET: Try - Catch
    Kannst Du vielleicht Deinen Code mal posten?
    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!
    Code im Modul:

    VB.NET-Quellcode

    1. Public Function fParameter() As String
    2. fParameter = Command$()
    3. Application.Run(frmMain)
    4. End Sub
    5. End Module
    6. End Class




    Code im Form:

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    3. dim Parameter As String
    4. Parameter = fParameter
    5. MsgBox(fParameter)
    6. End Sub
    ;(
    Wenn, dann alles erforderliche, damit man das in ein Formular packen und sofort testen kann.
    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!
    Hi
    Du scheinst eher aus der VB6-Ecke zu kommen. In Vb.Net sollte man die Methoden, die aus den Modulen der Microsoft.VisualBasic-Dll standardmäßig verwiesen werden, nicht nutzen (das sind alle Methoden, die man einfach so aufrufen kann, ohne auf eine Klasse explizit zuzugreifen, wie Left, Mid usw.). Außerdem sollte man unschöne Sachen, wie On Error GoTo oder On Error Resume Next durch Try-Catch-Blöcke ersetzen (GoTo sollte man generell nicht verwenden).

    Da du die Main-Methode sowieso aufrufst, kannst du da auch gleich die Commandline-Args mit übergeben:

    VB.NET-Quellcode

    1. Public Shared Sub Main(ByVal args() As String)


    args enthält hier ein Array aus Commandline-Argumenten. Um dem hässlichen frmMain vorzubeugen, sollte man in der Klasse, die auch die statische Main-Methode enthält (kein Modul, das ist veraltet!) eine statische Variable anlegen (z.B. fmMainForm) und über eine Property bei einem Zugriff bei Bedarf einen neuen Wert zuweisen:

    VB.NET-Quellcode

    1. Private Shared fmMainForm As frmMain
    2. Public Shared ReadOnly Property MainForm() As frmMain
    3. Get
    4. If frmMainForm Is Nothing OrElse frmMainForm.IsDisposed() = True Then
    5. fmMainForm = New frmMain()
    6. End If
    7. Return fmMainForm
    8. End Get
    9. End Property


    Die Main-Methode könnte dann zum Beispiel so aussehen:

    VB.NET-Quellcode

    1. Public Shared Sub Main(ByVal args() As String)
    2. Dim ID As Long
    3. For Each arg As String in args
    4. If arg.StartsWith("ID") Then
    5. If Not Long.TryParse(arg.Substring(2), ID) Then
    6. 'ID konnte nicht ermittelt werden. Die ID wird mit ID0 uebergeben
    7. End If
    8. End If
    9. Next
    10. If ID <> 0L Then
    11. MainForm.ID = ID
    12. Application.Run(MainForm)
    13. End If
    14. End Sub


    Achte aber dabei, dass du die Main-Methode mit der MainForm-Eigenschaft und dessen Feld in die selbe Klasse setzt. Das Format (wie oben geschrieben) für den ID-Parameter habe ich einfach mal mit ID[Zahl] bezeichnet.

    Edit: Die MainForm muss natürlich dann eine Eigenschaft enthalten, die die ID empfangen kann:

    VB.NET-Quellcode

    1. Private lngID As Long
    2. Public Property ID() As Long
    3. Get
    4. Return lngID
    5. End Get
    6. Set(ByVal value As Long)
    7. lngID = value
    8. End Set
    9. End Property


    Gruß
    ~blaze~