EditBox + GuiCtrlSetData Problem

  • Hallo liebe Autoit-Gemeinde,

    ich habe ein kleines Problem mit einer EditBox und GuiCtrlSetData:
    -- habe eine Funktion die alle 500ms die EditBox aktualisiert
    -- die EditBox wird mit GuiCtrlSetData gefüllt, aber jedes mal wenn das passiert, springt er zum Anfang
    -- wenn ich GuiCtrlSetData($Edit,"Text",True) benutze springt er lediglich zum Ende

    Ich möchte währenddessen aber weiterhin ganz normal scrollen

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $text = ""
    For $x = 1 TO 100
    $text &= @Crlf & "Text"
    Next

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("", 639, 438, 192, 124, -1, BitOR($WS_EX_TRANSPARENT,$WS_EX_WINDOWEDGE))
    $Edit1 = GUICtrlCreateEdit("", 129, 32, 401, 265)
    GUICtrlSetData($edit1,$text)

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    AdlibRegister("_Refresh",500)
    While 1

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

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

    Func _Refresh ()
    GuiCtrlSetData($edit1,$text)
    EndFunc

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

    Jemand eine Idee das zu lösen oder zu umgehen?

    Danke für alle Antworten

    Einmal editiert, zuletzt von N0THING (19. Januar 2011 um 19:58)

  • Ich kenne keinen Befehl oder Stil der das direkt verhindert, aber du kannst ja den Zustand des Controls vor dem updaten speichern und danach wiederherstellen. Hier mal ein Beispiel.

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIEdit.au3>

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

    $text = ""
    For $x = 1 To 100
    $text &= "Text " & $x & @CRLF
    Next

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

    $Form1 = GUICreate("", 639, 438, 192, 124, -1, BitOR($WS_EX_TRANSPARENT, $WS_EX_WINDOWEDGE))
    $Edit1 = GUICtrlCreateEdit("", 129, 32, 401, 265)
    GUICtrlSetCursor(-1, 5)
    GUICtrlSetData(-1, $text)
    GUISetState()

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

    AdlibRegister("_Refresh", 700)

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

    While 1

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

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

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

    Func _Refresh()
    $iCursor = MouseGetCursor()
    GUISetCursor($iCursor, 0, $Form1)
    $iLine = _GUICtrlEdit_GetFirstVisibleLine($Edit1)
    $aCurSel = _GUICtrlEdit_GetSel($Edit1)
    _GUICtrlEdit_BeginUpdate($Edit1)
    _GUICtrlEdit_SetText($Edit1, $text)
    For $i = 1 To $iLine
    _GUICtrlEdit_Scroll($Edit1, 1)
    Next
    _GUICtrlEdit_SetSel($Edit1, $aCurSel[0], $aCurSel[1])
    _GUICtrlEdit_EndUpdate($Edit1)
    EndFunc ;==>_Refresh

    [/autoit]
  • Danke Name22
    mit der GUIEdit.au3 habe ich mich noch nicht so beschäftigt, habe immer nur die Standard GUI-Funktionen genutzt.
    Deine Lösung habe ich gleich eingebaut und sie funktioniert so wie sie es soll.
    Oscar ich glaube ein ListView wäre unpassend da es meistens längere Texte sind.
    Finde es nur schade das die Lösung nicht einfacher ist.
    Ein Parameter mehr der das behebt wäre schon sinnvoll, wie ich finde.

  • Ich bin mal wieder spät dran und ja, es gibt eine tolle UDF, aber letzlich braucht man davon für diesen Fall knapp eine handvoll Nachrichten. Deshalb, für die Nachwelt:

    [autoit]

    Func _Refresh()
    Static $I = 0
    Local $EM_GETSEL = 0xB0, $EM_SETSEL = 0xB1, $WM_SETREDRAW = 0x000B
    Local $SelStart = DllStructCreate("INT"), $SelEnd = DllStructCreate("INT")
    $I += 1
    GUICtrlSendMsg($Edit1, $WM_SETREDRAW, 0, 0)
    GUICtrlSendMsg($Edit1, $EM_GETSEL, DllStructGetPtr($SelStart), DllStructGetPtr($SelEnd))
    GUICtrlSendMsg($Edit1, $EM_SETSEL, -2, -1) ; Textcursor ans Ende setzen
    GuiCtrlSetData($Edit1, "Neue Zeile " & $I & @CRLF, 1)
    GUICtrlSendMsg($Edit1, $EM_SETSEL, DllStructGetData($SelStart, 1), DllStructGetData($SelEnd, 1))
    GUICtrlSendMsg($Edit1, $WM_SETREDRAW, 1, 0)
    EndFunc

    [/autoit]
  • Danke für die Funktion Großvater
    Habe da aber noch ein Problem
    Ich will das EditFeld zurücksetzen also "" leeren
    Das gelingt mir aber nicht

    Spoiler anzeigen
    [autoit]


    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $Form1 = GUICreate("", 639, 438, 192, 124, -1, BitOR($WS_EX_TRANSPARENT,$WS_EX_WINDOWEDGE))
    $Edit1 = GUICtrlCreateEdit("Text", 129, 32, 401, 265)
    GUISetState(@SW_SHOW)

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

    AdlibRegister("_Refresh",500)
    While 1

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

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

    EndSwitch
    WEnd

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

    Func _Refresh()
    Static $I = 0
    Local $EM_GETSEL = 0xB0, $EM_SETSEL = 0xB1, $WM_SETREDRAW = 0x000B
    Local $SelStart = DllStructCreate("INT"), $SelEnd = DllStructCreate("INT")
    $I += 1
    GUICtrlSendMsg($Edit1, $WM_SETREDRAW, 0, 0)
    GUICtrlSendMsg($Edit1, $EM_GETSEL, DllStructGetPtr($SelStart), DllStructGetPtr($SelEnd))
    GUICtrlSendMsg($Edit1, $EM_SETSEL, -2, -1) ; Textcursor ans Ende setzen
    GuiCtrlSetData($Edit1, "" , 1)
    GUICtrlSendMsg($Edit1, $EM_SETSEL, DllStructGetData($SelStart, 1), DllStructGetData($SelEnd, 1))
    GUICtrlSendMsg($Edit1, $WM_SETREDRAW, 1, 0)
    EndFunc

    [/autoit]

    Was mache ich falsch? Wie gehts richtig?