Funktionsaufruf soll Inhalt (String) übergeben, nicht Variable selbst

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von HamburgerJungeJr.

    Funktionsaufruf soll Inhalt (String) übergeben, nicht Variable selbst

    Hallo Leute,

    ich weiß leider nicht wonach ich suchen soll - daher beschreibe ich mein Problem kurz:

    Ich nutze die My.Settings um einige Dateipfade abzuspeichern - so z.B: my.settings.word
    Dort drin ist dann z.B. "D:\Office\Word.exe" abgespeichert.

    Nun habe ich eine Funktion geschrieben, um die Redundanz in meinem Code zu minimieren - hier der relevante Ausschnitt:

    Quellcode

    1. Public Function Programm_starten(ByVal PfadProgrammName As String, ByVal name As String, ByVal calcName As String)
    2. PfadProgrammName = My.Settings.PfadProgrammName
    3. Return 0
    4. Exit Function


    Nun wird mir mitgeteilt, dass My.Settings.PfadProgrammName nicht existiert - ist ja auch richtig.
    An die Funktion übergebe ich den String "word" als PfadProgrammName.

    Ich möchte, dass "er" daraus den Aufruf "my.settings.word" erstellt.
    Und ich somit schlussendlich in der Variablen "PfadProgrammName" den Wert "D:\Office\Word.exe" habe.

    Wie realisiere ich das? Vielen Dank im Vorraus!
    My.Settings musst Du schon selber anlegen. Außerdem, Option Strict ON.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Sorry, ich verstehe grade überhaupt nicht was Du meinst. Erkläre das mal bitte genauer.
    Wenn Du nen Wert aus den My.Settings an ne Variable binden willst, dann funktioniert das doch?!
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Sorry, ich weiß in der Tat nicht, wie ich es erklären soll.

    Zwei Beispiel:
    programm_starten("word") <- mein Aufruf ("word" wird also als Variable "PfadProgrammName" an die Funktion übergeben)
    Die Funktion soll aus nun den Inhalt von "my.settings.word" in die Variable PfadPrgrammName schreiben - stattdessen sagt er mir, dass es my.settings.pfadProgrammName nicht gibt.

    oder

    programm_starten("excel") <- mein Aufruf ("excel" wird also als Variable "PfadProgrammName" an die Funktion übergeben)
    Die Funktion soll nun anstelle von "my.settings.pfadProgrammName" "my.settings.excel" daraus erstellen.

    Die my.settings.word und my.settings.excel existieren natürlich bereits. My.settings.PfadProgrammNamse existiert nicht - und soll auch nicht existieren.
    Ich habe Dir ein Beispielprojekt hochgeladen, mit einer Setting, einem Label und einem Button.
    Drückst du den Button wird der Label Text aus der Setting geladen, genau wie in Deiner Beschreibung.

    MySettingsTest.zip

    Nachtrag, ich werde so gar nicht schlau aus Deinen Erklärungsversuchen. Kannst Du nicht ohne große Programmdetails erklären, was Du überhaupt erreichen willst?
    Nachtrag 2, ich glaube zu verstehen. In den Settings gibt es die Properties Excel und Word. Du willst die Property aber über eine Variable "PfadProgrammName" aufrufen, wobei die Variable zum Beispiel den Wert "Word" beherbergt um als Ergebnis erwartest Du den Inhalt von My.Settings.Word

    Na ich habe keine Ahnung ob das geht, warum nimmst du keine If-Anweisung oder ein Case Select?

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

    Spoiler anzeigen
    @Dksksm: Ich kann leider Deine komplette Mappe nicht öffnen (da steht "nicht kompatibel") ,wohl aber die "Form1.vb" - und dort speicherst Du nur den Inhalt von einem Label in die "My.Settings.PfadProgrammName". Diese My.Settings existiert auch.

    Bei mir geht es um ein anderes Problem.

    Vermutlich möchte ich etwas, das so gar nicht funktioniert - daher versteht mich hier niemand. Ich habe keine Ahnung wie ich es noch erklären soll.
    Ich versuche eine my.settings-Aufruf durch eine Variable - das ist alles.

    z.B.

    Dim V1 as String = Hallo
    V2 = my.settings.v1

    Nun möchte ich nichts weiter, als dass er V1 auflöst in "Hallo". Das Programm also quasi "my.settings.Hallo" ausführt.


    @ über mir: Exakt so ist es. Ich habe in meinem Programm um die 40 mal den gleichen Aufruf - diesen möchte ich durch eine Funktion ersetzen, in welcher ich die Variablen nur im Aufruf austausche - somit habe ich keinen redundanten Code.

    Siehe Dateianhang - das ist exakt mein Problem. Wie kann ich das lösen - am besten wirklich mit diesem Weg, da ich mein mittlerweile ziemlich umfangreiches Programm nicht einfach komplett umändern möchte.

    Edit: @Über mir: Mit einer Case select Anweisung in der Funktion funktioniert es. Also z.B.

    Quellcode

    1. Private Function Start(ByVal Programm As String)
    2. Select Case Programm
    3. Case "word"
    4. Process.Start(My.Settings.Word)
    5. Case "excel"
    6. Process.Start(My.Settings.Excel)
    7. Case 3
    8. End Select
    9. Return 0
    10. End Function


    Damit könnte ich zur Not leben, falls niemand einen besseren Vorschlag hat.
    Dateien
    • TEST.zip

      (80,53 kB, 119 mal heruntergeladen, zuletzt: )

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

    Um jetzt keine Zip-Archive hin und her zu schicken...

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Function Start(ByVal Programm As String)
    3. 'Process.Start(My.Settings.Programm) ' -> funktioniert nicht!
    4. 'Process.Start(My.Settings.Excel) - funktioniert
    5. 'Process.Start(My.Settings.Word) -> funktioniert
    6. Return 0
    7. End Function
    8. 'Private Sub btn_Word_Click(sender As System.Object, e As System.EventArgs)
    9. ' Me.Start("word")
    10. 'End Sub
    11. 'Private Sub btn_Excel_Click(sender As System.Object, e As System.EventArgs)
    12. ' Me.Start("excel")
    13. 'End Sub
    14. Private Sub Button_ProgrammAusfuehren_Click(sender As System.Object, e As System.EventArgs) Handles btn_Excel.Click, btn_Word.Click
    15. Dim btn As Button = DirectCast(sender, Button)
    16. Select Case btn.Name
    17. Case "btn_Excel"
    18. 'Button 1 geklickt
    19. Label1.Text = "Button Excel"
    20. 'Process.Start(My.Settings.Excel)
    21. Case "btn_Word"
    22. 'Button 2 ..
    23. Label1.Text = "Button Word"
    24. 'Process.Start(My.Settings.Word)
    25. Case Else
    26. 'Irgendein anderer
    27. Label1.Text = "unbekannt"
    28. End Select
    29. End Sub
    30. End Class



    Na gut, ich habe es trotzdem drann gehangen.

    TEST.zip
    Also erstmal vielen vielen Dank für Deine Zeit und Deine Arbeit.

    Es ist nur leider so: Mit 2 oder 5 cases mag das noch übersichtlich sein und auch durchaus praktikabel. Ich habe jetzt schon 30 oder gar 40 cases und das werden nicht weniger. Dazu kommen auch noch 3 Funktionen, in dieser einen Funktion aufgerufen werden - das müsste für jede Funktion so durchgeführt werden - da sieht doch kein Mensch mehr durch. Vor allem alles nur, weil man keinen my.settings Aufruf mittels einer Variablen durchführen kann. Das ist doch unbefriedigend :(

    Nochmal - vielen Dank für Deine Hilfe und wenigstens habe ich nun ein Lösung, die funktioniert. Aber gibt es wirklich keine andere Lösung?
    Jetzt verstehe ich, was Du willst. Nein, es gibt keine andere Lösung, da man Werte nicht als Namen einsetzen kann, das geht nirgends, noch nichtmal bei Variablen o. ä.
    Die Select-Case-Abfrage ist wohl das Einzige hierbei so, aber was ich an der Lösung von Dksksm zu bemängeln habe, ist, dass man mit der Instanz, nicht dem Namen arbeiten sollte. Funktioniert zwar, aber Instanzen sind halt besser weiterverarbeitbar etc.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Hutzi Mach es richtig:

    VB.NET-Quellcode

    1. Private Sub Button_ProgrammAusfuehren_Click(sender As System.Object, e As System.EventArgs) Handles btn_Excel.Click, btn_Word.Click
    2. If sender Is btn_Excel
    3. 'Button 1 geklickt
    4. Label1.Text = "Button Excel"
    5. 'Process.Start(My.Settings.Excel)
    6. Else If sender Is btn_Word
    7. 'Button 2 ..
    8. Label1.Text = "Button Word"
    9. 'Process.Start(My.Settings.Word)
    10. Else
    11. 'Irgendein anderer
    12. Label1.Text = "unbekannt"
    13. End If
    14. End Sub
    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!
    Soll jedes Programm mit einem eigenen Button gestartet werden?

    Wenn nicht, dann könnte man darüber nachdenken, das ganze mit einem Dataset und einer Listbox zu lösen. Dann wäre das ganze dynamisch und der Benutzer könnte auch zur Laufzeit Programme hinzufügen. Speichern geht natürlich auch (in XML).