_GUICtrlRichEdit_SetCharBkColor() Problem mit abwechselnder Färbung.

  • Hallo,
    Ich habe ein Problem mit der Färbung von "nachfolgendem Text" in einer GUICtrlRichEdit. Sprich ich möchte der Richedit sagen, dass der Text, der nun per _GUICtrlRichEdit_AppendText() angehängt wird, eine bestimmte Farbe haben soll.

    Wenn ich Text markiere, und Färbe funktioniert es alles wunderbar. (Siehe mittlere RichEdit). Ich möchte es allerdings festlegen, ohne Text zu markeiren. Die wichtigen Zeilen sind 55-65. Kann mir einer sagen wo mein Fehler liegt?

    Zum Testen Bitte "M\w+r" (Ohne Anführungszeichen) in die obere RichEdit eingeben.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GuiRichEdit.au3>
    #include <WindowsConstants.au3>
    Global $bYellow ; If False, use Blue as next Color
    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("RegExpIt", $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]

    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

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

    _GUICtrlRichEdit_SetText($hRE_Matches, "")
    Global $bYellow = True
    Local $iPos = 0
    $aSel = _GUICtrlRichEdit_GetSel($hRE_RegExp) ; Get curren Cursor Pos.
    _GUICtrlRichEdit_SetCharBkColor($hRE_Matches, 0x80C0FF)

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

    ;Append text in Matches-RichEdit.
    For $i = 0 To UBound($aTmp) - 1
    If Not $bYellow Then _GUICtrlRichEdit_SetCharBkColor($hRE_Matches, 0x80C0FF)
    If $bYellow Then _GUICtrlRichEdit_SetCharBkColor($hRE_Matches, 0xFFF000)

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

    _GUICtrlRichEdit_AppendText($hRE_Matches, $aTmp[$i] & @CRLF)

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

    $iPos += StringLen($aTmp[$i])
    $bYellow = Not $bYellow
    ConsoleWrite($bYellow &@TAB & $iPos & @CRLF)
    ConsoleWrite(_GUICtrlRichEdit_GetCharBkColor($hRE_Matches) & @CRLF)
    Next

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

    ;Clear BKColor for middle-richedit
    _GUICtrlRichEdit_SetSel($hRE_TestString, 0, -1, True)
    _GUICtrlRichEdit_SetCharBkColor($hRE_TestString, 0xFFFFFF)

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

    If _RichEdit_GetText($hRE_RegExp) <> "" Then
    Local $sText = _RichEdit_GetText($hRE_TestString), $iCounter = 0
    Global $bYellow = True

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

    ; Append color in middle-richedit
    For $i = 0 To UBound($aTmp) - 1
    $bYellow = Not $bYellow
    Local $iPos = StringInStr($sText, $aTmp[$i], 1) - 1
    _GUICtrlRichEdit_SetSel($hRE_TestString, $iPos + $iCounter, $iPos + $iCounter + StringLen($aTmp[$i]), True)
    If $bYellow Then _GUICtrlRichEdit_SetCharBkColor($hRE_TestString, 0xFFF000)
    If Not $bYellow Then _GUICtrlRichEdit_SetCharBkColor($hRE_TestString, 0x80C0FF)
    _GUICtrlRichEdit_Deselect($hRE_TestString)
    $sText = StringTrimLeft($sText, $iPos + 1)
    $iCounter += $iPos + 1
    Next
    EndIf
    _GUICtrlRichEdit_SetSel($hRE_RegExp, $aSel[0], $aSel[1]) ;restore Cursor Pos
    Else
    _GUICtrlRichEdit_SetText($hRE_Matches, "")
    EndIf

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

    EndIf
    EndFunc ;==>_RichEdit_ApplyRegExp

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

    Func _RichEdit_GetText($hRichEdit)
    ;SEuBo
    $aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
    _GUICtrlRichEdit_AppendText($hRichEdit, " ")
    $sRet = StringReplace(_GUICtrlRichEdit_GetText($hRichEdit, True), @CR & " ", @CR)
    _GUICtrlRichEdit_SetText($hRichEdit, $sRet)
    ;~ _GUICtrlRichEdit_GotoCharPos($hRichEdit, StringLen($sRet))
    _GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
    Return $sRet
    EndFunc ;==>_RichEdit_GetText

    [/autoit]

    Gelöst:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GuiRichEdit.au3>
    #include <WindowsConstants.au3>
    Global $bYellow ; If False, use Blue as next Color
    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("RegExpIt", $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]

    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($hRE_TestString)
    _RichEdit_ApplyRegExp($hRE_RegExp)
    WEnd

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

    Func _RichEdit_ApplyRegExp(ByRef $hRichEdit)
    If _GUICtrlRichEdit_IsModified($hRichEdit) Then
    _GUICtrlRichEdit_SetModified($hRichEdit, False)

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

    $aTmp = StringRegExp(_RichEdit_GetText($hRE_TestString), _RichEdit_GetText($hRE_RegExp), 3)
    If Not @error Then
    _GUICtrlRichEdit_SetText($hRE_Matches, _ArrayToString($aTmp, @CRLF))
    Global $bYellow = True
    $aSel = _GUICtrlRichEdit_GetSel($hRichEdit) ; Get curren Cursor Pos.

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

    __RichEdit_ColorViaRegExp($hRE_Matches)
    __RichEdit_ColorViaRegExp($hRE_TestString)

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

    _GUICtrlRichEdit_SetSel($hRichEdit, $aSel[0], $aSel[1]) ;restore Cursor Pos
    Else
    _GUICtrlRichEdit_SetText($hRE_Matches, "")
    EndIf
    EndIf
    EndFunc ;==>_RichEdit_ApplyRegExp

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

    Func _RichEdit_GetText($hRichEdit)
    ;SEuBo
    $aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
    _GUICtrlRichEdit_AppendText($hRichEdit, " ")
    $sRet = StringReplace(_GUICtrlRichEdit_GetText($hRichEdit, True), @CR & " ", @CR)
    _GUICtrlRichEdit_SetText($hRichEdit, $sRet)
    _GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
    _GUICtrlRichEdit_SetModified($hRichEdit, False)
    Return $sRet
    EndFunc ;==>_RichEdit_GetText

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

    Func __RichEdit_ColorViaRegExp($hRichEdit)
    $aTmp = StringRegExp(_RichEdit_GetText($hRE_TestString), _RichEdit_GetText($hRE_RegExp), 3)
    _GUICtrlRichEdit_SetSel($hRichEdit, 0, -1, True)
    _GUICtrlRichEdit_SetCharBkColor($hRichEdit, 0xFFFFFF)

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

    If _RichEdit_GetText($hRE_RegExp) <> "" Then
    Local $sText = _RichEdit_GetText($hRichEdit), $iCounter = 0
    Global $bYellow = True

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

    For $i = 0 To UBound($aTmp) - 1
    $bYellow = Not $bYellow
    Local $iPos = StringInStr($sText, $aTmp[$i], 1) - 1
    _GUICtrlRichEdit_SetSel($hRichEdit, $iPos + $iCounter, $iPos + $iCounter + StringLen($aTmp[$i]), True)
    If $bYellow Then _GUICtrlRichEdit_SetCharBkColor($hRichEdit, 0xFFF000)
    If Not $bYellow Then _GUICtrlRichEdit_SetCharBkColor($hRichEdit, 0x80C0FF)
    $sText = StringTrimLeft($sText, $iPos + 1)

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

    $iCounter += $iPos + ($hRichEdit <> $hRE_Matches)
    Next
    EndIf
    _GUICtrlRichEdit_SetModified($hRichEdit, False)
    EndFunc ;==>__RichEdit_ColorViaRegExp

    [/autoit]