Syntaxhervorhebung

  • Hallo Leute,

    weiß einer von euch wie man in einem Editfenster, besser gesagt in einem RichEditfenster eine Syntax-Highlighting-Funktion einbaut? Damit meine ich, bestimmte Wörter mit einem Style hervorheben.
    Ich habe schon im Forum nachgeschaut bin auch an was gestoßen mit "SciLexer.dll" oder so was ähnlichen. Gibt es dafür auch was anderes bzw. ist es auch anderst möglich? Wäre echt super wenn ihr mir helfen könntet.

    Edit: Ich habe mal noch ein Script hochgeladen, falls es als Beispiel benötigt wird.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiRichEdit.au3>
    #include <GUIStatusBar.au3>
    #NoTrayIcon

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

    Global $gui, $datei, $bearbeiten, $item_suchdialog, $item_oeffnen, $item_save_as, $item_beenden, $edit, $Msg, $open, $read, $save

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

    #Region Test =============================================================
    ; Hauptfenster
    $gui = GUICreate("Test", 500, 400)

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

    ; Menüleiste
    $datei = GUICtrlCreateMenu("Datei")

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

    $item_oeffnen = GUICtrlCreateMenuItem("Öffnen...", $datei)
    $item_save_as = GUICtrlCreateMenuItem("Speichern unter...", $datei)
    GUICtrlCreateMenuItem("", $datei, -1) ; Hier wird ein Linie durchgezogen
    $item_beenden = GUICtrlCreateMenuItem("Beenden", $datei)

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

    ; Edit
    $edit = _GuiCtrlRichEdit_Create($gui, "", 10, 10, 480, 360, $ES_MULTILINE+$WS_VSCROLL+$ES_AUTOVSCROLL)
    #EndRegion Test =============================================================

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

    GUISetState(@SW_SHOW, $gui)

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

    While 1
    $Msg = GUIGetMsg()

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

    Switch $Msg
    Case $GUI_EVENT_CLOSE, $item_beenden
    Exit
    Case $item_oeffnen
    $open = FileOpenDialog("Öffnen...", @DesktopDir, "Rich-Text-Format (*.rtf)|Textdokument (*.txt)")
    _GuiCtrlRichEdit_StreamFromFile($edit, $open)
    Case $item_save_as
    $save = FileSaveDialog ( "Speichern unter...", @DesktopDir, "Rich-Text-Format (*.rtf)|Textdokument (*.txt)")
    _GuiCtrlRichEdit_StreamToFile($edit, $save)
    EndSwitch
    WEnd

    [/autoit]

    5 Mal editiert, zuletzt von MehmeX (10. Mai 2009 um 23:00)

  • Könntest du ihr mir ein kleines Beispiel machen wie das funktioniert, denn ich habe schon überall geschaut, aber nicht hilfreiches gefunden. Ich bedanke mich schon im vorraus.

  • Danke, Progandy. Das ist aber ganz schön aufwendig.
    So viel brauche ich eigentlich garnicht, ich möchte nur bestimmte Wörter in Farbe hervorheben, dass reicht mir momentan.

  • Argh ärgerlich! Ich hatte mir auch mal für 1 Projekt Scite im RichEdit nachgebaut... wenn ich gewusst hätte das es schon sowas cooles gibt :wacko:

  • Bei mir kommt bei dem Beispiel immer ein Fehler inder Extension

    Local $ret = DllCall($SCI_user32, "long", "SendMessageA", "long", $Sci, "int", $SCI_GETCURLINE, "int", $iLen, "ptr", DllStructGetPtr($sBuf))

  • Bei mir kam der Fehler auch, aber ich habe es einfach mal ignoriert, denn ich wollte es ja nur testen.

    Weiß niemand wie man eine einfache Hervorhebung bestimmter Wörter einbaut? Ohne Schnick-Schnack, wie z.B. Wort/Funktionvorschläge, bevor man das Wort ausgeschrieben hat. Danke, im vorraus.

  • Ehm wo ist das problem? mach dir ne liste mit allen wörtern die gleich gehighlited werden sollen und frag dein RichEdit bei jeder eingabe ab ob es matches mit der liste gibt..

  • Ja weiß ich, aber wie stellst du dir das vor? Also ich meine damit, mit welcher Funktion und wie soll es am einfachsten geschrieben werden?

    Ich versuche es mit $WM_COMMAND und dann mit _GUICtrlRichEdit_FindText() etc., aber es klappt irgendwie nicht bzw. ich bekomme es nicht hin. Hmm ...?!?!

    Einmal editiert, zuletzt von MehmeX (11. Mai 2009 um 22:54)

  • Hmm ..., danke, kann mir aber einer eine Starthilfe geben, denn ich weiß nicht wie ich anfangen soll. Ein Beispielsript ist ja oben von mir gepostet worden.
    Wäre echt super nett, wenn ihr mir helfen könntet. Danke!

  • deine ini könnte so aussehen:

    Code
    [WORDS]
    wort1=kursiv
    wort2=fett
    wort3=unterstrichen

    du frägst nun ab, ob ein in das edit-feld eingegebene wort mit einem der keys der ini übereinstimmt und erhälst dann über das value deine entsprechende formatierung, welche du dann auf das wort im editfeld anwendest

    hoffe das war verständlich ;)

  • @oliverh ich glaube Mehmex hat die Idee schon beim ersten mal verstanden.. seine Frage war, wie man feststellen, ob ob etwas ins RichEdit eingegeben wurde um das Highlighting durchzuführen...
    Beim ersten Blick in die UDF sind mir ein paar hilfreich aussehende Messages aufgefallen wie zb $ENM_CHANGE..
    Glaube progandy hatte auch in seinem Beispiel im englischen Forum etwas mit GuiRegisterMsg .. gucks mir später mal genauer an!

  • Ich bin auch dabei sowas zu machen aber leider verstehe ich auch nichts da es bei mir keine wörter sind sondern nur von bestimtmen zeichen zu einem anderen wie von "<" zu "/>" und ich komme auch nicht weiter

  • Hmm so gehts einigermaßen.. sollte aber noch ne bessere Lösung geben!

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <GuiRichEditPA.au3>
    #include <GuiMENU.au3>
    #include <GuiEdit.au3>

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

    Global $h_RichEdit, $RichMENU[10]

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

    $hgui = GUICreate("Rich Edit Example", 500, 500, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))
    $h_RichEdit = _GUICtrlRichEdit_Create($hgui, 10, 10, 480, 420, BitOR($ES_WANTRETURN, $WS_HSCROLL, $ES_SUNKEN, $ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    $lResult = _SendMessage($h_RichEdit, $EM_SETEVENTMASK, 0, $ENM_KEYEVENTS)

    $button = GUICtrlCreateButton("Exit", 10, 460, 480, 25)
    GUISetState(@SW_SHOW)
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $button
    Exit
    EndSelect
    WEnd

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $h_RichEdit
    Select
    Case $iCode = $EN_MSGFILTER
    Local $tMsgFilter = DllStructCreate($tagEN_MSGFILTER, $ilParam)
    If DllStructGetData($tMsgFilter, 4) = $WM_KEYDOWN Then
    msgBox(0,"Info","Deine HighLight-Funktion!")
    EndIf
    EndSelect
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]
  • WArum kommt den hier immer ein programm reagiert nicht mehr

    Spoiler anzeigen
    [autoit]

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $h_RichEdit
    Select
    Case $iCode = $EN_MSGFILTER
    Local $tMsgFilter = DllStructCreate($tagEN_MSGFILTER, $ilParam)
    If DllStructGetData($tMsgFilter, 4) = $WM_KEYDOWN Then
    $read = FileRead("html.api")
    $text = _GUICtrlRichEdit_FindTextEx($h_RichEdit,"<" & $read & ">")
    MsgBox(0,"",$text)
    EndIf
    EndSelect
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]