Konsolenanwendung ohne Dos-Fenster möglich?

  • VB.NET

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

    Konsolenanwendung ohne Dos-Fenster möglich?

    Moin !

    ich möchte eine Anwendung erstellen bei der zunächst Parameter ermittelt werden und dann eine Form angezeigt wird.

    Deshalb habe ich das ganze als Konsolenanwendung erstellt. Aber dieses schwarze Dos-Fenster möchte ich nicht angezeigt bekommen.

    Habe ich etwas falsch gemacht und kann ich das (wie) noch wieder umstellen?

    Gruß Jan
    youtube.com/watch?v=2w-ZJacCkds&feature=youtu.be

    Deaktiviere das Anwendungsframework und nutze die Sub Main als Einstiegspunkt für Deine Anwendung.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @jan99 Präzisiere mal die Aufgabenstellung.
    Was wird wann wo gemacht und was wird angezeigt oder nicht.
    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!
    Moin!

    auch auf die Gefahr hin, dass ich das mit der Codeübertragung noch nicht richtig verstanden habe poste ich das Hauptteil einmal. Daran wird jeder vermutlich einfacher verstehen als meine 1000 Worte.

    Zusammenfassend nur gesagt:
    * Aufrufen einer Funktion mit einem erforderlichen Übergabeparameter (Verzeichnispfad)
    * Prüfen des Pfades auf Voraussetzungen
    * öffnen einer Form in der dann alles weiter passiert.

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Reflection
    4. Imports System.Net.Mail
    5. Imports System.Net.Mime.MediaTypeNames
    6. Module main
    7. ''' <summary>
    8. ''' Hauptmodul
    9. ''' </summary>
    10. Sub Main()
    11. ' Dim _TextBlock4Statistik As String = ""
    12. Dim MeinenEigenenExeNamen As String = ""
    13. Dim arguments As String() = System.Environment.GetCommandLineArgs()
    14. Dim AllowLaufwerk As String = "Y:\"
    15. Dim Folder2List As String = ""
    16. Dim FolderParts As String()
    17. Dim MsgClose As String = vbCrLf & vbCrLf & "Funktion wird vorzeitig beendet!"
    18. ' CMD-Ausgabe der Überschrift
    19. MeinenEigenenExeNamen = arguments(0).ToUpper
    20. If arguments.Count = 1 Then
    21. MsgBox("Es wurde kein Parameter für das auszuwertende Verzeichnis übergeben!", MsgBoxStyle.Exclamation, k_AppName)
    22. Exit Sub
    23. End If
    24. If Not arguments.Count = 2 Then
    25. MsgBox("Es wurden zuviele Parameter übergeben!" & MsgClose, MsgBoxStyle.Exclamation, k_AppName)
    26. Exit Sub
    27. End If
    28. Folder2List = arguments(1)
    29. If Folder2List.Length < 4 Then
    30. MsgBox("ungültiges Basisverzeichnis" & MsgClose, MsgBoxStyle.Exclamation, k_AppName)
    31. Exit Sub
    32. End If
    33. FolderParts = Folder2List.Split({"\"}, StringSplitOptions.RemoveEmptyEntries)
    34. If Not FolderParts.Count = 4 Then
    35. MsgBox("ungültiges Verzeichnisebene" & MsgClose, MsgBoxStyle.Exclamation, k_AppName)
    36. Exit Sub
    37. End If
    38. If FolderParts(3).Length <= FolderParts(2).Length Then
    39. MsgBox("Grundstücksverzeichnis zu kurz!" & vbCrLf & _
    40. "Ebene3:= " & FolderParts(2) & vbCrLf & _
    41. "Ebene4:= " & FolderParts(3) & MsgClose, MsgBoxStyle.Exclamation, k_AppName)
    42. Exit Sub
    43. End If
    44. If Not FolderParts(2).ToLower = FolderParts(3).Substring(0, FolderParts(2).Length).ToLower Then
    45. MsgBox("Grundstücksverzeichnis entspricht nicht dem Straßenverzeichnis!" & vbCrLf & _
    46. "Ebene3:= " & FolderParts(2) & vbCrLf & _
    47. "Ebene4:= " & FolderParts(3) & MsgClose, MsgBoxStyle.Exclamation, k_AppName)
    48. Exit Sub
    49. End If
    50. Dim f As New frm_GrundstDoku
    51. With f
    52. .Grundst_RootFolder = Folder2List
    53. .ShowDialog()
    54. End With
    55. End Sub
    56. End Module


    Ich habe mir das Video eben nochmal angesehen - vielleicht kann mir einer noch einige Worte darüber verlieren. Sieht ja sehr kompakt aus - aber so ganz verstehen tue ich das noch nicht was dort passiert.

    Gruß Jan

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

    Wozu braucht man da ne Konsolenanwendung? Wegen den Parametern? Ich hoffe, dass das nicht das Argument ist, denn die bekommt man in WinForms mit: Dim CommandLineArguments = My.Application.CommandLineArgs (ja, geht bestimmt auch ohne My. Aber ich glaub, dass das hier das geringste Problem ist). Dann wertest Du die Parameter aus (vielleicht nicht so, wie gezeigt, sondern eher mit IO.DriveInfo, IO.DirectoryInfo, IO.FileInfo und Co.) und zeigst am Ende Dein Hauptformular an - oder Du schließt es eben, bevor es angezeigt wird.

    EDIT:
    @SpaceyX: Wer lesen kann, ist klar im ... Deutschunterricht aufmerksam gewesen :S . Stimmt ja, ist ja schon besser vorgegeben als ich hier vorschlage. Aber wir sind beide zumindest gleichauf verwirrt, was das Ganze werden soll.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Weiß er doch. Er holt doch die Argumente mit Environment.GetCommandLineArgs(). Wobei er die Sub Main auch mir Parametern ausstatten könnte, was wohl aufs Gleiche rauskommt. Ich verstehe auch nicht so recht, was überhaupt sein Ziel ist.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    VaporiZed schrieb:

    Wozu braucht man da ne Konsolenanwendung? Wegen den Parametern? Ich hoffe, dass das nicht das Argument ist, ...


    doch genau so ist es - wenn man es nicht besser weiß, dann ist zunächst der Weg das Ziel.

    Aber ich bin offen für neues....

    Bei dem von mir eingeschlagene Weg hat nur, aus meiner Sicht, den Vorteil, dass die Form ggf. nicht erst geöffnet wird, wenn die Voraussetzungen nicht erfüllt sind.

    Gruß Jan

    jan99 schrieb:

    Bei dem von mir eingeschlagene Weg hat nur, aus meiner Sicht, den Vorteil, dass die Form ggf. nicht erst geöffnet wird, wenn die Voraussetzungen nicht erfüllt sind.
    Das heißt, Du startest ein falsch parametrisieretes Programm und es passiert nix?
    Du würdest sofort einen Thread eröffnen, wenn Du auf ein Icon doppelklickst und es passiert nix, weil Du nicht weißt, dass die Parameter falsch sind.
    ====
    Öffne eine Form und bring ne gescheite Meldung, da freut sich der User, dass ihm geholfen wurde. 8o
    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!

    jan99 schrieb:

    gescheite Meldungen
    Icon-Doppelklick - MessageBox und Tschüss?
    So ein Programm würde ich nicht bedienen wollen.
    Es gibt empfohlene Style Guides, da solltest Du mal drin blättern:
    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!
    sicherlich kann man bei kommerziellen Programmen darüber nachdenken.

    Aber hier geht es um ein betriebsinternes Werkzeug bei dem ein Pfad übergeben wird. Im Anschluss wird, bei einem passenden Pfad, ein Dialog geöffnet und dann werden nur betreffende Dateien aufgelistet.

    Wenn man so will Mittel zum Zweck.

    Sicherlich kann ich noch einen speziellen Dialog erstellen, der dann eine Hilfeseite anzeigt.

    Aber für die allgemeine Lösung der Problematik ist der Style nicht der Nabel der Welt.

    Gruß Jan
    Hi!

    das Video habe ich mir angesehen - aber ich würde gerne mehr über die Zeilen wissen.

    Also die Form als Startobjekt setzen?

    Aber dann ist das vorzeitige Beenden, bei fehlenden Parametern, doch nicht so einfach möglich?

    Werde das dann morgen mal versuchen umzusetzen.

    Klasse wäre nirgendwo ein Minibeispiel das zeigt wie Parameter sauber auslesen, prüfen und ggf. vorzeitig beenden um dann eine Form zu öffnen. Vielleicht als Video....?

    Jan
    Sicher ist das Aussteigen aus dem Programm dann möglich. Hier ein Beispiel:

    VB.NET-Quellcode

    1. Module Program
    2. <STAThread>
    3. Sub Main(args As String())
    4. Init()
    5. If args.Length = 0 Then Return
    6. If args(0) <> "start" Then
    7. Return
    8. Else
    9. Application.Run(New Form1())
    10. End If
    11. End Sub
    12. Private Sub Init()
    13. Application.EnableVisualStyles()
    14. Application.SetCompatibleTextRenderingDefault(False)
    15. End Sub
    16. End Module


    Die Funktionen EnableVisualStyles und SetCompatibleTextRenderingDefault(False) sind Funktionen, die auch von C# (hier ist der Einstiegspunkt immer die Sub Main) aufgerufen werden. Sie ermöglichen es der Anwendung im Grunde den Windows-Style anzuwenden. Wenn Du genaueres darüber erfahren willst, schau bei MSDN nach. Ich hab die Aufrufe einfach von C# übernommen.

    Du kannst der Sub Main Parameter => args As String() hinzufügen, musst Du aber nicht. Du kannst genauso über Enviroment.GetCommandLineArgs() auf die Parameter zugreifen. Das macht imho keinen Unterschied. Erfüllen die Parameter nicht Deine Vorgaben steigst Du mit return aus der Sub Main aus und das Programm wird beendet. Wie Du die Prüfung der Startargumente durchführst, ist Dir überlassen. Nur wenn alle Parameter stimmen, gibst Du die Kontrolle an die Startfrom ab. Fertig.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o