GUICtrlSetData ohne Button

10/11/2011 15:28 Emo!#1
Wie schreibe ich das , das ich wenn ich in Input1 was schreibe das sich das DIREKT in Label2 übertragen wird

Code:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form2 = GUICreate("F", 301, 35, 302, 218)
$Input1 = GUICtrlCreateInput("", 8, 8, 121, 21)
GUICtrlSetLimit(-1, 17)
$Label1 = GUICtrlCreateLabel(">", 136, 8, 10, 17)
$Label2 = GUICtrlCreateLabel(" ", 152, 8, 143, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd
10/11/2011 16:38 Ludder231#2
PHP Code:
While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit

    EndSwitch
    
    if 
guictrlread($input1) <> GUICtrlRead($label1Then
        GUICtrlSetData
($Label1GUICtrlRead($Input1))
    endif

WEnd 
10/11/2011 17:28 Emo!#3
Dankii ^-^ #ThanksGive
10/11/2011 17:41 link#4
Ugh, das ist aber eine ziemlich hässliche Lösung..

Schöner und performanter wäre es, wenn du ein Callback für WM_COMMAND registrierst und die Nachricht der Editbox selbst abfängst:
Code:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
$Form2 = GUICreate("F", 301, 35, 302, 218)
$Input1 = GUICtrlCreateInput("", 8, 8, 121, 21)
GUICtrlSetLimit(-1, 17)
$Label1 = GUICtrlCreateLabel(">", 136, 8, 10, 17)
$Label2 = GUICtrlCreateLabel(" ", 152, 8, 143, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

GUIRegisterMsg($WM_COMMAND, "MsgCallback")

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func MsgCallback($hWnd, $Msg, $wParam, $lParam)
    Switch $Msg
        Case $WM_COMMAND
            If $wParam = BitShift($EN_CHANGE, -16) + $Input1 Then
                GUICtrlSetData($Label2, GUICtrlRead($Input1))
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
10/11/2011 17:49 BlackHybrid#5
Wieso so umständlich?
PHP Code:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form2 GUICreate("F"30135302218)
$Input1 GUICtrlCreateInput(""8812121)
GUICtrlSetLimit(-117)
$Label1 GUICtrlCreateLabel(">"13681017)
$Label2 GUICtrlCreateLabel(" "152814320)
GUICtrlSetFont(-1104000"MS Sans Serif")
GUIRegisterMsg($WM_COMMAND"WM_COMMAND")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit

    EndSwitch
WEnd

Func WM_COMMAND
($hWinHandle$iMsg$wParam$lParam)
    
$controlID BitAND($wParam0x0000FFFF)
    If 
$controlID $Input1 Then
        GUICtrlSetData
($Label1GUICtrlRead($Input1))
    EndIf
EndFunc 
10/11/2011 18:09 link#6
Wieso umständlich?

Hatte überlesen, dass wenn kein Return ausgeführt, automatisch zum AutoIt Handler zurückgesprungen wird, also ist das "Return $GUI_RUNDEFMSG" überflüssig.

Da der MsgHandler aber auch für andere Nachrichten registriert werden kann, habe ich vollständigkeitshalber abgefragt, ob es sich um die gewollte Nachricht handelt.
Und den Notification Code habe ich überprüft, damit der Text nicht wie in deinem Codeschnipsel unnötigerweise kopiert wird, wenn die EditBox z.B. den Fokus erhält.
10/11/2011 21:42 klavier22#7
Ich finde diese Art von "GUI Message abfragen" sehr interessant. Man kann sich doch damit die While Schleife, die Koda erstellt, sparen (zumindest halb):


Nur wird die Funktion halt nicht aufgerufen wenn man auf den Beenden Button klickt.
Habt ihr dazu evtl irgendwo Lektüre? Also iwelche Tutorials oder Websiten dazu?
10/11/2011 22:30 BlackHybrid#8
Soweit ich weis geht es nicht, da das Script pausiert wird wenn irgendeine Notification stattfindet.
Bin mir an der Stelle aber nicht wirklich sicher.
Wenn eine weitere Notification stattfindet sollte sich Beispielsweise wenn man Exit benutzt sich das Script schließen
10/12/2011 00:36 link#9
Die Möglichkeit ein Callback für WM_CLOSE zu registrieren scheint wohl nicht implementiert zu sein.. Jedenfalls wird es nicht weitergeleitet.
Du könntest aber WM_SYSCOMMAND benutzen:

Code:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiButton.au3>

Global Const $SIZE_MAXIMIZED = 2
Global Const $SIZE_MINIMIZED = 1
Global Const $SC_CLOSE = 0xF060

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 142, 54, 211, 122, $WS_MAXIMIZEBOX + $WS_MINIMIZEBOX + $WS_CAPTION + $WS_POPUP + $WS_SYSMENU)
$Input1 = GUICtrlCreateInput("Input1", 8, 8, 121, 21)
$Label1 = GUICtrlCreateLabel("Label1", 8, 36, 36, 17)
$Button1 = GUICtrlCreateButton("Button1", 46, 32, 60, 21)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

GUIRegisterMsg($WM_COMMAND, "MsgCallback")
GUIRegisterMsg($WM_SIZE, "MsgCallback")
GUIRegisterMsg($WM_SYSCOMMAND, "MsgCallback")

While 1
    Sleep(100)
WEnd

Func MsgCallback($hWnd, $Msg, $wParam, $lParam)
    Switch $Msg
        Case $WM_COMMAND
            Switch $wParam
                Case BitShift($EN_CHANGE, -16) + $Input1
                    GUICtrlSetData($Label1, GUICtrlRead($Input1))
                Case BitShift($BN_CLICKED, -16) + $Button1
                    MsgBox(0, "", "Button")
                Case BitShift($BN_CLICKED, -16) + $Label1
                    MsgBox(0, "", "Label")
            EndSwitch
         Case $WM_SIZE
            Switch $wParam
                Case $SIZE_MAXIMIZED
                    MsgBox(0, "", "Maximiert")
                Case $SIZE_MINIMIZED
                    MsgBox(0, "", "Minimiert")
            EndSwitch
         Case $WM_SYSCOMMAND
             If $wParam = $SC_CLOSE Then Exit
    EndSwitch
EndFunc