_GUICtrlRichEdit_GetText() verschluckt letzen Buchstaben

  • Hallo,
    Kann mir jemand sagen was ich falsch mache? In Zeile 45 hakt es. Wenn ihr die RichEdit ganz Oben verändert, wird per consoleWrite der Text ausgegeben. Nur fehlt da ein Buchstabe 8|

    Wo liegt mein Fehler?!
    Sobald ich den ersten Buchstaben eintippe, bekomme ich @error 700 - Internal Error. Danach bleibt @error 0.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <WinAPI.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiRichEdit.au3>
    #include <WindowsConstants.au3>
    Global Const $WM_IME_KEYUP = 0x0291
    Global $sIniPath = @AppDataDir & "\RegExpIt\Settings.ini"

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

    ;~ If Not FileExists($sIniPath) Then ; Ini neu schreiben.
    ;~ IniWrite($sIniPath, "Genral Settings", "Resolution", "800x600")
    ;~ EndIf

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

    $aGUIRes = StringSplit(IniRead($sIniPath, "General Settings", "Resolution", "800x600"), "x", 2)
    $hGUI = GUICreate("", $aGUIRes[0], $aGUIRes[1], -1, -1, $WS_OVERLAPPEDWINDOW)
    GUISetFont(12)

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

    $hRE_RegExp = _GUICtrlRichEdit_Create($hGUI, "", 10, 10, 445, 120)
    _GUICtrlRichEdit_SetFont($hRE_RegExp, 12)
    GUICtrlCreateLabel("Zukünftige Symbolleiste", 10, 140, 780, 20, 0x01)
    GUICtrlSetBkColor(-1, 0x00FFAA)
    $hRE_TestString = _GUICtrlRichEdit_Create($hGUI, "Mayer, Meier, Peters, Maier, Meyer, Rudolfs", 10, 170, 780, 200)
    _GUICtrlRichEdit_SetFont($hRE_TestString, 12)

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

    $hRE_Matches = _GUICtrlRichEdit_Create($hGUI, "", 10, 390, 780, 200)
    _GUICtrlRichEdit_SetFont($hRE_Matches, 15)

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

    ;~ Dim $hRE_ARRAY[3][2] = [[$hRE_RegExp, ""],[$hRE_TestString, ""],[$hRE_Matches, ""]]
    Dim $aRE_BKCOLORS[5] = [0xAADD55, 0xF0F0AA, 0xAAAA11, 0x112233, 0x00DDFD] ;Zufällige Farben für gefundene Subpatterns ("richtige" Farben kommen später)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    GUIDelete($hGUI) ;GUI löschen, wegen RichEdit.
    Exit
    EndSwitch
    _RichEdit_ApplyRegExp()
    WEnd

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

    Func _RichEdit_ApplyRegExp()
    If _GUICtrlRichEdit_IsModified($hRE_RegExp) Then
    ConsoleWrite(_GUICtrlRichEdit_GetText($hRE_RegExp) & @TAB & @error & @TAB & @extended & @CRLF) ; <<------------- Warum fehlt da immer ein Buchstabe?!
    _GUICtrlRichEdit_SetModified($hRE_RegExp, False)
    $aTmp = StringRegExp(_GUICtrlRichEdit_GetText($hRE_TestString), _GUICtrlRichEdit_GetText($hRE_RegExp), 3)

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

    If Not @error Then
    _GUICtrlRichEdit_SetText($hRE_Matches, _ArrayToString($aTmp, @CRLF))
    EndIf
    EndIf
    EndFunc ;==>_RichEdit_ApplyRegExp

    [/autoit]
  • Hallo SEuBo,

    kann in deinem Skript keinen Fehler finden, die Anzeige in der Console ist aber definitv falsch. Ich habe das Beispiel aus der Hilfe etwas abgeändert, da kommt der Fehler nicht vor.

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_Au3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #include <GuiRichEdit.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Global $lblMsg, $hRichEdit

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

    Main()

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

    Func Main()
    Local $hGui, $hRichEdit, $iMsg
    $hGui = GUICreate("Example (" & StringTrimRight(@ScriptName, 4) & ")", 320, 350, -1, -1)
    $hRichEdit = _GUICtrlRichEdit_Create($hGui, "This is a test.", 10, 10, 300, 220, _
    BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    $lblMsg = GUICtrlCreateLabel("", 10, 235, 300, 100)
    Local $btnGet = GUICtrlCreateButton("Get Text", 10, 330, 300, 18)
    GUISetState()

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

    _GuiCtrlRichEdit_AppendText($hRichEdit, @CR & "This is appended text.")

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

    Report("Text Appended: " & @CR & @CR & _GUICtrlRichEdit_GetText($hRichEdit))

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

    While True
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete()
    Exit
    Case $btnGet
    MsgBox(0, "Text: ", _GUICtrlRichEdit_GetText($hRichEdit))
    EndSwitch
    if _GUICtrlRichEdit_IsModified($hRichEdit) Then
    Report("Text Appended: " & @CR & @CR & _GUICtrlRichEdit_GetText($hRichEdit))
    _GUICtrlRichEdit_SetModified($hRichEdit, False)
    EndIf
    WEnd
    EndFunc ;==>Main

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

    Func Report($sMsg)
    GUICtrlSetData($lblMsg, $sMsg)
    EndFunc ;==>Report

    [/autoit]

    Vielleicht ist die GuiRichEdit.au3 ja etwas buggy und es tritt nur bei besonderen Konteallationen auf :?:

    mfg (Auto)Bert

  • Fehler gelöst. Man muss die RichEdit nur ein bisschen veräppeln :D

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GuiRichEdit.au3>
    #include <WindowsConstants.au3>

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

    Global $sIniPath = @AppDataDir & "\RegExpIt\Settings.ini"

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

    ;~ If Not FileExists($sIniPath) Then ; Ini neu schreiben.
    ;~ IniWrite($sIniPath, "Genral Settings", "Resolution", "800x600")
    ;~ EndIf

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

    $aGUIRes = StringSplit(IniRead($sIniPath, "General Settings", "Resolution", "800x600"), "x", 2)

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

    $hGUI = GUICreate("", $aGUIRes[0], $aGUIRes[1], -1, -1, $WS_OVERLAPPEDWINDOW)
    GUISetFont(12)

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

    $hRE_RegExp = _GUICtrlRichEdit_Create($hGUI, "", 10, 10, 445, 120, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    _GUICtrlRichEdit_SetFont($hRE_RegExp, 12)
    GUICtrlCreateLabel("Zukünftige Symbolleiste", 10, 140, 780, 20, 0x01)
    GUICtrlSetBkColor(-1, 0x00FFAA)
    $hRE_TestString = _GUICtrlRichEdit_Create($hGUI, "Mayer, Meier, Peters, Maier, Meyer, Rudolfs", 10, 170, 780, 200)
    _GUICtrlRichEdit_SetFont($hRE_TestString, 12)

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

    $hRE_Matches = _GUICtrlRichEdit_Create($hGUI, "", 10, 390, 780, 200)
    _GUICtrlRichEdit_SetFont($hRE_Matches, 15)

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

    Dim $aRE_BKCOLORS[5] = [0xAADD55, 0xF0F0AA, 0xAAAA11, 0x112233, 0x00DDFD] ;Zufällige Farben für gefundene Subpatterns ("richtige" Farben kommen später)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    GUIDelete($hGUI) ;GUI löschen, wegen RichEdit.
    Exit
    EndSwitch
    _RichEdit_ApplyRegExp()
    WEnd

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

    Func _RichEdit_ApplyRegExp()
    If _GUICtrlRichEdit_IsModified($hRE_RegExp) Then
    ConsoleWrite(_RichEdit_GetText($hRE_RegExp) & @TAB & @error & @TAB & @extended & @CRLF)
    _GUICtrlRichEdit_SetModified($hRE_RegExp, False)
    $aTmp = StringRegExp(_RichEdit_GetText($hRE_TestString), _RichEdit_GetText($hRE_RegExp), 3)

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

    If Not @error Then
    _GUICtrlRichEdit_SetText($hRE_Matches, _ArrayToString($aTmp, @CRLF))
    EndIf
    EndIf
    EndFunc ;==>_RichEdit_ApplyRegExp

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

    Func _RichEdit_GetText($hRichEdit)
    ;SEuBo
    _GUICtrlRichEdit_AppendText($hRichEdit, " ")
    $sRet = StringReplace(_GUICtrlRichEdit_GetText($hRichEdit,True), @CR & " ",@CR)
    _GUICtrlRichEdit_SetText($hRichEdit, $sRet)
    _GUICtrlRichEdit_GotoCharPos($hRichEdit, StringLen($sRet))
    Return $sRet
    EndFunc ;==>_RichEdit_GetText

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    • Offizieller Beitrag

    Scheinbar ist das aber nicht die einzigste Funktion, von GUIRichEdit.au3, die nicht korrekt funktioniert.. _GUICtrlRichEdit_GetTextLength liefert auch falsche Werte, die Funktion wird auch von _GUICtrlRichEdit_GetText verwendet.

  • Scheinbar ist das aber nicht die einzigste Funktion, von GUIRichEdit.au3, die nicht korrekt funktioniert.. _GUICtrlRichEdit_GetTextLength liefert auch falsche Werte, die Funktion wird auch von _GUICtrlRichEdit_GetText verwendet.


    Nein, die funktioniert korrekt. Man muss aber angeben, was man als Ergebnis haben will. Es gibt entweder Bytes oder Buchstaben und zusätzlich eine genaue Zahl oder angenähert ("auf jeden Fall ausreichende Buffergröße") Standard ist Exakte Bytelänge.

    • Offizieller Beitrag

    Muß ich jetzt nicht wirklich verstehen. Das Beispiel zu _GUICtrlRichEdit_GetTextLength liefert als Ausgabe :There are 39 characters in the control zurück, obwohl nur 37 Zeichen einschließlich der Leerzeichen enthalten sind.
    Wird da @CR oder @LF mitgezählt?


    Edit: Warscheinlich schon, woher soll sonst das Control Wissen, das ein Zeilenwechsel gemacht wird.
    Denkfehler meinerseits.