Standard GUI Scrollbar machen

  • Hallo zusammen,

    ich würde gerne meine Standard Gui Scrollbar machen, da ich nur eine benutze soll es eben die Haupt Gui sein

    Mit dem Tool selbst erstelle und bearbeite ich Datenbanken von einem unserer Tools. Mittlerweile ist es aber so, das die Datensätze immer mehr werden, weshalb die Gui scrollbar werden muss, damit ich auch die Datensätze weiter unten eintragen und sehen / bearbeiten kann.

    Ich habe sowohl den Code des Tool´s als auch eine Test Datenbank als Anhang beigefügt welche ich als rar speichern musste, da die Endung Data hier nicht erlaubt ist.
    In der Testdatenbank kann man wenn man diese mit dem Tool öffnet nur bis Zeile 33 lesen (steht jetzt kuilöp*), es sind aber eigentlich 35 denn löp und * sind in der Datenbank selber zwei voneinander getrennte Zeilen. Das Tool schiebt diese aber zusammen, da ja kein scrollen möglich ist.

    Ich habe mir hierzu auch schon so einiges angeschaut, unter anderem auch:
    https://autoit.de/index.php?page…chen#post162431


    deswegen habe ich auch im Code die #include <GuiScroll.au3> , aber ich habe es einfach nicht hin bekommen dies umzubauen auf mein Script.
    In dem anderen Thema wird ja auch mit mehreren Gui´s gearbeitet was ja hier nicht der Fall ist.
    Falls das wer umgebaut bekommen würde währe das natürlich auch super.

    Ich hoffe mir kann wer bei diesem Problem weiter helfen.

    Mfg Ghostleader

  • Hallo Oscar,

    es geht nicht nur um anzeigen, sondern auch um bearbeiten ( Neue Einträge machen) und neue Datenbanken erstellen und befüllen.
    Bin mir nicht sicher, aber ich glaube nicht das dies mit einer Listview möglich ist oder doch?

    Mfg

  • Hallo BugFix,

    ich sage dir ehrlich, ich weis nicht wie du das gerade meinst denn ich bin da leider nicht so bewandert wie du  :wacko: .

    Mir würde es echt schon reichen wenn die Gui Scrollbar ist, nur das ich eben leider nicht weis wie  ;(. 


    Mfg

  • Hallo zusammen,

    Oscar
    Ich habe mir das mal angeschaut und muss sagen ist ein schönes Script und vielleicht auch einbaubar bzw. habe ich schon ne Idee für ein anderes Tool, wo das echt super hilft.



    Aber ich habe mich nun doch zu einer (GUI n GUI) Variante entschieden, da diese denke ich hier einfacher einzubringen ist und besser aussieht.

    Hier nun alles was ich dazu gefunden habe.
    Das Script was damit geht:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiScroll.au3>

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

    ;~ Global Const $WM_MOUSEWHEEL = 0x020A

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

    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
    GUIRegisterMsg($WM_MOUSEWHEEL, "_Mausrad")

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

    Dim $idRadio2[100]
    #Region ### START Koda GUI section ### Form=

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

    $Form1 = GUICreate("Form1", 441, 441, 508, 269)
    $hGroup2 = GUICreate("",170,170,235,25,BitOR($WS_POPUP, $WS_BORDER, $WS_GROUP, $WS_VSCROLL, $WS_CLIPSIBLINGS),$WS_EX_MDICHILD,$Form1)
    for $i = 0 to 0
    $idRadio2[$i] = GUICtrlCreateInput("Input " & $i, 5, $i*25, 60, 18)
    Next
    GUISetState(@SW_SHOW)
    GUISwitch($Form1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Scrollbar_Create($hGroup2, $SB_VERT, $i*1)
    Scrollbar_Step(20, $hGroup2, $SB_VERT)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func _Mausrad($hWnd, $Msg, $wParam)
    #forceref $Msg, $wParam

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

    If $wParam == "0x00780000" Then _Bild_rauf()

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

    If $wParam == "0xFF880000" Then _Bild_runter()

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

    EndFunc

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

    Func _Bild_runter()

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

    for $i = 0 To 4 Step 1
    WM_VSCROLL($hGroup2, 0x0, 0x00000001, 0) ;1 mal kurz nach oben Scrollen - selber Effekt wie auf den Pfeil klicken
    Next

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

    EndFunc

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

    Func _Bild_rauf()

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

    for $i = 0 To 4 Step 1
    WM_VSCROLL($hGroup2, 0x0, 0x00000000, 0) ;1 mal kurz nach unten Scrollen - selber Effekt wie auf den Pfeil klicken
    Next

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

    EndFunc

    [/autoit]


    Die dazugehörige GuiScroll.au3

    Spoiler anzeigen
    [autoit]

    #cs http://www.autoit.de/index.php?page…1092#post161092
    Functions:
    Scrollbar_Create($hWnd, $iBar, $iMax)
    Scrollbar_Scroll($hWnd, $iBar, $iPos)
    Scrollbar_GetPos($hWnd, $iBar)
    Scrollbar_Step($iStep, $hWnd=0, $iBar=0)
    #CE

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

    #Include <GuiScrollBars.au3>
    #include<GuiconstantsEx.au3>
    #include<WindowsConstants.au3>
    #include <ScrollBarConstants.au3>
    Global $SCROLL_AMOUNTS[1][3]
    $SCROLL_AMOUNTS[0][0] = 1
    func Scrollbar_Create($hWnd, $iBar, $iMax)

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

    Local $Size = WinGetClientSize($hWnd)

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

    If $iBar = $SB_HORZ Then
    $Size = $Size[0]
    ElseIf $iBar = $SB_VERT Then
    $Size = $Size[1]
    Else
    Return 0
    EndIf

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

    ReDim $SCROLL_AMOUNTS[UBound($SCROLL_AMOUNTS)+1][3]
    $SCROLL_AMOUNTS[UBound($SCROLL_AMOUNTS)-1][0] = $hWnd
    $SCROLL_AMOUNTS[UBound($SCROLL_AMOUNTS)-1][1] = $iBar
    $SCROLL_AMOUNTS[UBound($SCROLL_AMOUNTS)-1][2] = $SCROLL_AMOUNTS[0][0]

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

    _GUIScrollBars_EnableScrollBar($hWnd, $iBar)
    _GUIScrollBars_SetScrollRange($hWnd, $iBar, 0,$iMax-1)
    _GUIScrollBars_SetScrollInfoPage($hWnd, $iBar, $Size)

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

    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
    GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL")

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

    Return $iMax

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

    EndFunc
    Func Scrollbar_GetPos($hWnd, $iBar)

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

    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $iBar)

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

    Return DllStructGetData($tSCROLLINFO, "nPos")

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

    EndFunc
    Func Scrollbar_Scroll($hWnd, $iBar, $iPos)

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

    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $iBar)

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

    $iCurrentPos = DllStructGetData($tSCROLLINFO, "nPos")

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

    DllStructSetData($tSCROLLINFO, "nPos", $iPos)
    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $iBar, $tSCROLLINFO)

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

    If $iBar = $SB_VERT Then

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

    $iRound = 0

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

    for $i = 1 to UBound($SCROLL_AMOUNTS)-1
    If $SCROLL_AMOUNTS[$i][0] = $hWnd And $SCROLL_AMOUNTS[$i][1] = $SB_VERT Then
    $iRound = $SCROLL_AMOUNTS[$i][2]
    EndIf
    Next

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

    If Not $iRound Then Return 0

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

    _GUIScrollBars_ScrollWindow($hWnd, 0, Round(($iCurrentPos-$iPos)/$iRound)*$iRound)
    ElseIf $iBar = $SB_HORZ Then

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

    $iRound = 0

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

    for $i = 1 to UBound($SCROLL_AMOUNTS)-1
    If $SCROLL_AMOUNTS[$i][0] = $hWnd And $SCROLL_AMOUNTS[$i][1] = $SB_HORZ Then
    $iRound = $SCROLL_AMOUNTS[$i][2]
    EndIf
    Next

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

    If Not $iRound Then Return 0

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

    _GUIScrollBars_ScrollWindow($hWnd, Round(($iCurrentPos-$iPos)/$iRound)*$iRound, 0)
    Else
    Return 0
    EndIf

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

    Return 1

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

    EndFunc
    Func Scrollbar_Step($iStep, $hWnd=0, $iBar=0)

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

    If not $hWnd or Not $iBar Then

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

    $SCROLL_AMOUNTS[0][0] = $iStep
    Return 1

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

    EndIf

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

    $iID = 0

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

    for $i = 1 to UBound($SCROLL_AMOUNTS)-1
    If $SCROLL_AMOUNTS[$i][0] = $hWnd And $SCROLL_AMOUNTS[$i][1] = $iBar Then
    $iID = $i
    ExitLoop
    EndIf
    Next

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

    If Not $iID Then Return 0

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

    $SCROLL_AMOUNTS[$iID][2] = $iStep

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

    Return 1

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

    EndFunc
    Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)

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

    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $yChar, $yPos
    Local $Min, $Max, $Page, $Pos, $TrackPos
    ; Get all the vertial scroll bar information
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    ; Save the position for comparison later on
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $Pos = $yPos
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")

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

    $iRound = 0

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

    for $i = 1 to UBound($SCROLL_AMOUNTS)-1
    If $SCROLL_AMOUNTS[$i][0] = $hWnd And $SCROLL_AMOUNTS[$i][1] = $SB_VERT Then
    $iRound = $SCROLL_AMOUNTS[$i][2]
    EndIf
    Next

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

    if Not $iRound Then Return $GUI_RUNDEFMSG

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

    Switch $nScrollCode
    Case $SB_TOP ; user clicked the HOME keyboard key
    DllStructSetData($tSCROLLINFO, "nPos", $Min)
    Case $SB_BOTTOM ; user clicked the END keyboard key
    DllStructSetData($tSCROLLINFO, "nPos", $Max)
    Case $SB_LINEUP ; user clicked the top arrow
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $iRound)
    Case $SB_LINEDOWN ; user clicked the bottom arrow
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $iRound)
    Case $SB_PAGEUP ; user clicked the scroll bar shaft above the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
    Case $SB_PAGEDOWN ; user clicked the scroll bar shaft below the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
    Case $SB_THUMBTRACK ; user dragged the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", Round($TrackPos/$iRound)*$iRound)
    EndSwitch

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

    ;~ // Set the position and then retrieve it. Due to adjustments
    ;~ // by Windows it may not be the same as the value set.
    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    ;// If the position has changed, scroll the window and update it
    $Pos = DllStructGetData($tSCROLLINFO, "nPos")

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

    If ($Pos <> $yPos) Then
    _GUIScrollBars_ScrollWindow($hWnd, 0, $yPos - $Pos)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_VSCROLL
    Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam)

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

    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $yChar, $yPos
    Local $Min, $Max, $Page, $Pos, $TrackPos
    ; Get all the vertial scroll bar information
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    ; Save the position for comparison later on
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $Pos = $yPos
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")

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

    $iRound = 0

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

    for $i = 1 to UBound($SCROLL_AMOUNTS)-1
    If $SCROLL_AMOUNTS[$i][0] = $hWnd And $SCROLL_AMOUNTS[$i][1] = $SB_HORZ Then
    $iRound = $SCROLL_AMOUNTS[$i][2]
    EndIf
    Next

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

    if Not $iRound Then Return $GUI_RUNDEFMSG

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

    Switch $nScrollCode
    Case $SB_TOP ; user clicked the HOME keyboard key
    DllStructSetData($tSCROLLINFO, "nPos", $Min)
    Case $SB_BOTTOM ; user clicked the END keyboard key
    DllStructSetData($tSCROLLINFO, "nPos", $Max)
    Case $SB_LINEUP ; user clicked the top arrow
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $iRound)
    Case $SB_LINEDOWN ; user clicked the bottom arrow
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $iRound)
    Case $SB_PAGEUP ; user clicked the scroll bar shaft above the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
    Case $SB_PAGEDOWN ; user clicked the scroll bar shaft below the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
    Case $SB_THUMBTRACK ; user dragged the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", Round($TrackPos/$iRound)*$iRound)
    EndSwitch

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

    ;~ // Set the position and then retrieve it. Due to adjustments
    ;~ // by Windows it may not be the same as the value set.
    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    ;// If the position has changed, scroll the window and update it
    $Pos = DllStructGetData($tSCROLLINFO, "nPos")

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

    If ($Pos <> $yPos) Then
    _GUIScrollBars_ScrollWindow($hWnd, $yPos - $Pos, 0)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_HSCROLL

    [/autoit]


    Davon habe ich mir nun einiges heraus geholt und erstmal in die Funktion Daten laden eingebaut um es zu testen.
    Funktioniert auch alles ganz gut, jedoch funktioniert das scrollen selber nicht und ich habe nen Verdacht woran es liegt, aber bekomme es net gelöst.

    In dieser Funktion, geht die erste nicht bei mir,

    [autoit]

    Scrollbar_Create($hGroup2, $SB_VERT, $i*25)
    Scrollbar_Step(20, $hGroup2, $SB_VERT)

    [/autoit]


    da ich ja nicht wie in dem original Script das drin habe da ich es net benutze:

    [autoit]

    for $i = 0 to 0
    $idRadio2[$i] = GUICtrlCreateInput("Input " & $i, 5, $i*25, 60, 18)

    [/autoit]


    Ich hänge mal mein verändertes Script in den Anhang, die Test.data zum laden im ersten Post.

    Veränderte Zeilen: 27 - 34 / 387 - 389 / 555 - 580

    Ich hoffe das mir diesbezüglich wer weiterhelfen kann. Ich möchte nur das die zweite GUI scrollbar ist und nichts einfügen.

    Mfg Ghostleader