Suchen (Input) mit RichEdit

  • Hallo leute,

    habe mal wieder eine Frage wegen RichEdit. Und zwar möchte ich gerne ein eigenes Suchdialog schreiben, nur funktioniert es irgendwie nicht, besser gesagt, ich möchte das er dann den gefundenen Zeichen markiert. Ich habe es im Event folgendermaßen geschrieben.

    Spoiler anzeigen
    [autoit]


    ...
    Case $gui_suchdialog

    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE, $gui_suchdialog)
    Case $button_suchen
    _GUICtrlRichEdit_FindText($edit, GUICtrlRead($input_suchen))
    EndSwitch
    ...

    [/autoit]

    Ich hoffe ihr könnt mir helfen. Ich bedanke mich jetzt schon mal. :)

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

  • Hmm also dein Code hilft ja nicht sonderlich viel weiter.. Aber wenn du nach dem Text suchst (=>_GuiCtrlRichEdit_FindText()) bekommst du doch die Postion des Wortes? Dann musst du nur noch die Position des Wortes + Wortlänge selektieren und bingo!

    Also:
    _GUICtrlRichEdit_SetSel($hWnd, $CharPos,$CharPos+$Length)

    Ja und du musst eben solange suchen, bis _GuiCtrlRichEdit_FindText() = -1 zurückgibt! ;)

  • Super, danke. Das hat anscheinend mit dem bisschen Quelltext doch gereicht, um zu helfen. :D

    Habe noch eine Frage nebenbei, sonst muss ich ja wieder ein Thema eröffnen.

    Wie kann ich die RichEditbox so einstellen, das wenn die Fenster größe verändert wird, auch die Editbox mit verändert wird? Ich habe es mit der GUIRegisterMsg() gemacht, aber es geht irgendwie nicht. Bitte um hilfe.

  • Bitte, ein Beispiel mit GUIRegisterMsg: (Kommentare lesen)

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIRichEdit.au3>

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

    Global $OLDPOSWINDOW
    Global Const $WM_EXITSIZEMOVE = 0x0232
    Global Const $tagMINMAXINFO = "int ptReserved[2]; int ptMaxSize[2]; int ptMaxPosition[2]; int ptMinTrackSize[2]; int ptMaxTrackSize[2];"

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

    $hGUI = GUICreate("Test", 400, 400,-1,-1,$GUI_SS_DEFAULT_GUI+$WS_THICKFRAME)

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

    $hRichEdit = _GUICtrlRichEdit_Create($hGUI, 10, 10, 300, 300)

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

    GUISetState()
    GUIRegisterMsg($WM_SIZE, "WM_SIZEPROC") ; Message für Größenänderungen
    GUIRegisterMsg($WM_EXITSIZEMOVE, "WM_SIZEPROC") ; Message nach der Größenändernung
    GUIRegisterMsg($WM_GETMINMAXINFO, "WM_SIZEPROC") ; Minimale Größe festlegen

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

    While 1

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

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch

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

    WEnd

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

    Func WM_SIZEPROC($hWnd, $uMsg, $wParam, $lParam)
    Switch $uMsg
    Case $WM_GETMINMAXINFO ; Die Fenstergröße abfragen, minimale Größe fürs verkleinern setzen
    Local $MinMax = DllStructCreate($tagMINMAXINFO, $lParam) ; DLLStruct auf den Pointer erstellen, zum bearbeiten der Werte
    DllStructSetData($MinMax, 4, 200, 1) ; Minimal 200 Pixel breit
    DllStructSetData($MinMax, 4, 150, 2) ; Minimal 150 Pixel hoch
    Case $WM_EXITSIZEMOVE ; nach dem ziehen
    $OLDPOSWINDOW = 0 ; die gespeicherte Größe löschen
    Case $WM_SIZE ; hier wird das RichEdit angepasst
    Local $PosNeuAr[2] = [BitAND($lParam,0xFFFF), BitAND(BitShift($lParam,16),0xFFFF)] ; Die Breite und Höhe des Fensters auslesen, Lo-und HiWord vom lparam.
    If IsArray($OLDPOSWINDOW) Then
    Local $ControlPos = ControlGetPos($hRichEdit,"","")
    ; Möglichkeit 1: absolute Größenändernung:
    ControlMove($hRichEdit,"","",$ControlPos[0],$ControlPos[1],$ControlPos[2]+$PosNeuAr[0]-$OLDPOSWINDOW[0],$ControlPos[3]+$PosNeuAr[1]-$OLDPOSWINDOW[1])
    ; Möglichkeit 2: relative Größenändernung (funktioniert nicht richtige)
    ;ControlMove($hRichEdit,"","",$ControlPos[0],$ControlPos[1],Int($ControlPos[2]*($PosNeuAr[0]/$OLDPOSWINDOW[0])),Int($ControlPos[3]*($PosNeuAr[1]/$OLDPOSWINDOW[1])))
    EndIf
    Global $OLDPOSWINDOW = $PosNeuAr ; Position für Neuberechnung speichern
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von progandy (6. Mai 2009 um 19:15)

  • Danke Progandy.

    Ich habe noch eine Frage und zwar, wenn ich das Suchdialog öffne und ein Wort eingebe das ich suche möchte, was ja funktioniert, nur das er kein Focus bzw. eine Markierung um das gesuche Wort legt, erst wenn ich das Suchdialog schließe erscheint diese. Habt ihr da vielleicht eine Lösung? Wäre echt nett, danke. :)

    Ich habe jetzt auch mal ein Beispiel-Script geschreiben, damit man das ganze besser mit verfolgen kann.

    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
    Global $gui_suchdialog, $input_suchen, $checkbox_gros_kleinschreibung, $button_suchen, $statusbar, $find_text, $find_text_len

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

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

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

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

    [/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]

    $item_suchdialog = GUICtrlCreateMenuItem("Suchen...", $bearbeiten)

    [/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][/autoit] [autoit]

    #Region Suchdialog =============================================================
    $gui_suchdialog = GUICreate("Suchen", 501, 125, 193, 125, $WS_SYSMENU)

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

    GUICtrlCreateLabel("Suchen nach:", 15, 13, 71, 17)
    $input_suchen = GUICtrlCreateInput("", 100, 10, 375, 21)

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

    $checkbox_gros_kleinschreibung = GUICtrlCreateCheckbox("Groß-/Kleinschreibung", 100, 43, 127, 17)

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

    $button_suchen = GUICtrlCreateButton("Suchen", 325, 40, 150, 25, 0)
    GUICtrlSetState($button_suchen, $GUI_DEFBUTTON)

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

    $statusbar = _GUICtrlStatusBar_Create($gui_suchdialog, -1, "Bereit")
    _GUICtrlStatusBar_SetMinHeight($statusbar, 20)
    #EndRegion Suchdialog =============================================================

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

    GUISetState(@SW_SHOW, $gui)

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

    While 1
    $Msg = GUIGetMsg(1)

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

    Switch $Msg[1]

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

    Case $gui

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

    Switch $Msg[0]
    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)
    Case $item_suchdialog
    GUISetState(@SW_SHOW, $gui_suchdialog)
    EndSwitch

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

    Case $gui_suchdialog

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

    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE, $gui_suchdialog)
    Case $button_suchen
    _suchdialog()
    EndSwitch
    EndSwitch
    WEnd

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

    Func _suchdialog()
    $find_text = _GUICtrlRichEdit_FindText($edit, GUICtrlRead($input_suchen))
    If $find_text <> -1 Then
    $find_text_len = StringLen(GUICtrlRead($input_suchen))
    _GUICtrlRichEdit_SetSel($edit, $find_text, $find_text + $find_text_len)
    _GUICtrlStatusBar_SetText($statusbar, "Suche erfolgreich, bitte Suchdialog schließen.", 0, 0)
    Else
    MsgBox(48, "Fehler", "Suche fehlgeschlagen.")
    _GUICtrlStatusBar_SetText($statusbar, "Suche fehlgeschlagen, bitte nocheinmal versuchen.", 0, 0)
    EndIf
    EndFunc

    [/autoit]

    6 Mal editiert, zuletzt von MehmeX (6. Mai 2009 um 18:59)

  • Hallo Mehmex,

    gibt es bei dieser Komponete eine Variable AllwaysShowSelected oder ähnlich? Mir ist aufgefallen, das man den Suchdialog nicht schliessen muss, allein das klicken auf die Hauptgui reicht schon aus, das die Selektion gezeigt wird (solange bis die Hauptgui wieder den Focus verliert). Allerdings ist mir auch aufgefallen, dass die Suche fehlschlägt, wenn man bereits Test selektiert hat (schein dann nur in der Selektion zu suchen).

    mfg (Auto)Bert

  • Zitat

    gibt es bei dieser Komponete eine Variable AllwaysShowSelected oder ähnlich?

    Wie meinst du das genau, wenn ich fragen darf. :huh: ^^

  • Hallo Mehmex,

    es gibt Steuerelemente, denen man als Stil Eigenschaften zuweisen kann, so zum Beispiel einem Treeview die Eigenschaft $TVS_SHOWSELALWAYS. Meine Frage war nun gibt es denn nicht etwas ähnliches bei GuiRichEdit,

    mfg (Auto)Bert

  • Aso, nein gibt es nicht, meines Wissen nach, denn ich habe in der GuiRichEdit.au3 gesucht und habe nichts danach gefunden.

    2 Mal editiert, zuletzt von MehmeX (6. Mai 2009 um 18:59)

  • WinActivate("Test")?
    Und damit dein Suchfenster trotzdem immer OnTop bleibt gibts ja $WS_EX_TOPMOST bzw WinSetOnTop..

  • Habe es auch gerade so versucht :), so klappt es zwar schon aber sobald das Fenster (Hauptfenster) den Focus verliert, wird die Markierung nicht mehr angezeigt.

    EDIT: Habe es gelöst, in dem ich "$ES_NOHIDESEL" als Style bei der Edit benutzt habe.

    3 Mal editiert, zuletzt von MehmeX (11. Mai 2009 um 21:10)

  • @progandy, nochmal zu deinem GUIRegisterMsg(). Könnest du auch zu jeder Funktion ein Kommentar (Beschreibung) dazu schreiben? Das wäre hilfreich denn so kapiere ich die Funktionsweise nicht. :)

    Nochmals danke, es funktioniert einwandfrei. :)

    Einmal editiert, zuletzt von MehmeX (6. Mai 2009 um 19:08)

  • Danke Progandy. :)

    Was mir aber aufgefallen ist, durch die Funktion $WM_SIZE, geht das Editfenster immer nach dem öffnen der Suchdialog weg.

    EDIT: Ich habe es jetzt so geschrieben.

    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
    Global $gui_suchdialog, $input_suchen, $checkbox_gros_kleinschreibung, $button_suchen, $statusbar, $find_text, $find_text_len, $old_win_get_pos
    Global $window_maximize = False

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

    #Region Test =============================================================
    ; Hauptfenster
    $gui = GUICreate("Test", 500, 400, -1, -1, $WS_MINIMIZEBOX+$WS_MAXIMIZEBOX)

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

    $old_win_get_pos = WinGetPos("Test", "")

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

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

    [/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]

    $item_suchdialog = GUICtrlCreateMenuItem("Suchen...", $bearbeiten)

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

    ; Edit
    $edit = _GuiCtrlRichEdit_Create($gui, "", 5, 5, 485, 345, $ES_MULTILINE+$WS_VSCROLL+$ES_AUTOVSCROLL)
    #EndRegion Test =============================================================

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

    #Region Suchdialog =============================================================
    $gui_suchdialog = GUICreate("Suchen", 501, 125, 193, 125, $WS_SYSMENU)

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

    GUICtrlCreateLabel("Suchen nach:", 15, 13, 71, 17)
    $input_suchen = GUICtrlCreateInput("", 100, 10, 375, 21)

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

    $checkbox_gros_kleinschreibung = GUICtrlCreateCheckbox("Groß-/Kleinschreibung", 100, 43, 127, 17)

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

    $button_suchen = GUICtrlCreateButton("Suchen", 325, 40, 150, 25, 0)
    GUICtrlSetState($button_suchen, $GUI_DEFBUTTON)

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

    $statusbar = _GUICtrlStatusBar_Create($gui_suchdialog, -1, "Bereit")
    _GUICtrlStatusBar_SetMinHeight($statusbar, 20)
    #EndRegion Suchdialog =============================================================

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

    GUISetState(@SW_SHOW, $gui)

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

    While 1
    $Msg = GUIGetMsg(1)

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

    Switch $Msg[1]

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

    Case $gui

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

    Switch $Msg[0]
    Case $GUI_EVENT_CLOSE, $item_beenden
    Exit
    Case $GUI_EVENT_MAXIMIZE
    Local $win_get_pos = WinGetPos("Test", "")
    Local $control_get_pos = ControlGetPos($edit, "", "")
    ControlMove($edit, "", "", $control_get_pos[0], $control_get_pos[1], $control_get_pos[2]+$win_get_pos[2]-$old_win_get_pos[2], _
    $control_get_pos[3]+$win_get_pos[3]-$old_win_get_pos[3])
    Global $new_pos_maximize_breite = $win_get_pos[2]
    Global $new_pos_maximize_hoehe = $win_get_pos[3]
    $window_maximize = True
    Case $GUI_EVENT_MINIMIZE
    $window_maximize = False
    Case $GUI_EVENT_RESTORE
    If $window_maximize = True Then
    Local $win_get_pos = WinGetPos("Test", "")
    Local $control_get_pos = ControlGetPos($edit, "", "")
    ControlMove($edit, "", "", $control_get_pos[0], $control_get_pos[1], $control_get_pos[2]+$win_get_pos[2]-$new_pos_maximize_breite, _
    $control_get_pos[3]+$win_get_pos[3]-$new_pos_maximize_hoehe)
    EndIf
    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)
    Case $item_suchdialog
    GUISetState(@SW_SHOW, $gui_suchdialog)
    EndSwitch

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

    Case $gui_suchdialog

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

    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE, $gui_suchdialog)
    Case $button_suchen
    _suchdialog()
    EndSwitch
    EndSwitch
    WEnd

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

    Func _suchdialog()
    $find_text = _GUICtrlRichEdit_FindText($edit, GUICtrlRead($input_suchen))
    If $find_text <> -1 Then
    $find_text_len = StringLen(GUICtrlRead($input_suchen))
    _GUICtrlRichEdit_SetSel($edit, $find_text, $find_text + $find_text_len)
    _GUICtrlStatusBar_SetText($statusbar, "Suche erfolgreich, bitte Suchdialog schließen.", 0, 0)
    Else
    MsgBox(48, "Fehler", "Suche fehlgeschlagen.")
    _GUICtrlStatusBar_SetText($statusbar, "Suche fehlgeschlagen, bitte nocheinmal versuchen.", 0, 0)
    EndIf
    EndFunc

    [/autoit]

    3 Mal editiert, zuletzt von MehmeX (7. Mai 2009 um 00:13)

  • Hallo zusammen,

    ich hätte da noch eine Frage und zwar geht das irgendwie nicht, wenn ich das nächste - gleiche Wort - suchen möchte inkl. Such Richtung.

    Edit: Hat sich erledigt.

    2 Mal editiert, zuletzt von MehmeX (17. Mai 2009 um 16:28)