RichEdit Text unlöschbar

  • Wie der Titel schon sagt, will ich einen bestimmten Text in einem RichEdit unlöschbar machen.
    Nun komm ich aber nicht weiter.

    Ich hab die Hilfe durchforstet, und bin dabei auf diese beiden Funktionen gestoßen:

    [autoit]

    _GUICtrlRichEdit_SetEventMask() & _GUICtrlRichEdit_SetCharAttributes()

    [/autoit]


    Mit

    [autoit]

    _GUICtrlRichEdit_SetCharAttributes()

    [/autoit]

    kann man den Text auf Protect stellen.
    Jetzt kann man den Text jedoch immernoch löschen.

    Mit

    [autoit]

    _GUICtrlRichEdit_SetEventMask()

    [/autoit]

    kann man $ENM_PROTECTED auf das RichEdit-Controle registrieren, welches dann immer, wenn man einen geschützten Text löschen will, eine $EN_PROTECTED Benachrichtigung bekommt.

    Nun weiß ich nicht, wie ich die Nachricht abfragen soll, oder was ich tun muss, wenn er die Nachricht bekommt.

    Danke schonmal für eure Hilfe. :)

    MfG,
    H2112

    Edit:

    Lösung
    [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]

    Opt('MustDeclareVars', 1)

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

    Global $lblMsg, $hRichEdit, $hGui

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

    Main()

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

    Func Main()
    Local $iMsg, $btnNext, $iStep = 0
    $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, 60)
    $btnNext = GUICtrlCreateButton("Next", 270, 310, 40, 30)
    GUISetState()

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    _GuiCtrlRichEdit_SetText($hRichEdit, "Paragraph 1 ")
    _GuiCtrlRichEdit_SetEventMask($hRichEdit, $ENM_UPDATE)
    _GuiCtrlRichEdit_SetEventMask($hRichEdit, $ENM_PROTECTED)
    While True
    $iMsg = GUIGetMsg()
    Select
    Case $iMsg = $GUI_EVENT_CLOSE
    GUIDelete()
    Exit
    Case $iMsg = $btnNext
    $iStep += 1
    Switch $iStep
    Case 1
    _GuiCtrlRichEdit_SetSel($hRichEdit, 0, 2)
    _GuiCtrlRichEdit_SetCharAttributes($hRichEdit, "+un")
    Report("1. Two characters underlined")
    Case 2
    _GuiCtrlRichEdit_SetSel($hRichEdit, 1, 5)
    ;~ _GuiCtrlRichEdit_SetCharAttributes($hRichEdit, "+bo")
    _GuiCtrlRichEdit_SetCharAttributes($hRichEdit, "+pr")
    Report("2. Some characters protect")
    Case 3
    ; Stream all text to the Desktop so you can look at settings in Word
    _GuiCtrlRichEdit_Deselect($hRichEdit)
    _GuiCtrlRichEdit_StreamToFile($hRichEdit, @DesktopDir & "\gcre.rtf")
    GUICtrlSetState($btnNext, $GUI_DISABLE)
    EndSwitch
    EndSelect
    WEnd
    EndFunc ;==>Main

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

    Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
    #forceref $hWnd, $iMsg, $iWparam
    Local $iCode, $tNMHDR
    $tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
    $iCode = DllStructGetData($tNMHDR, "Code")
    Select
    Case $iCode = $EN_PROTECTED
    Return 1
    EndSelect
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func Report($sMsg)
    $sMsg = $sMsg & @CR & @CR & _GUICtrlRichEdit_GetCharAttributes($hRichEdit)
    GUICtrlSetData($lblMsg, $sMsg)
    ControlFocus($hRichEdit, "", "")
    EndFunc ;==>Report

    [/autoit]
    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

    2 Mal editiert, zuletzt von H2112 (16. Mai 2010 um 17:02)

  • Ich denke es wird auch andere unkopliziertere Lösungen geben um das Löschen eines Teiles eines RichEdit Feldes zu verhindern ^^

    mfg Ubuntu

  • Gefunden hab ich bis jetzt noch keine. :S

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Hallo H2112,

    ändere doch das Beispiel aus der Hilfe:

    Spoiler anzeigen
    [autoit]

    Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
    #forceref $iMsg, $iWparam
    Local $hWndFrom, $iCode, $tNMHDR, $tMsgFilter, $hMenu
    $tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hRichEdit
    Select
    Case $iCode = $EN_MSGFILTER
    $tMsgFilter = DllStructCreate($tagEN_MSGFILTER, $iLparam)
    If DllStructGetData($tMsgFilter, "msg") = $WM_RBUTTONUP Then
    $hMenu = GUICtrlGetHandle($mnu)
    SetMenuTexts($hWndFrom, $hMenu)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $hWnd)
    EndIf
    Case $ENM_PROTECTED
    ;hier musst du dann die Eingaben sperren bzw. verwerfen
    EndSelect
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    mfg (Auto)Bert

  • Danke Autobert, jetzt hab ichs geschafft, dass ich die Nachricht abfange.

    Nun weiß ich jedoch nicht, wie ich verhindern soll, dass der Text gelöscht wird.

    Bisheriger Code
    [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]

    Opt('MustDeclareVars', 1)

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

    Global $lblMsg, $hRichEdit, $hGui

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

    Main()

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

    Func Main()
    Local $iMsg, $btnNext, $iStep = 0
    $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, 60)
    $btnNext = GUICtrlCreateButton("Next", 270, 310, 40, 30)
    GUISetState()

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    _GuiCtrlRichEdit_SetText($hRichEdit, "Paragraph 1 ")
    _GuiCtrlRichEdit_SetEventMask($hRichEdit, $ENM_PROTECTED)
    While True
    $iMsg = GUIGetMsg()
    Select
    Case $iMsg = $GUI_EVENT_CLOSE
    GUIDelete()
    Exit
    Case $iMsg = $btnNext
    $iStep += 1
    Switch $iStep
    Case 1
    _GuiCtrlRichEdit_SetSel($hRichEdit, 0, 2)
    _GuiCtrlRichEdit_SetCharAttributes($hRichEdit, "+un")
    Report("1. Two characters underlined")
    Case 2
    _GuiCtrlRichEdit_SetSel($hRichEdit, 1, 5)
    ;~ _GuiCtrlRichEdit_SetCharAttributes($hRichEdit, "+bo")
    _GuiCtrlRichEdit_SetCharAttributes($hRichEdit, "+pr")
    Report("2. Some characters protect")
    Case 3
    ; Stream all text to the Desktop so you can look at settings in Word
    _GuiCtrlRichEdit_Deselect($hRichEdit)
    _GuiCtrlRichEdit_StreamToFile($hRichEdit, @DesktopDir & "\gcre.rtf")
    GUICtrlSetState($btnNext, $GUI_DISABLE)
    EndSwitch
    EndSelect
    WEnd
    EndFunc ;==>Main

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

    Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
    #forceref $hWnd, $iMsg, $iWparam
    Local $iCode, $tNMHDR
    $tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
    $iCode = DllStructGetData($tNMHDR, "Code")
    Select
    Case $iCode = $EN_PROTECTED
    MsgBox(0, "", "")
    EndSelect
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func Report($sMsg)
    $sMsg = $sMsg & @CR & @CR & _GUICtrlRichEdit_GetCharAttributes($hRichEdit)
    GUICtrlSetData($lblMsg, $sMsg)
    ControlFocus($hRichEdit, "", "")
    EndFunc ;==>Report

    [/autoit]
    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Was ist dein Problem? ;(

    Das danach einfach nicht gefragt wurde :rolleyes:

    Wenn er sagt er will ein Rich edit ohne löschbaren Text dann ist ein Label doch etwas ein BISSCHEN anderes oder?
    (Aber bitte nicht falsch verstehen ist nicht böse gemeint ;) )

    mfg Ubuntu

  • Hallo 2112,

    geht ganz einfach:

    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]

    Opt('MustDeclareVars', 1)

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

    Global $lblMsg, $hRichEdit, $hGui

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

    Main()

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

    Func Main()
    Local $iMsg, $btnNext, $iStep = 0
    $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, 60)
    $btnNext = GUICtrlCreateButton("Next", 270, 310, 40, 30)
    GUISetState()

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    _GuiCtrlRichEdit_SetText($hRichEdit, "Paragraph 1 ")
    _GuiCtrlRichEdit_SetEventMask($hRichEdit, $ENM_PROTECTED)
    While True
    $iMsg = GUIGetMsg()
    Select
    Case $iMsg = $GUI_EVENT_CLOSE
    GUIDelete()
    Exit
    Case $iMsg = $btnNext
    $iStep += 1
    Switch $iStep
    Case 1
    _GuiCtrlRichEdit_SetSel($hRichEdit, 0, 2)
    _GuiCtrlRichEdit_SetCharAttributes($hRichEdit, "+un")
    Report("1. Two characters underlined")
    Case 2
    _GuiCtrlRichEdit_SetSel($hRichEdit, 1, 5)
    ;~ _GuiCtrlRichEdit_SetCharAttributes($hRichEdit, "+bo")
    _GuiCtrlRichEdit_SetCharAttributes($hRichEdit, "+pr")
    Report("2. Some characters protect")
    Case 3
    ; Stream all text to the Desktop so you can look at settings in Word
    _GuiCtrlRichEdit_Deselect($hRichEdit)
    _GuiCtrlRichEdit_StreamToFile($hRichEdit, @DesktopDir & "\gcre.rtf")
    GUICtrlSetState($btnNext, $GUI_DISABLE)
    EndSwitch
    EndSelect
    WEnd
    EndFunc ;==>Main

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

    Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
    #forceref $hWnd, $iMsg, $iWparam
    Local $iCode, $tNMHDR
    $tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
    $iCode = DllStructGetData($tNMHDR, "Code")
    Select
    Case $iCode = $EN_PROTECTED
    MsgBox(0, "", "")
    _GUICtrlRichEdit_SetReadOnly ($hRichEdit)
    case Else
    _GUICtrlRichEdit_SetReadOnly ($hRichEdit,False)
    EndSelect
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func Report($sMsg)
    $sMsg = $sMsg & @CR & @CR & _GUICtrlRichEdit_GetCharAttributes($hRichEdit)
    GUICtrlSetData($lblMsg, $sMsg)
    ControlFocus($hRichEdit, "", "")
    EndFunc ;==>Report

    [/autoit]

    ist aber afair das erste Mal das ich mich mit RichEdit beschäftige, sonst hätte ich es vorhin schon gepostet,

    Edit: zu früh gefreut klappt leider nicht immer (ca 40%) meistens wird dann das ganze RichEdit ReadOnly

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (16. Mai 2010 um 16:54)

  • Die WM_NOTIFY-Funktion braucht kein SetReadOnly ;) Das ist genug:

    Spoiler anzeigen
    [autoit]

    Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
    #forceref $hWnd, $iMsg, $iWparam
    Local $iCode, $tNMHDR
    $tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
    $iCode = DllStructGetData($tNMHDR, "Code")
    Select
    Case $iCode = $EN_PROTECTED
    ;Return 0 ; Löschen von geshützten Zeichen erlauben
    Return 1 ; Löschen verbieten
    case Else
    EndSelect
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]
  • Danke. :D
    Genau den selben Ansatz hatte ich auch, bin aber nicht auf das Case Else gekommen. ;)

    Edit: Das funktioniert irgendwie doch nicht. Jetzt wird der Text, der protect ist, zwar nicht mehr gelöscht, aber danach kann man alle anderen Buchstaben auch nicht mehr löschen. :(
    Edit2: Hab jetzt erst den Post von Progandy gesehen, Danke funktioniert! :D

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Wär schön wenn dus in die aktuelle version der Konsole einbauen könntest. ^^

    mfg Ubuntu

  • Hab ich vor. ;)

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%