File Counter

  • Hallo Leute
    ich hab mal wieder eine Frage.
    Ich möchte einen TextReader schreiben und dazu möchte ich an der Linken Seite einen Balken anzeigen, der die momentane Zeile der Text Datei anzeigt.
    Meine Frage wie kännte man das am Besten lösen. GDI+ oder doch n zweite EditBox oder gibt es hierfür schon eine Lösung, wenn ja tuts mir leid habs net gefunden.

    Im Anhang habe ich mal ein Bild wie es ausehen sollte.

    http://img11.imageshack.us/i/unbenanntyi.png/

    Danke schon mal im vorraus

  • und wieso dann FileCounter du meinst doch einen Zeilenzähler?
    Wenn Du dann dort Dateien anzeigen willst bekommst du ja mit file2array schnell die Anzahl raus.

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    • Offizieller Beitrag

    Ich denke mal, Du meinst sowas:

    Spoiler anzeigen
    [autoit]


    #include <EditConstants.au3>
    #include <GuiEdit.au3>
    #include <Timers.au3>
    #include <WindowsConstants.au3>

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

    $hGui = GUICreate('Textreader v0.1', 800, 600)
    GUISetBkColor(0x888888)
    GUISetFont(10, 400, 0, 'Courier New')
    $hLineNumber = GUICtrlCreateEdit('', 10, 10, 50, 580, BitOR($ES_READONLY, $ES_RIGHT))
    GUICtrlSetBkColor(-1, 0xDDDDDD)
    $hTextReader = GUICtrlCreateEdit('', 60, 10, 730, 580, BitOR($ES_READONLY, $WS_VSCROLL, $WS_HSCROLL))
    GUICtrlSetBkColor(-1, 0xFFFFDD)
    GUICtrlSetLimit(-1, 99999999)

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

    $sText = FileRead(StringRegExpReplace(@AutoItExe, '(.+\\).+', '$1') & 'Examples\GUI\Advanced\msgboxwizard.au3') ; irgendeinen Text laden
    GUICtrlSetData($hTextReader, $sText) ; und im Editfeld anzeigen

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

    $iOldLine = -1
    GUISetState()

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

    _Timer_SetTimer($hGui, 50, '_EditSetNumber')
    Do
    Until GUIGetMsg() = -3
    _Timer_KillAllTimers($hGui)
    Exit

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

    Func _EditSetNumber($hWnd, $Msg, $iIDTimer, $dwTime)
    #forceref $hWnd, $Msg, $iIDTimer, $dwTime
    Local $iFirstVisibleLine, $sNumber = ''
    $iFirstVisibleLine = _GUICtrlEdit_GetFirstVisibleLine($hTextReader)
    If $iFirstVisibleLine = 0 Then $iFirstVisibleLine = 1
    If $iFirstVisibleLine = $iOldLine Then Return
    $iOldLine = $iFirstVisibleLine
    For $i = 0 To 34
    $sNumber &= $iFirstVisibleLine + $i & @CRLF
    Next
    GUICtrlSetData($hLineNumber, $sNumber)
    ControlFocus($hGui, '', $hTextReader)
    EndFunc

    [/autoit]
  • Ich hätte es auch so gemacht wie Oscar, nur eben ohne Timer.

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>

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

    GUICreate("Editor", 500, 500)
    GUIRegisterMsg(0x0111, "_WM_COMMAND")

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

    Global $LineCounter = GUICtrlCreateEdit("1", 0, 0, 40, 500, 0x6)
    GUICtrlSetBkColor(-1, 0xCCCCCC)

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

    Global $nEdit = GUICtrlCreateEdit("", 40, 0, 460, 500)
    GUICtrlSetLimit(-1, 99999999)

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

    GUISetState()

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

    Do
    Until GUIGetMsg() = -3

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

    Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    $nNotifyCode = BitShift($wParam, 16)
    $nID = BitAND($wParam, 0x0000FFFF)
    $hCtrl = $lParam
    Switch $nID
    Case $LineCounter
    GUICtrlSetState($nEdit, $GUI_FOCUS)
    Case $nEdit
    Local $nline = GUICtrlSendMsg($nEdit, $EM_GETLINECOUNT, -1, 0)
    Local $sCounter
    For $i = GUICtrlSendMsg($nEdit, $EM_GETFIRSTVISIBLELINE, 0, 0) + 1 To $nline
    $sCounter &= $i & @CRLF
    Next
    If GUICtrlRead($LineCounter) <> $sCounter Then GUICtrlSetData($LineCounter, $sCounter)
    EndSwitch
    EndFunc ;==>_WM_COMMAND

    [/autoit]
    • Offizieller Beitrag

    funkey: Ich hatte auch erst mit GuiRegisterMsg getestet, aber die Nummern werden nicht während des scrollens generiert. Das funktioniert nur mit der Timer-UDF.

    Edit: Dein Skript mit Inhalt:

    Spoiler anzeigen
    [autoit]


    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>

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

    GUICreate("Editor", 500, 500)
    GUIRegisterMsg(0x0111, "_WM_COMMAND")

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

    Global $LineCounter = GUICtrlCreateEdit("1", 0, 0, 40, 500, 0x6)
    GUICtrlSetBkColor(-1, 0xCCCCCC)

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

    Global $nEdit = GUICtrlCreateEdit("", 40, 0, 460, 500)
    GUICtrlSetLimit(-1, 99999999)
    $sText = FileRead(StringRegExpReplace(@AutoItExe, '(.+\\).+', '$1') & 'Examples\GUI\Advanced\msgboxwizard.au3') ; irgendeinen Text laden
    GUICtrlSetData($nEdit, $sText) ; und im Editfeld anzeigen

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

    GUISetState()

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

    Do
    Until GUIGetMsg() = -3

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

    Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    $nNotifyCode = BitShift($wParam, 16)
    $nID = BitAND($wParam, 0x0000FFFF)
    $hCtrl = $lParam
    Switch $nID
    Case $LineCounter
    GUICtrlSetState($nEdit, $GUI_FOCUS)
    Case $nEdit
    Local $nline = GUICtrlSendMsg($nEdit, $EM_GETLINECOUNT, -1, 0)
    Local $sCounter
    For $i = GUICtrlSendMsg($nEdit, $EM_GETFIRSTVISIBLELINE, 0, 0) + 1 To $nline
    $sCounter &= $i & @CRLF
    Next
    If GUICtrlRead($LineCounter) <> $sCounter Then GUICtrlSetData($LineCounter, $sCounter)
    EndSwitch
    EndFunc ;==>_WM_COMMAND

    [/autoit]
  • Du hast recht Oscar. Dann muss man eben schwerere Geschütze auffahren und eine Richedit nehmen, da EM_SETEVENTMASK nur für Richedit vorgesehen ist.


    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GuiRichEdit.au3>
    #include <RichEditConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiRichEdit.au3>

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

    Global $hGui = GUICreate("Editor", 500, 500)
    GUIRegisterMsg(0x0111, "_WM_COMMAND")

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

    Global $LineCounter = GUICtrlCreateEdit("1", 0, 0, 40, 500, 0x6)
    Global $hLineCounter = GUICtrlGetHandle(-1)
    GUICtrlSetBkColor(-1, 0xCCCCCC)

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

    Global $hEdit = _GUICtrlRichEdit_Create($hGui, "", 40, 0, 460, 500, BitOR($ES_MULTILINE, $WS_VSCROLL, $WS_HSCROLL))
    _GUICtrlRichEdit_SetEventMask($hEdit, BitOR($ENM_SCROLL, $ENM_SCROLLEVENTS))

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

    GUISetState(@SW_SHOW)

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

    Do
    Until GUIGetMsg() = -3
    _GUICtrlRichEdit_Destroy($hEdit)

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

    Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    $nNotifyCode = BitShift($wParam, 16)
    $nID = BitAND($wParam, 0x0000FFFF)
    $hCtrl = $lParam
    Switch $hCtrl
    Case $hLineCounter
    ;~ GUICtrlSetState($nEdit, $GUI_FOCUS)
    Case $hEdit
    Local $nline = _GUICtrlRichEdit_GetLineCount($hEdit)
    Local $sCounter
    For $i = _GUICtrlRichEdit_GetNumberOfFirstVisibleLine($hEdit) To $nline
    $sCounter &= $i & @CRLF
    Next
    If GUICtrlRead($LineCounter) <> $sCounter Then GUICtrlSetData($LineCounter, $sCounter)
    EndSwitch
    EndFunc ;==>_WM_COMMAND

    [/autoit]

    Edit: _GUICtrlRichEdit_SetEventMask wird für den Scroll-Event anscheinend gar nicht gebraucht!? Es funktioniert auch so.