Edit Multiline - Zeile auslesen

    • Offizieller Beitrag

    Hi,
    beim Arbeiten mit dem Editcontrol ist mir folgendes aufgefallen:
    Da keine Funktion zur direkten Ausgabe einer Zeile existiert muß man einen anderen Weg wählen.
    - Mit $index = _GUICtrlEditGetSel($Edit1) wird der Index des markierten Bereiches bzw. der Cursorposition ermittelt.
    - Mit $lineindex = _GUICtrlEditLineFromChar($Edit1, $index[2]) wird der (Null-basierte) Index der Zeile ermittelt die den ZeichenIndex enthält.
    - Mit $line = _GUICtrlEditGetLine($Edit1, $lineindex+1) wird der Text der Zeile zurückgegeben, wobei diese Funktion einen 1-basierten Index verlangt.

    Das Problem:
    Egal welche Auswahl als erstes getroffen wird - es wird immer ein falsches Ergebnis zurückgegeben.
    Bei weiteren Lesevorgängen stimmt es dann.
    Aber wenn der letzte Eintrag per Markierung ausgelesen wird klappt dies nicht. Stelle ich den Cursor jedoch in die letzte Zeile ohne zu markieren funktioniert es.

    Vielleicht hat ja jemand schonmal damit gekämpft.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #Include <GuiEdit.au3>

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

    Opt("GUIOnEventMode", 1)
    Global $index, $lineindex, $line

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

    $Form1 = GUICreate("Test Edit Zeilen lesen", 325, 421, 193, 115)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    $Edit1 = GUICtrlCreateEdit("", 12, 12, 301, 161, -1, $ES_MULTILINE)
    GUICtrlSetData(-1, "Das ist Zeile #1" & @CRLF & _
    "Das ist Zeile #2" & @CRLF & _
    "Das ist Zeile #3" & @CRLF & _
    "Das ist Zeile #4" & @CRLF & _
    "Das ist Zeile #5" & @CRLF & _
    "Das ist Zeile #6")
    $bRead = GUICtrlCreateButton("Zeile lesen", 216, 381, 100, 30, 0)
    GUICtrlSetOnEvent(-1, "bReadClick")
    $InIndexChr = GUICtrlCreateInput("", 232, 201, 80, 21)
    $Label1 = GUICtrlCreateLabel("_GUICtrlEditGetSel( )", 12, 184, 103, 17)
    $Label2 = GUICtrlCreateLabel("Zeichen-Index markierter Bereich Start/Ende:", 12, 204, 218, 17)
    $Label3 = GUICtrlCreateLabel("_GUICtrlEditLineFromChar( )", 12, 230, 136, 17)
    $Label4 = GUICtrlCreateLabel("ZeilenIndex in der Zeichen-Index enthalten:", 12, 252, 209, 17)
    $InIndexZeile = GUICtrlCreateInput("", 232, 249, 80, 21)
    $Label5 = GUICtrlCreateLabel("_GUICtrlEditGetLine( )", 12, 277, 108, 17)
    $Label6 = GUICtrlCreateLabel("Text der Zeile mit ZeilenIndex:", 12, 296, 146, 17)
    $InText = GUICtrlCreateInput("", 164, 293, 148, 21)
    $InInfo = GUICtrlCreateInput("Cursor in eine Zeile stellen oder einen Textbereich markieren.", 12, 352, _
    301, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    WEnd

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

    Func bReadClick()
    $index = _GUICtrlEditGetSel($Edit1)
    GUICtrlSetData($InIndexChr, $index[1] & ' / ' & $index[2])
    $lineindex = _GUICtrlEditLineFromChar($Edit1, $index[2]) ; Index ist 0-basiert
    GUICtrlSetData($InIndexZeile, $lineindex)
    $line = _GUICtrlEditGetLine($Edit1, $lineindex+1) ; Line verlangt 1-basierten Index
    GUICtrlSetData($InText, $line)
    EndFunc

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

    Func Form1Close()
    Exit
    EndFunc

    [/autoit]

    Edit:
    Ich habe nun eine voll funktionierende Lösung gefunden.
    Wie es aussieht, sind die UDF zum Edit-Ctrl nicht ganz ausgereift.
    Habe jetzt komplett umgestellt auf ControlCommand und damit funktioniert es tadellos.
    Spare ich mir auch das Include ;)

    Spoiler anzeigen
    [autoit]

    Func bReadClick()
    $lineindex = ControlCommand($Form1, '', $Edit1, "GetCurrentLine", "")
    GUICtrlSetData($InIndexLine, $lineindex)
    $line = ControlCommand($Form1, '', $Edit1, "GetLine", $lineindex)
    GUICtrlSetData($InText, $line)
    EndFunc

    [/autoit]