"Buttontext" <> "Buttonwert"

  • Hallo!Ist es möglich einen Button zu erstellen welcher einen bestimmten Wert hat allerdings einen anderen Wert anzeigt.

    Ein Beispiel:
    Die Variable "Button" soll den Wert "Dieser String wird nicht angezeigt!" haben allerdings soll der Button den Wert der Variable "Text" anzeigen.

    PHP
    $Button = GUICtrlCreateButton("Dieser String wird nicht angezeigt!", 132, 124, 100, 50)$Text = "Stattdessen wird dieser String angezeigt!"

    Ich hoffe ich habe mich verständlich ausgedrückt  :D

    Einmal editiert, zuletzt von metaljojo (4. Juni 2013 um 22:48)

    • Offizieller Beitrag

    Irgendwie ist das ganze Sinnfrei.
    Werte die beim drücken eines Buttons gesetzt/übergeben werden sollen, gehören in die Messageauswertung.
    Dort wird dann der Wert gesetzt, Buttons sind keine Datencontainer.

  • Irgendwie ist das ganze Sinnfrei.
    Werte die beim drücken eines Buttons gesetzt/übergeben werden sollen, gehören in die Messageauswertung.
    Dort wird dann der Wert gesetzt, Buttons sind keine Datencontainer.


    In html hat ein buttn eine id, name, value, welche man selsbt vergeben kann. In Java gibt es auch ein extra attribute 'actionCommand' welches man im nachhinein rauslesen kann.

    Zum Thema: In autoit kann man dies nicht machen.

  • In AutoIt kann man fast alles machen, man muss nur wissen wie es geht.
    Ein Button hat auch hier eine ID, einen Anzeigetext, einen Status (GuiCtrl States), einen Style, ein Event (im Eventmode). Und ich wette, dass ich noch die Hälfte vergessen habe.

    Poste ein funktionierendes Skript und erläutere den Fehler anschaulich.

  • Ich mache mal ein konkreteres Beispiel!

    [autoit]

    $Button = GUICtrlCreateButton("Text", 132, 124, 100, 50)

    [/autoit]


    Beim klick auf den Button soll der Schriftzug "Text" zu "Neuer Text" werden aber die Variable $Button soll immer noch den Wert "Text" haben.

    • Offizieller Beitrag

    Beim klick auf den Button soll der Schriftzug "Text" zu "Neuer Text" werden aber die Variable $Button soll immer noch den Wert "Text" haben.


    Das ist quatsch. Die Variable $Button hat niemals den Wert "Text" - sie hat eine ID (Zahl) die vom System beim Erstellen vergeben wird.
    Den Text kannst du ändern, wie ich bereits geschrieben habe, mit GuiCtrlSetData.

  • Was du da veränderst ist die Button Beschriftung.
    Wie BugFix sagte, speichert die Variable nur die ID ab, um den Button ansprechen zu können.
    Am besten speicherst du einfach die alte Beschriftung in eine eigene Variable:

    Spoiler anzeigen
    [autoit]

    GUICreate('', 200, 50)
    $idButton = GUICtrlCreateButton('Text', 0, 0, 200, 50)
    GUISetState()

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

    Sleep(500)

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

    $sText = GUICtrlRead($idButton)
    GUICtrlSetData($idButton, 'Neuer Text')

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

    Sleep(500)
    GUICtrlSetData($idButton, $sText)

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

    Sleep(1000)

    [/autoit]
    • Offizieller Beitrag

    Du schreibst ja nicht was du machen willst (sehr schlecht, wenn man Hilfe bekommen möchte).
    Es klingt so, als wolltest du die Buttonbeschriftung abwechselnd ändern (Aus/Ein etc.)
    Das ginge so am einfachsten:

    [autoit]

    GUICreate('Test')
    $bt = GUICtrlCreateButton('Test', 20,20,80,22)
    GUISetState()

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

    Global $aText[2] = ['Test', 'Sonstwas']
    $iSwap = 0

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $bt
    $iSwap = Not $iSwap
    GUICtrlSetData($bt, $aText[$iSwap])
    EndSwitch
    WEnd

    [/autoit]
  • Ich glaube, er möchte das der Button was bestimmtes anzeigt aber wenn er ihn dann ausliest (wie auch immer) etwas anderes zurück gibt.

    Aber Buttons haben so keinen "Wert" nur halt ne ID wie die anderen schon sagten

    Um Missverständnisse zu vermeiden, mein Name rührt vom Sternenbild und nicht vom Shop her :D


    Rainbow Dash :rock:

    "Das, wobei unsere Berechnungen versagen, nennen wir Zufall." (Albert Einstein)

  • Wie schon gesagt wurde gibt es in Autoit nicht das Prinzip, dass ein Button neben dem Anzeigetext noch ein unabhängiges frei definierbares value Attribut besitzt. Man kann sowas aber nachbilden wenn man meint es wäre sinnvoll, ich sehe aber nicht wirklich einen Sinn dahinter. Im Beispiel unten ist es möglich erweiterte Buttons zu erzeugen, welche einen Text und einen Wert haben, beides kann unabhängig voneinander geändert werden. Prinzipiell könnte man das auch erweitern und mehrere "Value" Spalten hinzufügen, so dass ein Button sogar unendlich viele einzeln änderbare Werte haben könnte.


    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>

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

    global $aExtendedButton[1][3]=[["id","text","value"]]

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

    $gui = GUICreate("TestGUI", 615, 438, 192, 124)
    $myButton_1 = createExtendedButton($aExtendedButton,"Wert1","Text1", 20, 30, 100, 50)
    $myButton_2 = createExtendedButton($aExtendedButton,"Wert2","Text2", 220, 30, 100, 50)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $myButton_1, $myButton_2
    MsgBox(0,"DebugInfo", "Alter Text: " & getExtendedButtonInfoByID($aExtendedButton,$nMsg,"text") & @CRLF & _
    "Alter Wert: " & getExtendedButtonInfoByID($aExtendedButton,$nMsg,"value"))
    $neuerText = InputBox("DebugTest: setNewText","Bitte neuen Button Text eingeben")
    $neuerWert = InputBox("DebugTest: setNewValue","Bitte neuen Button Wert eingeben")
    setExtendedButtonInfoByID($aExtendedButton,$nMsg,"text",$neuerText)
    setExtendedButtonInfoByID($aExtendedButton,$nMsg,"value",$neuerWert)
    MsgBox(0,"DebugInfo", "Neuer Text: " & getExtendedButtonInfoByID($aExtendedButton,$nMsg,"text") & @CRLF & _
    "Neuer Wert: " & getExtendedButtonInfoByID($aExtendedButton,$nMsg,"value"))
    EndSwitch
    WEnd

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

    func createExtendedButton(ByRef $aButton,$value="", $text = "", $left=-1, $top=-1, $width = Default, $height = Default, $style = Default, $exStyle = Default )
    if not isarray($aButton) then
    consolewrite("Error: Es wurde kein Array angegeben" & @CRLF)
    return
    else
    redim $aButton[ubound($abutton)+1][3]
    endif

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

    if $value = "" then $value = $text

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

    $aButton[ubound($aButton)-1][0]=GUICtrlCreateButton($text, $left, $top, $width, $height,$style,$exStyle)
    $aButton[ubound($aButton)-1][1]=$text
    $aButton[ubound($aButton)-1][2]=$value

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

    return $aButton[ubound($aButton)-1][0]
    endfunc

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

    func getExtendedButtonInfoByID(ByRef $aButton, $searchId, $infoItem)
    Local $column = -1
    if not isarray($aButton) then
    consolewrite("Error: Es wurde kein Array angegeben" & @CRLF)
    return
    endif

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

    $id = _arraySearch($aButton,$searchID,1)

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

    if $id = -1 then
    consolewrite("Error: Button ID not found" & @CRLF)
    return
    endif

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

    if $InfoItem = "text" then $column = 1
    if $InfoItem = "value" then $column = 2

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

    if $column = -1 then
    consolewrite("Error: Ungültiges InfoItem" & @CRLF)
    return
    endif
    return $aButton[$id][$column]
    EndFunc

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

    func setExtendedButtonInfoByID(ByRef $aButton, $searchId, $infoItem,$newItemInfo)
    Local $column = -1
    if not isarray($aButton) then
    consolewrite("Error: Es wurde kein Array angegeben" & @CRLF)
    return
    endif

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

    $id = _arraySearch($aButton,$searchID,1)

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

    if $id = -1 then
    consolewrite("Error: Button ID not found" & @CRLF)
    return
    endif

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

    if $InfoItem = "text" then $column = 1
    if $InfoItem = "value" then $column = 2

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

    if $column = -1 then
    consolewrite("Error: Ungültiges InfoItem" & @CRLF)
    return
    endif

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

    $aButton[$id][$column]=$newItemInfo
    if $column = 1 then guictrlsetData($searchID,$newItemInfo)
    endFunc

    [/autoit]

    3 Mal editiert, zuletzt von misterspeed (4. Juni 2013 um 13:14)

    • Offizieller Beitrag
    Zitat von misterspeed

    Wie schon gesagt wurde gibt es in Autoit nicht das Prinzip, dass ein Button neben dem Anzeigetext noch ein unabhängiges frei definierbares value Attribut besitzt.


    Btw. hat das nichts mit AutoIt zu tun. Ein Button ist ein WinApi Control und hat halt diese Eigenschaften nicht, ganz egal in welcher Programmiersprache man den Button erstellt.

    • Offizieller Beitrag

    Ich hab zwar keinen Plan, aber ein PHP Button ist kein GUI Control.
    Aber wie geschrieben, hab eh keinen Plan :P
    ^^

  • Ich könnte jetzt noch den Begriff "GUI" genauer definieren, aber lassen wir das... darum gings hier ja letzlich auch nicht. Ich denke hier wurde alles nötige gesagt und wir wissen beide, was der Threadersteller haben wollte, was mit Autoit und meinetwegen auch mit der WinAPI nativ möglich ist und was nicht.

    PS: Dass du keinen Plan hast nimmt dir eh keiner ab. :P

    • Offizieller Beitrag

    :rofl:

  • Vielen Dank für die zahlreichen Antworten ;)

    Es tut mir leid eine so unverständliche (und auch etwas dämliche :rofl: ) Frage gestellt zu haben! Dank eurer Antworten kann ich mir jetzt ein Besseres Bild von Buttons, GUI etc. machen! Für mich als blutigen Anfänger ist das alles doch noch recht verwirrend... :wacko:

  • Das hat mich jetzt nicht mehr losgelassen. (und das hier gepostete war unbefriedigend :D)
    Daher 2 Funktionen die das Arbeiten mit "Zusatzdaten" bei allen Arten von Controls ermöglichen (müssten, ist nicht ausgiebig getestet !).
    Man kann beliebigen Controls Daten hinzufügen (AddData), und diese nach belieben Tauschen (SwapData), oder Rotieren (SwapData ohne Parameter)

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    Global $__aCtrlData[1][2]

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

    Global $hGUI = GUICreate('Test', 256, 256)
    Global $hBtn1 = GUICtrlCreateButton('Button', 10, 10, 100, 25)
    Global $hBtn2 = GUICtrlCreateButton('Start', 10, 40, 100, 25)
    Global $hLabel = GUICtrlCreateLabel('Ich bin ein Label', 10, 70, 200, 18)

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

    GuiCtrlAddData($hBtn1, 'Hallo')
    GuiCtrlAddData($hBtn1, 'Wie')
    GuiCtrlAddData($hBtn1, 'Geht')
    GuiCtrlAddData($hBtn1, 'Es')
    GuiCtrlAddData($hBtn1, 'Dir')
    GuiCtrlAddData($hBtn1, 'So ?')
    GuiCtrlAddData($hBtn2, 'Stop')
    GuiCtrlAddData($hLabel, 'Das ist ein Test')
    GuiCtrlAddData($hLabel, 'Klappt auch mit Labels')

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

    GUISetState(@SW_SHOW, $hGUI)

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

    While True
    Switch GUIGetMsg()
    Case $hBtn1
    GuiCtrlSwapData($hBtn1)
    GuiCtrlSwapData($hLabel)
    Case $hBtn2
    GuiCtrlSwapData($hBtn2)
    GuiCtrlSwapData($hLabel)
    Case -3
    Exit
    EndSwitch
    WEnd

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

    ; ist §iNr = -1 wird einfach rotiert, ansonsten wird der Wert an Position $iNr benutzt
    Func GuiCtrlSwapData($iCtrl, $iNr = -1)
    Local $iPtr = GUICtrlGetHandle($iCtrl)
    If Not $iPtr Then Return SetError(1, 0, False)
    Local $iIndex, $aSplit, $sTmp, $iSubIndex, $iMax
    $iIndex = _ArraySearch($__aCtrlData, $iPtr)
    If @error Then Return SetError(1, 0, False)
    $sTmp = GUICtrlRead($iCtrl)
    $aSplit = StringSplit($__aCtrlData[$iIndex][1], '|', 2)
    $iSubIndex = _ArraySearch($aSplit, $sTmp)
    If $iSubIndex = -1 Then GuiCtrlAddData($iCtrl, $sTmp)
    If @error Then Return SetError(2, 0, False)
    $iMax = UBound($aSplit)
    If $iNr = -1 Then
    $iSubIndex += 1
    If $iSubIndex >= $iMax Then $iSubIndex -= $iMax
    Else
    If ($iNr >= $iMax) Or ($iNr < 0) Then Return SetError(3, 0, False)
    $iSubIndex = $iNr
    EndIf
    GUICtrlSetData($iCtrl, $aSplit[$iSubIndex])
    EndFunc ;==>GuiCtrlSwapData

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

    Func GuiCtrlAddData($iCtrl, $sData)
    Local $iPtr = GUICtrlGetHandle($iCtrl)
    If Not $iPtr Then Return SetError(1, 0, False)
    Local $iIndex = _ArraySearch($__aCtrlData, $iPtr), $u
    If $iIndex = -1 Then
    $u = UBound($__aCtrlData) - 1
    If ($__aCtrlData[$u][0] <> '') Then
    ReDim $__aCtrlData[$u + 2][2]
    $u += 1
    EndIf
    Else
    $u = $iIndex
    EndIf
    $__aCtrlData[$u][0] = $iPtr
    $__aCtrlData[$u][1] &= '|' & $sData
    If StringLeft($__aCtrlData[$u][1], 1) = '|' Then $__aCtrlData[$u][1] = StringTrimLeft($__aCtrlData[$u][1], 1)
    Return True
    EndFunc ;==>GuiCtrlAddData

    [/autoit]

    lg
    Mars