Prozedur (Sub oder Function) über einen String aufrufen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Prozedur (Sub oder Function) über einen String aufrufen

    hallo zusammen. erstmal eine entschuldigung weil ich alles klein schreibe.
    nu zu meinem problemchen

    ich habe eine form mit treeview, lable, textbox, comboboxen pictureboxen und checkboxen

    das treeview-element wird mit knoten und childs gefüllt
    like this

    VB.NET-Quellcode

    1. me.treeview1.nodes.add("A", "Fragebogen ''A''")
    2. for i as integer = 0 to 57 step 1
    3. QuestionNr = Question & cstr(i+1)
    4. me.treeview1.nodes(1).nodes.add("A" & i+1,QuestNr)
    5. next

    das geht bis Frageboge E

    clicke ich jetzt auf einen x-beliebigen knoten erhalte ich auf folgendem weg den namen der prozedur die aufgerufen werden soll
    dim befehl as string = me.treeview1.selectednode.name 'z.B A1 ''befehl'' hat jetzt den namen der prozedur die aufgerufen werden soll

    wie schaffe ich es das ich mit dem inhalt der variablen befehl ("A1") die Prozedur Private Sub A1() aufrufen kann?

    da es insgesamt 176 prozeduren wie A1 gibt ist ein weg wie der folgende etwas fehl am platze (geht von A1 bis A57, B1 bis B48, ...)

    VB.NET-Quellcode

    1. if treeview1.node.selectednode.name = "A1" then
    2. call A1
    3. ...
    4. elseif treeview1.node.selectednode.name = "A2" then
    5. ...
    6. ...
    7. elseif ...
    8. elseif ...
    9. elseif ...
    10. end if

    das ganze muss meines Erachtens auch eleganter gehen, nur habe ich keinen blassen schimmer wie. ich hoffe auf eure hilfe.

    CodeTags gesetzt ~VaporiZed

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

    Hi.

    Dafür gibt es die Kontrollstruktur "Switch Case".

    Sie verhält sich wie ein Rangierbahnhof.

    Ein Gleis kommt an, und die Weiche sagt, auf welches Gleis das betreffende verteilt (rangiert) wird.

    VB.NET-Quellcode

    1. Sub Switcher()
    2. Dim text As String = "Weiche_A" 'Als Platzhalter mit Wert -> Weiche_A <-
    3. Select Case text 'Falleintscheidung für den Variableninhalt der Variable -> text <-
    4. Case "Weiche_A"
    5. 'Fall Weiche_A, macht folgendes...
    6. Case "Weiche_B"
    7. 'Fall Weiche_B, macht folgendes...
    8. Case Else
    9. 'Der Fall falls keines der obigen Fälle zutreffend ist
    10. 'Fall "Whaaa??? Nagut, dann halt das hier...", macht dieses hier...
    11. End Select
    12. End Sub


    In deinem Fall wäre das dann etwas wie folgendes:

    VB.NET-Quellcode

    1. ' Dieses hier muss im Event des TreeViews "SelectedNode" (?) geschehen... Im TreeView einfach Doppelklicken im Designer und das ' Event wird dir erstellt. "Sub Switcher" ist in diesem Beispiel falsch. :(
    2. Sub Switcher()
    3. Select Case treeview1.node.selectednode.name
    4. Case "A1"
    5. 'call A1
    6. Case "A2"
    7. 'call A2
    8. .
    9. .
    10. .
    11. Case Else
    12. 'Der Fall falls keines der obigen Fälle zutreffend ist
    13. End Select
    14. End Sub


    Ich hoffe das hilft...

    c.u. Joshi aus HaHa

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Joshi“ ()

    die möglichkeit über select case ist auch nicht wirklich kürzer. es sind 176 case-fälle. aber trotzdem danke an joshi aus haha


    an ISliceUrPanties
    auch an dich ein danke an die antwort. das muß alles über ein modul erfolgen wenn ich das richtig sehe.
    wie ich damit

    VB.NET-Quellcode

    1. Module Hello
    2. Sub Main()
    3. ' Sets up the variable.
    4. Dim helloObj As Object
    5. ' Creates the object.
    6. helloObj = new HelloWorld()
    7. ' Invokes the print method as if it was early bound
    8. ' even though it is really late bound.
    9. helloObj.PrintHello("Visual Basic Late Bound")
    10. End Sub
    11. End Module

    aber eine sub in einem formular aufrufen kann seh ich noch nicht. HelloWorld() ist eine sub oder function die aufgerufen wird ich muß aber 176 subs mit unteschiedlichen namen aufrufen da in diversen steuerelementen, je nach frage, was anderes drinsteht. das ist im lable zum ersten die frage, dann werden da bilder dargestellt und als nächstes die zur frage gehörenden antwortmöglichkeiten. die antwortmöglichkeiten stehen in comboboxen, checkboxen und textboxen müssen ausgefüllt werden. für den den interessiert wozu das ganze? das wird eine application zum lernen für die sachkundeprüfung NRW (Hundehaltung).

    CodeTags gesetzt ~VaporiZed

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

    @ISliceUrPanties Was soll das, einen Anfänger mit Reflection zu belasten.
    @Franz Alberts Falls Du schon angefangen hast mit programmieren:
    Mach mal Option Strict On :!:
    Visual Studio – Empfohlene Einstellungen
    Dann poste Deinen Code als Code und nicht als Pseudocode, dazu gehört die richtige Formatierung [VB.NET] über dem Post-Edit-Feld.
    Dann sehen wir weiter.
    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:

    Was soll das, einen Anfänger mit Reflection zu belasten.

    Ich sag mal so, ich habe Programmieranfänger gesehen, die haben sich zwei Tage in ein Thema eingelesen und konnten dieses anschließend anwenden und ich habe Anfänger gesehen, die auch nach zwei Wochen üben kein anständiges "Hello World"-Programm zustande bekommen haben.
    Da ich aber nicht per Gedanken in die Köpfe eines Themenstarters blicken kann, oder gar wieviel Motivation er mitbringt, sich in ein Thema einzulesen, "belaste" ich hier sicherlich niemanden, wenn ich eine Antwort (in diesem Fall nur ein Stichwort) auf die Frage gebe, wie man eine "Prozedur (Sub oder Function) über einen String aufrufen" kann. Der TE kann selbst entscheiden, ob er sich das antun möchte oder nicht.
    Leute, wir sollten erstmal erfahren, was da genau vom Programmablauf geschieht.
    Da das ganze Konstrukt sehr fragwürdig erscheint (im Sinne von Fehlkonstruktion): Was passiert denn in den 176 Subs? Wahrscheinlich fast immer das gleiche, oder? Kannst Du uns echte (!) Beispiele aus Deinem Code für A1, A2, A3 geben? Dann ließe sich vielleicht auch eine Grundsatzalternative finden.

    Das Ganze kommt mir erstmal vor wie: »Was brauch ich für Ausrüstung, um einen 5000 m hohen Berg zu erklimmen?« »Warum willst Du das wissen?« »Da oben fängt dann Wasser an zu kochen.« X/
    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.
    moin. erstmal an alle danke für die antworten.
    bezüglich motivation: die ist sehr hoch da ich einen hund habe der unter die 20/40-regl fällt und ich den sachkundenachweis in nrw zwingend benötige.
    bezüglich stichworte: die sind zwar schön und gut, wenn man aber wenig bis gar kein englisch kann ist das ein sehr große hürde.
    @ vaporized: eine grundsatzalternative wäre eine verknüpfung mit einer datenbank. drei beispielcodes sind nicht nötig da immer die selben steuerelemente angesprochen werden, nur halt immer mit einem anderen inhalt. ich denke da reicht der inhalt einer sub
    bezüglich was geschieht in den subs: ist aus der sub kopiert und hier eingefügt. vom prinzip passiert in den anderen subs das selbe. sind halt immer andere fragen die mal einträge in komboboxen haben oder wo die richtige(n) antwort(en) angeklickt werden müssen oder textfelder in die typische hundekrankheiten eingetragen werden müssen.

    VB.NET-Quellcode

    1. Frage1(True) 'Steuerelemente ausblenden die nicht benötigt werden und die inhalte werden gelöscht
    2. Me.tb1Frage.Text = "Vertreter unterschiedlicher Hunderassen haben auch unterschiedliche Talente, die sie für bestimmte Einsätze besonders brauchbar machen. " & vbCrLf & vbCrLf & "Ordnen Sie den aufgelisteten Rassen die unter 1 – 5 beschriebenen Einsatzmöglichkeiten zu, für die diese Rassen besonders talentiert sind:"
    3. Me.Label1.Text = "Labrador Retriever"
    4. Me.Label2.Text = "Collie"
    5. Me.Label3.Text = "Teckel"
    6. Me.Label4.Text = "Riesenschnauzer"
    7. Me.Label5.Text = "Barsoi"
    8. Me.ComboBox6.Items.AddRange({"Eintrag auswählen", "Baujagd", "Blindenhund", "Rennsport", "Hüten", "Diensthund"})
    9. Me.ComboBox7.Items.AddRange({"Eintrag auswählen", "Baujagd", "Blindenhund", "Rennsport", "Hüten", "Diensthund"})
    10. Me.ComboBox8.Items.AddRange({"Eintrag auswählen", "Baujagd", "Blindenhund", "Rennsport", "Hüten", "Diensthund"})
    11. Me.ComboBox9.Items.AddRange({"Eintrag auswählen", "Baujagd", "Blindenhund", "Rennsport", "Hüten", "Diensthund"})
    12. Me.ComboBox10.Items.AddRange({"Eintrag auswählen", "Baujagd", "Blindenhund", "Rennsport", "Hüten", "Diensthund"})
    13. Me.ComboBox6.SelectedIndex = 0
    14. Me.ComboBox7.SelectedIndex = 0
    15. Me.ComboBox8.SelectedIndex = 0
    16. Me.ComboBox9.SelectedIndex = 0
    17. Me.ComboBox10.SelectedIndex = 0
    18. strFrage = 1 'auswertung der frage erfolgt nach klick auf btnFertig


    VB.NET-Quellcode

    1. Private Sub Frage1(ByVal Sichtbar As Boolean)
    2. Me.Label1.Visible = Sichtbar
    3. Me.Label2.Visible = Sichtbar
    4. Me.Label3.Visible = Sichtbar
    5. Me.Label4.Visible = Sichtbar
    6. Me.Label5.Visible = Sichtbar
    7. Me.ComboBox6.Visible = Sichtbar
    8. Me.ComboBox7.Visible = Sichtbar
    9. Me.ComboBox8.Visible = Sichtbar
    10. Me.ComboBox9.Visible = Sichtbar
    11. Me.ComboBox10.Visible = Sichtbar
    12. Me.ComboBox6.Items.Clear()
    13. Me.ComboBox7.Items.Clear()
    14. Me.ComboBox8.Items.Clear()
    15. Me.ComboBox9.Items.Clear()
    16. Me.ComboBox10.Items.Clear()
    17. Me.ComboBox6.Text = ""
    18. Me.ComboBox7.Text = ""
    19. Me.ComboBox8.Text = ""
    20. Me.ComboBox9.Text = ""
    21. Me.ComboBox10.Text = ""
    22. End Sub

    ich hoffe, ich habe alles richtig gemacht (PSEUDOTEXT).
    und bitte lasst den sarkassmus im regal liegen, sowas gehört meines erachtens nicht hier rein. eildieweil: jeder hat mal klein angefangen.
    ich verlange ja auch nicht das jemand aus dem stehgreif 80m schaltschrank korrekt verdrahten soll
    oder einbauschränke für eine apotheke fertigen soll

    ich bedanke mich für eure antworten
    Jetzt wird's schwierig, weil ich nicht weiß, wo Sub A1 beginnt und wo aufhört oder ob A1 überhaupt inhaltlich gepostet wurde.
    Auch ist es schwierig, eine Verallgemeinerung zu machen, da Du zwar sagst, dass immer dieselben Controls angesprochen werden, aber solange nicht klar ist, worin sich die Subs gleichen und worin unterscheiden, kann man da nicht weiterhelfen.
    Ich hätt jetzt gesagt: Speichere erstmal die Fragen und Antworten in einer Textdatei. Dann kannst Du diese auslesen, je in Arrays speichern und dann dynamisch zur Laufzeit eintragen. Dann brauchst Du nämlich keine 176 Subs, sondern nur eine, die einfach andere Daten in die Controls füllt.

    Franz Alberts schrieb:

    bitte lasst den sarkassmus
    Welchen? Bitte zitieren. Vielleicht gibt es für die Stelle auch eine andere Interpretation als eine sarkastische.
    Welche englischen Begriffe sind denn ein Problem? Niemand verlangt von Dir, dass Du englische Texte liest. Mikrosoft hat zu fast allem auch leidlich deutsche Doku.
    Das mit dem

    Franz Alberts schrieb:

    weil ich alles klein schreibe
    versteh ich aber nicht. Gibt es einen guten Grund dafür?
    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.
    @ISliceUrPanties Reflection ist hier völlig fehl am Platze.
    @Franz Alberts Beschreibe zunächst verbal Dein Problem, das, was Du mit Deinem Programm erreichen willst. Verwende dabei keinen Code!
    Dann lass uns eine ordentliche Aufgabenstellung formulieren, frühestens dann hat es Zweck, Code zu schreiben.
    Leider wird das wie meistens nicht der Fall sein, weil es zu viele Leute gibt, die der Meinung sind, ihr Code sei richtig, weil er compiliert.
    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!
    @VaporiZed
    Die ersten Codezeilen sind der komplette inhalt des sub A1. private sub A1 / End Sub hab ich bewußt weggelassen. es sei den du willst ALLE subs
    einsehen. ob du nach dem lesen der 176 subs aber mehr weiß wage ich sehr zu bezweifeln. die subs gleichen sich bezüglich der controls und
    unterscheiden sich im textlichen inhalt der controls. das mit der textdatei geht zwar auch, bevor ich aber sowas mache benutze ich doch lieber eine accdb. ich könnte aber auch eine '.ini-Datei benutzen in der die fragennummern ( A1 bis A57 etc. pp.) abgespeichert sind.
    dazu kann ich aber nur sagen: viele wege führen nach rom. und ich bin hier um den besten weg zu finden.

    @RodFromGermany
    Im internet kursieren diverse lernprogramme für die Sachkundprüfung von 20/40 Hunden. Problem bei der geschichte ist, ich habe netzausfälle und
    hasse papierverschwendung. darum will ich ein lernprogramm entwickeln mit dem ich offline lernen kann. ich muß aber den kompletten fragenkatalog
    erfassen da unterschiedliche tierärzte unterschiedliche fragebögen benutzen.
    Problem gelöst

    VB.NET-Quellcode

    1. Private Sub TreeView1_AfterSelect(sender As System.Object, e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect
    2. Me.tb1Frage.Text = "" 'leeren einer vorherigen frage
    3. Dim Befehl As String = Me.TreeView1.SelectedNode.Name 'Aufzurufende Prozedur ermitteln in Textform
    4. If Befehl.Length = 1 or Befehl = "DE" Then Exit Sub'ungültige werte abfangen
    5. CallByName(Me, Befehl, CallType.Method) 'Prozedur aufrufen und abarbeiten
    6. End Sub

    CallByName(Me, Befehl, CallType.Method)
    Me: verweis auf das formular, da die aufzurufende Prozedur sich in diesem befindet
    Befehl: Name der aufzurufenden Prozedur in Stringform (hier z.B. "A1"). Kann auch "Aktenzeiche XY ungelöst" drinstehen
    Achtung kleine Falle: Es darf keine Private Sub sein sondern es muß eine Public Sub sein
    CallType.Method: Es soll eine Prozedur (Sub oder Function) aufgerufen werden


    ich hoffe meine erklärung ist ausreichend richtig.

    danke für eure hilfe
    Thema kann geschlossen werden. ich weiß nicht wie das geht. danke

    CodeTags gesetzt ~VaporiZed

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

    Falls sich jemand fragt, was das für eine ominöse CallByName-Funktion ist: Die wurde aus dem VB6-Namespace exhumiert …
    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.