[CONSOLE] Wenn etwas bestimmtes eingegeben wurde dann etwas bestimmtes machen
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 46 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.
-
-
-
-
So funktioniert es jetzt:
VB.NET-Quellcode
- Imports System.Threading
- Imports System.Windows.Forms
- Module kit_shell
- Sub Main()
- 'declaration for folder browser
- Dim folderBrowser As New FolderBrowserDialog
- 'ends declaration
- Console.ForegroundColor = ConsoleColor.White
- 'kit-shell constructor
- Console.Title = "Kit Shell - #kit app /init"
- Console.Title = "Kit Shell - MSWINDIR32~"
- 'constructor ends
- 'base console text
- Console.WriteLine("Welcome to Kit Shell (version 1.0)" & vbCrLf & vbCrLf & "Run '#kit help' to display the help index." & vbCrLf & "Run '#kit doc' to visit the documentation on GitHub." & vbCrLf)
- 'ends the base console text
- 'start console input
- Console.ForegroundColor = ConsoleColor.Green
- Dim input As String = Console.ReadLine()
- If input = "text" Then
- MsgBox("l")
- End If
- End Sub
- End Module
-
@iEi:: Das ist der WorkFlow einer Console.
Wenn Du nicht willst, dass Dein Programm beendet wird, musst Du eine Schleife mit einer sinnvollen Abbruchbedingung proggen.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! -
-
@Gonger96
Das will ich halt verhindern wenn ich jz so mache:
Und ich nach text text1 eingebe beendet sich des Programm und das will ich halt verhindern -
iEi schrieb:
und das will ich halt verhindern
RodFromGermany schrieb:
Wenn Du nicht willst, dass Dein Programm beendet wird, musst Du eine Schleife mit einer sinnvollen Abbruchbedingung proggen.
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! -
-
thefiloe schrieb:
b) was soll das eigentlich alles werden? das ist alles komplett statisch. wenn du mehr als 5 befehle hast dann ist das nen scheiß konzept und ich würde mir erstmal nen objekt modell überlegen. auch wenn du dich dagegen komplett sträubst(kennen wir ja alle schon zur genüge).
Wie immer komplett ignoriert und brainfuck hingeclustert. Sehr gut. Wieso nimmst du nie einen Rat an fängst an MIT OOP! Langsam habe ich das Gefühl, dass man mit dir die Evolutionstheorie wiederlegen könnte. Du steigst einfach auf absolut rein gaaar nichts neues oder auch nur im Ansatz Fortgeschrittenes ein. Nein lieber clusterst du 100 Abfragen mit gleichem Inhalt hin. Alles zu 100% statisch und vom Code her einfach nur unfassbar hässlich. -
-
Hi
Oder eben mit Dictionary(Of String, Command), Command ist eine abstrakte Klasse oder ein Delegat.
VB.NET-Quellcode
- Public MustInherit Class Command
- Private _name As String
- Public MustOverride Sub Print(output As IOutputProvider)
- Public ReadOnly Property Name As String
- Get
- Return _name
- End Get
- End Property
- Public Sub New(name As String)
- If name Is Nothing Then Throw New ArgumentNullException("name")
- If name.Any(AddressOf Char.IsWhitespace) Then
- Throw New ArgumentException("Whitespaces in command names are not allowed.")
- End If
- _name = name
- End Class
Name ist dann der Begriff, der zum Zuordnen des Commands verwendet wird. Diesen haust du entsprechend in ein Dictionary. IOutputProvider ist bspw. eine Console, an die du ein Objekt schreiben kannst. Diese modellierst du bspw. als Interface und stellst darin die Funktionalität bereit:
VB.NET-Quellcode
- Public Interface IOutputProvider
- Sub Print(value As Object)
- Sub Close()
- End Interface
- Public Class ConsoleOutputProvider
- Implements IOutputProvider
- Private _closed As Boolean
- Public Overridable Sub Print(value As Object) Implements IOutputProvider.Print
- If Closed Then Throw New InvalidOperationException("Output has been closed.")
- Console.WriteLine(value)
- End Sub
- Public Overridable Sub Close() Implements IOutputProvider.Close
- _closed = True
- End Sub
- Public ReadOnly Property Closed As Boolean
- Get
- Return _closed
- End Get
- End Property
- End Class
so, schön overengineered, aber mit voneinander losgelösten Schichten und dynamischer Ergänzbarkeit. Statt dem Dictionary kann man auch eine KeyedCollection verwenden, die wäre sogar noch besser, als das Dictionary selbst, weil die Schlüssel automatisch verwendet werden. Dabei muss man allerdings Vererbung benutzen. Ich habe es jetzt bewusst nicht ausgeweitet, damit du selbst lernst, wie du lernst.
Gruß
~blaze~ -
@~blaze~:
Das ist auch ein sehr interessanter Ansatz .
@thefiloe:
Ich bin zwar grundsätzlich deiner Meinung, das man Leute auf ihre Lernresistenz hinweißt allerdings könntest du deinen Ton mäßigen. Und ja ich weiß auch wie nervig es sein kann es jemandem x mal zu erklären und er es ignoriert oder einfach nicht daraus lernt. Generell wenn sowas passiert könnten alle User hier mal etwas ruhiger bleiben, denn wir befinden uns hier nicht auf irgendso einem 3 klassigen Internetportal auf dem die ganze Zeit nur Flüche und Beleidigungen ausgetauscht werden.
faxe1008
-
-
-
@~blaze~
So nun hier soweit bin ich jetzt
VB.NET-Quellcode
- Imports System.Threading
- Imports System.Windows.Forms
- Imports Ionic.Zip
- Module kit_shell
- Sub Main()
- 'declaration for folder browser
- Dim folderBrowser As New FolderBrowserDialog
- 'ends declaration
- Console.ForegroundColor = ConsoleColor.White
- 'kit-shell constructor
- Console.Title = "Kit Shell - #kit app /init"
- Console.Title = "Kit Shell - MSWINDIR32~"
- 'constructor ends
- 'base console text
- Console.WriteLine("Welcome to Kit Shell (version 1.0)" & vbCrLf & vbCrLf & "Run '#kit help' to display the help index." & vbCrLf & "Run '#kit doc' to visit the documentation on GitHub." & vbCrLf)
- 'ends the base console text
- 'start console input
- Console.ForegroundColor = ConsoleColor.Green
- Do
- Dim input() As String = Console.ReadLine().Split(">"c)
- Select Case input(0)
- Case "#kit help"
- Process.Start(Application.StartupPath & "\kit_help_index.txt")
- Case "#kit path /s"
- If folderBrowser.ShowDialog = DialogResult.OK Then
- Console.Title = folderBrowser.SelectedPath
- Console.ForegroundColor = ConsoleColor.Magenta
- Console.WriteLine("Selected path:" & folderBrowser.SelectedPath)
- Console.ForegroundColor = ConsoleColor.Green
- End If
- Case "#kit init"
- Try
- Console.ForegroundColor = ConsoleColor.Yellow
- Console.WriteLine("Starting Zipping...0%")
- Dim zipFile As New ZipFile()
- Console.WriteLine("Zipping...10%")
- zipFile.AddDirectory(Console.Title)
- Console.WriteLine("Add Directory...50%")
- zipFile.Save(Console.Title & "\binaries.zip")
- Console.WriteLine("Finished!...100%")
- Console.WriteLine("Zipping was succesfully Output are here: " & Console.Title & "\binaries.zip")
- Console.ForegroundColor = ConsoleColor.White
- Catch
- Console.ForegroundColor = ConsoleColor.Red
- Console.WriteLine("Invalid Path ! MSWINDIR32~ or a # command is not a valid path, please input '#kit path /s' and select a valid path.")
- Console.ForegroundColor = ConsoleColor.Green
- End Try
- Case Else
- Console.ForegroundColor = ConsoleColor.Red
- Console.WriteLine("Unknown command.Please input '#kit help' to see a list with commands.")
- Console.ForegroundColor = ConsoleColor.Green
- End Select
- Loop
- End Sub
- End Module
@thefiloe
Es sind mehr als 5 Befehle, ich weiss du kannst mich nicht besonders gut leiden,aber musst du dann so zu mir sein ? Ich bin 14,ich weiss leider auch nocht nicht alles.Die Abfragen waren erst alle gleich um es zu testen ob es überhaupt so geht.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „iEi“ ()
-
Wozu genau ist das Try-Catch? Und warum schluckst du alle Fehler? Fehler sind hilfreich, nicht feindlich. Ich finde ja diesen Statusreport auch etwas ulkig, sorry. Die Prozente geben dem Benutzer ungefähr gar keine Info über den tatsächlichen Fortschritt. Außerdem haben wir die bereits in mehreren Beiträgen verdeutlicht, dass zur Pfadverknüpfung System.IO.Path.Combine zu verwenden ist, nicht der &-Operator. Console.Title ist auch irgendwie etwas seltsam, als Bezeichner, der Ordner ist wohl auch etwas seltsam gewählt.
Statt jede Kombination manuell abzufragen, wäre es geschickter, die Parameter direkt auszulesen und zu übergeben. Ggf. findet da jemand anderes Lust, das zu erklären und in meine obige Architektur (die ich eigentlich sehen wollte) zu integrieren, ich habe gerade keine Zeit. Behalte das übrigens immer alles im Kopf und lerne für zukünftige Programme. Wie schon mehrfach betont ist das Alter keine Ausrede. Ich habe mit 14 auch nichts gewusst - noch nicht mal programmiert - aber als ich darauf gestoßen bin, habe ich sehr schnell gelernt und das solltest du auch können.
Btw. bin auch erst 22 und heul auch nicht wegen meinem Alter rum. ;P
Gruß
~blaze~Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()
-
Dass du 14 bist ist keine Ausrede. Und anders hörst du auf niemanden. Man hat dir bereits zig mal immer und immer wieder das Selbe gesagt. Keiner beschwert sich wenn jemand noch nicht alles kann oder von mir aus auch gar nichts kann. Jeder fängt mal an. Doch wenn man jedes mal immer und immer wieder das Selbe sagt und jemand der offen gesagt nicht annähernd Grundlagenwissen besitzt sicher dauernd darüber hinweg setzt, glaubt es besser zu wissen und anschließend wieder mit den selben Problemen ankommt, dann ist das sehr wohl Grund sich etwas darüber zu ärgern.
Und sorry. Aber dieses Konzept fliegt dir innerhalb von kürzester Zeit um die Ohren. Sobald du zwei Optionen anbietest, kannst du den Code immer doppelt und dreifach kopieren. Außerdem ist es in keinster Weise erweiterbar und soviel ich sehe ignorierst du nicht mal Groß- und Kleinschreibung(was in so einem Fall vll. nicht wirklich schlecht wäre). -
iEi schrieb:
Es sind mehr als 5 Befehle
Und wenn es sein muss, sogar in eine separate Klasse.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! -
Meins sähe übrigens in einfacher Form so aus:
Spoiler anzeigen VB.NET-Quellcode
- Imports System.Collections.ObjectModel
- Friend Class Program
- Public Shared Sub Main(args() As String)
- Dim parts As IEnumerable(Of String) = args 'Input (Kommandozeilenparameter) auswerten
- 'Liste der Kommandos
- Dim commands As New CommandList()
- 'Ausgabe für Konsolen
- Dim consoleOutput As New ConsoleIOProvider()
- 'Kommandos, die unterstützt werden und deren Funktionalität in Form eines Delegaten
- commands.Add(Command.FromDelegate("help", Sub(argv, outp)
- outp.Print("Supported commands:")
- For Each cmd As Command In commands
- outp.Print(cmd.Name)
- Next
- End Sub))
- commands.Add(Command.FromDelegate("echo", Sub(argv, outp)
- 'Argumente ausgeben
- outp.Print(String.Join(" ", argv))
- End Sub))
- commands.Add(Command.FromDelegate("echolines", Sub(argv, outp)
- Dim cv As Integer
- Dim c As String = Nothing
- Dim cp As IDictionary(Of String, String) = GetArguments(argv)
- If cp Is Nothing Then
- consoleOutput.PrintError("Bad command line format.", False)
- ElseIf cp.Count = 0 OrElse Not cp.TryGetValue("-c", c) Then
- outp.PrintError("Missing needed parameter 'c'. Command was not executed.", True)
- ElseIf Not Integer.TryParse(c, cv) Then
- outp.PrintError("Invalid input format for parameter 'c'. Command was not executed.", True)
- End If
- 'Argumente einlesen und mit ", " aneinander reihen
- Dim outpargs As New List(Of String)()
- For i As Integer = 1 To cv
- outpargs.Add(outp.ReadBlock())
- Next
- outp.Print(String.Join(", ", outpargs))
- End Sub))
- commands.Add(Command.FromDelegate("exit", Sub(argv, outp)
- 'Keine weiteren Eingaben mehr zulassen
- outp.Close()
- End Sub))
- 'Verarbeitungsvorgang
- Do
- 'Kommando aus Eingabe ermitteln oder Nothing, wenn keines vorhanden ist
- Dim cmdstr As String = parts.FirstOrDefault()
- If cmdstr IsNot Nothing Then 'wenn eines vorhanden ist
- Dim cp As Command
- 'Kommando ermitteln
- Try
- cp = commands(cmdstr)
- Catch ex As KeyNotFoundException
- cp = Nothing
- End Try
- If cp Is Nothing Then 'wenn kein Kommando existiert wird der Benutzer informiert
- consoleOutput.PrintError("Command '" + cmdstr + "' not found.", False)
- Else
- 'sonst wird es ausgeführt (hier könnte man als ersten Parameter auch den Namen lassen, der wird hier weggelassen)
- cp.Process(parts.Skip(1), consoleOutput)
- End If
- End If
- If consoleOutput.Closed Then 'Wenn IO geschlossen wurde (==> exit-Kommando) abschließen
- Exit Do
- End If
- 'neue Benutzereingabe parsen
- Do
- Console.Write("> ")
- parts = ProcessInput(Console.ReadLine())
- If parts Is Nothing Then
- consoleOutput.PrintError("Bad command line format.", False)
- End If
- Loop While parts Is Nothing
- Loop
- End Sub
- Private Shared Function ProcessInput(input As String) As IEnumerable(Of String)
- Dim args As New List(Of String)()
- Dim i As Integer = 0
- Dim marker As Integer = 0
- While i < input.Length
- Dim c As Char = input(i)
- '"<daten>" auslesen
- If c = """"c Then
- i += 1
- marker = i
- i = input.IndexOf(""""c, i)
- If i = -1 Then Return Nothing
- If marker <> i Then args.Add(input.Substring(marker, i - marker))
- i += 1
- marker = i
- Else 'sonstige am Leerzeichen trennen
- If Char.IsWhiteSpace(c) Then
- If marker <> i Then args.Add(input.Substring(marker, i - marker))
- marker = i + 1
- End If
- i += 1
- End If
- End While
- If marker <> i Then
- args.Add(input.Substring(marker, i - marker))
- End If
- Return args
- End Function
- Private Shared Function GetArguments(input As IEnumerable(Of String)) As IDictionary(Of String, String)
- 'paarweise auslesen und in ein Dictionary stopfen, man könnte auch schönere Angaben machen
- '(z.B. Argumente mit - beginnen lassen und den Rest als Argumentwerte ansehen)
- '-c 5 als Eingabe z.B. würde zu einem Dictionary-Eintrag {"-c", "5"} führen
- Using enr As IEnumerator(Of String) = input.GetEnumerator()
- Dim ccommand As String
- Dim dtc As New Dictionary(Of String, String)()
- While enr.MoveNext()
- ccommand = enr.Current
- If enr.MoveNext() Then
- dtc.Add(ccommand, enr.Current)
- Else
- Return Nothing
- End If
- End While
- Return dtc
- End Using
- End Function
- End Class
- Public Class CommandList
- Inherits KeyedCollection(Of String, Command)
- Protected Overrides Function GetKeyForItem(item As Command) As String
- Return item.Name
- End Function
- Public Sub New()
- Me.New(False)
- End Sub
- Public Sub New(ignoreCase As Boolean)
- MyBase.New(If(ignoreCase, StringComparer.OrdinalIgnoreCase, StringComparer.Ordinal))
- End Sub
- End Class
- Public Interface IIOProvider
- Sub Print(value As Object)
- Sub PrintError(details As Object, asWarning As Boolean)
- Function ReadBlock() As String
- Sub Close()
- End Interface
- Public MustInherit Class Command
- Private _name As String
- Public Sub New(name As String)
- If name Is Nothing Then Throw New ArgumentNullException("name")
- If name.Any(AddressOf Char.IsWhiteSpace) Then Throw New ArgumentException("Name mustnot contain any whitespace characters.")
- _name = name
- End Sub
- Public ReadOnly Property Name As String
- Get
- Return _name
- End Get
- End Property
- 'Führt das Kommando aus, args enthält die angegebenen Parameter
- Public MustOverride Sub Process(args As IEnumerable(Of String), output As IIOProvider)
- Public Shared Function FromDelegate(name As String, handler As Action(Of IEnumerable(Of String), IIOProvider)) As Command
- If handler Is Nothing Then Throw New ArgumentNullException("handler")
- Return New DelegateCommand(name, handler)
- End Function
- Public Shared Function FromDelegate(name As String, handler As Func(Of IEnumerable(Of String), IIOProvider, Object)) As Command
- If handler Is Nothing Then Throw New ArgumentNullException("handler")
- Return New DelegateCommand(name, Sub(args, outputProvider)
- Dim val As Object
- Dim failed As Boolean = False
- Try
- val = handler(args, outputProvider)
- Catch ex As Exception
- val = ex
- failed = True
- End Try
- If failed Then
- outputProvider.PrintError(val, TypeOf val Is System.ComponentModel.WarningException)
- Else
- outputProvider.Print(val)
- End If
- End Sub)
- End Function
- Private Class DelegateCommand
- Inherits Command
- Private _handler As Action(Of IEnumerable(Of String), IIOProvider)
- Public Sub New(name As String, handler As Action(Of IEnumerable(Of String), IIOProvider))
- MyBase.New(name)
- If handler Is Nothing Then Throw New ArgumentNullException("handler")
- _handler = handler
- End Sub
- Public Overrides Sub Process(args As IEnumerable(Of String), output As IIOProvider)
- _handler(args, output)
- End Sub
- End Class
- End Class
- Public Class ConsoleIOProvider
- Implements IIOProvider
- Private _closed As Boolean
- Public ReadOnly Property Closed As Boolean
- Get
- Return _closed
- End Get
- End Property
- Public Sub Close() Implements IIOProvider.Close
- _closed = True
- End Sub
- Public Sub Print(value As Object) Implements IIOProvider.Print
- 'Ursprüngliche Farbe speichern, neue setzen, anschließend wieder zurücksetzen
- Dim c As ConsoleColor = Console.ForegroundColor
- Console.ForegroundColor = ConsoleColor.White
- PrintCore(value)
- Console.ForegroundColor = c
- End Sub
- Public Sub PrintError(details As Object, asWarning As Boolean) Implements IIOProvider.PrintError
- Dim c As ConsoleColor = Console.ForegroundColor
- Console.ForegroundColor = If(asWarning, ConsoleColor.Yellow, ConsoleColor.Red)
- PrintCore(details)
- Console.ForegroundColor = c
- End Sub
- Private Sub PrintCore(value As Object)
- Console.WriteLine(value)
- End Sub
- Public Function ReadBlock() As String Implements IIOProvider.ReadBlock
- Return Console.ReadLine()
- End Function
- End Class
Gruß
~blaze~
-
Ähnliche Themen
-
funy888 - - Sonstige Problemstellungen
-
RazerElite - - Sonstige Problemstellungen