Variable durchreichen

  • Hallo ich möchte eine Variable ByRef durchreichen. Like this

    Spoiler anzeigen
    [autoit]


    $test123 = "12345"
    main($test123)
    MsgBox(0, "", $test123)
    Func main(ByRef $test)
    test1($test)
    EndFunc ;==>main
    Func test1(byref $test1)
    $test1 = "54321"
    EndFunc ;==>test1

    [/autoit]


    Hier funktioniert das natürlich auch wie ich das möchte, aber eigentlich habe ich das vor:

    Spoiler anzeigen
    [autoit]

    Global $a_Werte[1]
    $test123 = "12345"
    main($test123)
    MsgBox(0, "", $test123) ; hier sollte 54321 rauskommen
    Func main(ByRef $test)
    $a_Werte[0] = $test
    test1($a_Werte[0])
    EndFunc ;==>main
    Func test1(byref $test1)
    $test1 = "54321"
    EndFunc ;==>test1

    [/autoit]


    Hat jemand eine Idee wie ich das Lösen kann?

  • Hat jemand eine Idee wie ich das Lösen kann?


    einmal so:

    Spoiler anzeigen
    [autoit]

    Global $a_Werte[1]
    $test123 = "12345"
    main($test123)
    ConsoleWrite($test123&@CRLF) ; hier sollte 54321 rauskommen
    Func main(ByRef $test)
    $a_Werte[0] = $test
    test1($a_Werte[0])
    ConsoleWrite($a_Werte[0]&@CRLF)
    $test=$a_Werte[0]
    EndFunc ;==>main
    Func test1(byref $test1)
    $test1 = "54321"
    EndFunc ;==>test1

    [/autoit]


    dann kannst du aber auch gleich $Test in der func Main weiterreichen.

    mfg autoBert


  • da frage ich mich dann allerdings warum die Übergabe mit ByRef ausgeführt wird.

    mfg autoBert

    • Offizieller Beitrag

    Da Du in der Funktion "main" die Variable $test per ByRef übergibst, musst Du diese natürlich auch ändern (am Ende der Funktion den Wert von $a_Werte[0] wieder an $test übergeben:

    Spoiler anzeigen
    [autoit]


    Global $a_Werte[1]
    $test123 = "12345"
    main($test123)
    MsgBox(0, "", $test123) ; hier sollte 54321 rauskommen
    Func main(ByRef $test)
    $a_Werte[0] = $test
    test1($a_Werte[0])
    $test = $a_Werte[0] ; <- das hier fehlt
    EndFunc ;==>main
    Func test1(ByRef $test1)
    $test1 = "54321"
    EndFunc ;==>test1

    [/autoit]
  • Ich glaube die Aufgabenstellung ist noch nicht richtig rausgekommen.

    Mein Problem ist das die Funktion Main eine Funktion ist die eine Teil einer GUI aufbaut. Und die Funktion Test1 gibt das ergebnis der GUI dann wieder zurück.
    Aber es soll so sein das wenn jemand die GUI Aufbaut er auch Festlegen kann in Welcher Variable das Ergebnis zu finden ist.

    Im Moment mache ich das über ein Array, dies hat zur folge das es Schwirig wird die Reienfolge der GUI zu verändern. Da sich ja auch die Reienfolge der Antworten Im Array ändert.

    Zur erklärung das ganze gibt einen Konfigurationsdialog für Autoit Scripte, so das man zu begin des scripts alle Einstellungen abfragen kann und diese eingaben in einer INI gespeichert oder gelesen werden.
    Nach dem der Nutzer den Konfigurationsdialog geschlossen hat sollen alle notwendigen werde in Vareablen gespeichert sein die der Entwickler vorgegeben hat.

  • Ja da hast du natürlich recht, aber ich will die Variable erst in der Folgenden Funktion verändern und zurück geben, wie oben beschrieben ist es so das es diese Verkettung der Funktionen nicht wirklich gibt, und genau das ist mein Problem ich möchte sie über diese Vareable Verketten.

  • Ich will versuchen es einfacher darzustellen:

    ich habe eine Funktion die einen Teil einer GUI aufbaut, zudem wird ein Steuer Array jeweils um ein Eintrag erweitert. In diesem Array befinden sich alle GUI Elemente sowie alle werte des Funktionsaufrufs, auch die Initialen werte sowie die zurückgegebenen werte. Dieser möchte ich eine byref var mitgeben, die dann im Array verlinkt werden soll.
    Diese Funktion wird natürlich nur aufgerufen wenn die GUI aufgebaut wird.
    Die Elemente dieses GUI Teils startet eine Eventfunktion die die Werte speichern. genau hier möchte ich dann den Wert in die oben verlinkte Variable schreiben.

    Ich hoffe das ist jetzt verständlicher.

    • Offizieller Beitrag

    Mein Problem ist das die Funktion Main eine Funktion ist die eine Teil einer GUI aufbaut. Und die Funktion Test1 gibt das ergebnis der GUI dann wieder zurück.
    Aber es soll so sein das wenn jemand die GUI Aufbaut er auch Festlegen kann in Welcher Variable das Ergebnis zu finden ist.


    Wie soll ich mir denn das vorstellen? "Jemand" kann den Aufbau der GUI nicht durchführen, das legst ausschließlich du mit deinem Skript fest und somit weißt du auch, welches Element im Array für welchen Wert zuständig ist.

    Ich habe eher den Eindruck, dass du den Ablauf deines Skriptes noch nicht klar formuliert hast und dadurch an auftretenden Symtomen herumdoktorst.
    Mein Tipp:
    Erstelle in Stichpunkten den Ablauf des Programms. Das könnte etwa so aussehen:
    - Start Programm
    - Anzeige Main-Gui
    - User kann Auswahl in Checkboxen vornehmen
    - Klick auf Start-Button ruft Auswertefunktion auf
    - Auswertefunktion setzt Parameter in Abhängigkeit zu angewählten Checkboxen
    - usw. usf.

    Mit dem, was du bis jetzt geschrieben hast, wird dein Anliegen von Post zu Post eher unverständlicher. :wacko:
    Du möchtest zwanghaft Werte hin- und herschieben, was u.U. überhaupt nicht notwendig ist. Doch um dir da weiter zu helfen, müssen wir verstehen können, was genau in deinem Skript passieren soll.

  • Sorry bugfix, aber du hast leider nicht verstanden was ich vor habe.

    ich wills mal einfacher darstellen.
    Ich schreibe Programme die Informationen benötigen wie die Umgebung aussieht. Dies löse ich mit einem UDF welches den Benutzer mit Poupfenster frag was ich wissen muss. Das funktioniert jetzt auch super. Allerdings stört mich das das für jede Information ein Popup hochkommt. Deswegen arbeite ich an Version 2 es wir über die gleich Art von Funktionsaufruf eine Gui gebaut die im Programmablauf dann am ende gestartet wird (also dynamisch). Jetzt habe ich das Problem das die Antworten des Nutzers in einem Array gespeichert wird und das anhand der Reihenfolge wie die Funktionen aufgerufen wurden.
    Und genau das möchte ich auflösen das beim Aufruf der Funktion eine variable mitgegeben werden kann in der dann beim klick auf den Speicher butten in der Gui der wert der Antwort für diese Frage enthalten ist.
    Es Funktioniert ja auch alles wie ich mir das vorstelle es geht nur darum das ich klar festlegen kann wo ich das Ergebnis finde.

    • Offizieller Beitrag

    Sorry bugfix, aber du hast leider nicht verstanden was ich vor habe.


    Das sagte ich doch in meinem Post: Durch deine Beschreibungen wird alles eher unklarer als verständlich. Auch deine jetzige Beschreibung hilft (mir zumindest) nicht wesentlich weiter dein Problem zu verstehen - sorry meinerseits.

  • Hm... seint wohl wie immer Schwere kost zu sein!

    ich schreibe an einer UDF die durch min 2 kleine aufrufe eine Dialog GUI aufbaut und anzeigt.
    1. Aufruf ist die Frage die man dem Benutzer der Anwendung (nicht die UDF) stellen möchte z.B. "Wo befindet sich die Datei XYZ". in der Gui gibt es dann einen Button der einen File öffnen Dialog anzeigt.
    Dieses Funktion wird so oft aufgerufen wie man (Entwickler der Anwendung) es eben benötigt.
    2. Aufruf ist eine dazugehörige Funktion die dann noch zwei Buttons unten dran baut und die Gui anzeigt.

    Wenn jetzt die Gui benutzt wird um wie im obigen Beispiel die Datei auszuwählen kommt das Ergebnis in ein Array welches von der Funktion unter 1 aufgebaut wird.
    Jetzt möchte der Entwickler natürlich das Ergebnis in einer dedizierten variable stehen haben. Die er sinnvoller weise beim Aufruf von Funktion unter eins mit gibt.

    Ich stelle mir da vor das es so ähnlich gelöst werden kann wie bei einer byref variable und dieser verwies müsste dann in dem unter 1 erzeugten Array abgelegt werden. Also so was wie ein Poniter müsste in der erste Funktion erzeugt werden und der dann so gespeichert werden das man in einer Anderen Funktion wieder über den Pointer an die Variable kommt.

    • Offizieller Beitrag

    Und wozu willst du da mit mehreren Funktionen rumgurken?
    Das, was du soeben geschildert hast, kannst du doch mit einer Funktion erledigen:

    [autoit]

    #include <GuiListView.au3>
    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    $Mein_Ergebnis = _GetPathes()
    _ArrayDisplay($Mein_Ergebnis)

    [/autoit][autoit][/autoit][autoit]

    Func _GetPathes()
    Local $Gui = GUICreate('Auswahl', 365, 390)
    GUICtrlCreateLabel('Bitte erforderliche Dateien auswählen', 10, 10)
    Local $LV = GuiCtrlCreateListView('Ausgewählt', 10, 30, 250, 350)
    Local $btSelect = GUICtrlCreateButton('Hinzufügen', 275, 30, 80, 22)
    Local $sPath, $hLV = GUICtrlGetHandle($LV)
    _GUICtrlListView_SetColumnWidth($hLV, 0, $LVSCW_AUTOSIZE_USEHEADER)
    GUISetState(@SW_SHOW, $Gui)
    While True
    Switch GUIGetMsg()
    Case -3
    GUISetState(@SW_HIDE, $Gui)
    ExitLoop
    Case $btSelect
    $sPath = FileOpenDialog('Datei auswählen', "::{450D8FBA-AD25-11D0-98A8-0800361B1103}", '(*.*)', 3)
    If Not @error Then
    GUICtrlCreateListViewItem($sPath, $LV)
    EndIf
    EndSwitch
    WEnd
    If _GUICtrlListView_GetItemCount($hLV) = 0 Then Return ''
    $sPath = ''
    For $i = 0 To _GUICtrlListView_GetItemCount($hLV) -1
    $sPath &= _GUICtrlListView_GetItemText($hLV, $i) & '|'
    Next
    GUIDelete($Gui)
    Return StringSplit(StringTrimRight($sPath, 1), '|')
    EndFunc

    [/autoit]