Avatar billede rapid Nybegynder
19. februar 2003 - 09:21 Der er 14 kommentarer og
1 løsning

Scroll i flere listbox samtidigt

Jeg vil gerne høre om der er nogle der kan hjælpe mig, jeg har et program der skriver til flere listboxes fra en database.
Jeg vig gerne have det således at når jeg scroler ned i den ene listbox så skal de andre følge med ned / eller op hvordan gør jeg dette?
Avatar billede martin_moth Mester
19. februar 2003 - 10:23 #1
Det tror(!) jeg ikke er muligt - du kan ikke hverken aflæse eller sætte værdier for hvor scroll-baren står - ellers havde været at gøre noget i retning af:

  List2.Scrollvalue = List1.Scrollvalue

Skal ikke kunne sige om man ved en snedig og kompliceret bagvej kan synkronisere scrollbars, men med alm. VB-kode kan du ikke

Du kan gøre noget der minder om, for hvis du markere et element på list1, kan du markere det tilsvarende på list2 (der så automatisk vil scrolle dertil - smid 2 list's på en form og prøv følgende kode)

Private Sub Form_Load()
  Dim i
  For i = 1 To 20
    List1.AddItem "Testlinie " & i
    List2.AddItem "Linie " & i
  Next i
End Sub

Private Sub List1_Click()
  List2.ListIndex = List1.ListIndex
End Sub
Avatar billede somaliomar Praktikant
19. februar 2003 - 10:29 #2
Prøv det her

Private Sub cmdDown_Click()
    'Make the listbox invisible to prevent unnecesary redraw
    lst.Visible = False
   
    'Scroll down one line
    SendMessageVal lst.hwnd, WM_VSCROLL, SB_LINEDOWN, 0&
   
    'Change the style bit back to get rid of scroll bars.
    '(This gets reset when we scroll which is why we have to
    'prevent redrawing).
    ChangeStyleBit lst.hwnd, False, WS_VSCROLL
   
    'Make the control visible again
    lst.Visible = True
End Sub

Private Sub cmdUp_Click()
    'Make the listbox invisible to prevent unnecesary redraw
    lst.Visible = False
   
    'Scroll up one line
    SendMessageVal lst.hwnd, WM_VSCROLL, SB_LINEUP, 0&
   
    'Change the style bit back to get rid of scroll bars.
    '(This gets reset when we scroll which is why we have to
    'prevent redrawing).
    ChangeStyleBit lst.hwnd, False, WS_VSCROLL
   
    'Make the control visible again
    lst.Visible = True
End Sub
Avatar billede somaliomar Praktikant
19. februar 2003 - 10:32 #3
Proceduren ChangeStyleBit kan kaldes herfra

Option Explicit

'***********************************************************
'
'Example code that shows how to remove scroll bars from a
'listbox control and then control the scrolling from command
'buttons.
'
'Copyright David Daly 1999.
'      www.daly.co.uk/david
'
'***********************************************************

'API declarations for SetWindowLong and SetWindowPos
Declare Function SetWindowLong Lib "user32" Alias _
            "SetWindowLongA" _
            (ByVal hwnd As Long, _
            ByVal nIndex As Long, _
            ByVal dwNewLong As Long) As Long

Declare Function SetWindowPos Lib "user32" _
            (ByVal hwnd As Long, _
            ByVal hWndInsertAfter As Long, _
            ByVal x As Long, _
            ByVal y As Long, _
            ByVal cx As Long, _
            ByVal cy As Long, _
            ByVal wFlags As Long) As Long

'API decalation for SendMessage
Declare Function SendMessageVal Lib "user32" _
            Alias "SendMessageA" _
            (ByVal hwnd As Long, _
            ByVal wMsg As Long, _
            ByVal wParam As Long, _
            ByVal lParam As Long) As Long

'API declaration for GetWindowLong
Declare Function GetWindowLong Lib "user32" _
            Alias "GetWindowLongA" _
            (ByVal hwnd As Long, _
            ByVal nIndex As Long) As Long

'API declaration for GetParent
Declare Function GetParent Lib "user32" _
        (ByVal hwnd As Long) As Long

'API declaration for SetParent
Declare Function SetParent Lib "user32" _
        (ByVal hWndChild As Long, _
        ByVal hWndNewParent As Long) As Long

'Windows constants
Public Const WS_VSCROLL = &H200000
Public Const SB_LINEUP = 0
Public Const SB_LINEDOWN = 1
Public Const WM_VSCROLL = &H115
Public Const GWL_STYLE = (-16)
Public Const GWL_EXSTYLE = (-20)
Public Const HWND_NOTOPMOST = -2
Public Const SWP_NOZORDER = &H4
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOMOVE = &H2
Public Const SWP_FRAMECHANGED = &H20 'The frame changed: send WM_NCCALCSIZE
Public Const SWP_DRAWFRAME = SWP_FRAMECHANGED


'ChangeStyleBit is an API wrapper function that allows you
'to set windows style bits. I got this (copied it directly)
'from Bruce McKinneys 'Hardcore Visual Basic', well worth
'a read if you're interested in this kind of thing!

Sub ChangeStyleBit(hwnd As Long, f As Boolean, afNew As Long)
    Dim af As Long
    af = GetWindowLong(hwnd, GWL_STYLE)
    If f Then
        af = af Or afNew
    Else
        af = af And (Not afNew)
    End If
   
    Call SetWindowLong(hwnd, GWL_STYLE, af)
    Dim hParent As Long
    hParent = GetParent(hwnd)
    SetParent hwnd, hParent
    Call SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, _
                        SWP_NOZORDER Or SWP_NOSIZE Or _
                        SWP_NOMOVE Or SWP_DRAWFRAME)
   
End Sub
Avatar billede martin_moth Mester
19. februar 2003 - 10:33 #4
Havde på fornemmelsen at det kunne klares via API - nu har jeg set hvordan :o)
Avatar billede somaliomar Praktikant
19. februar 2003 - 10:34 #5
martin_moth >> Har du prøvet om det virker? Jeg har nemlig ikke mulighed for at afprøve koden.
Avatar billede rapid Nybegynder
19. februar 2003 - 11:06 #6
jeg har ikke testet om det duer endnu men i skal have mange tak for forslaget til dette!
Avatar billede martin_moth Mester
19. februar 2003 - 11:17 #7
somaliomar: Jeg gider ikke bruge tid på at teste, eftersom jeg ikke har behov for at scrolle med 2 scrollbars samtidigt - det må vel være rimeligt, at det er enten dig selv, eller endnu mere nærliggende: rapid, der tjekker koden ;o)
Avatar billede rapid Nybegynder
19. februar 2003 - 12:32 #8
Jeg har været ved at teste det men det er lige som om der mangler noget kode, den kan ikke kalde:

SendMessageVal
Avatar billede martin_moth Mester
19. februar 2003 - 12:56 #9
Den ER erklæret, dette er kopieret fra svaret kl. 10:32:23
  Declare Function SendMessageVal Lib "user32"

Husk, at API-kald er case-sencitive!!!

Se mere om SendMessageVal på www.mvps.org/vb/hardcore/html/thesendmessagefunction.htm
Avatar billede rapid Nybegynder
19. februar 2003 - 13:09 #10
Ja du har ret, den brokker sig dog når jeg sætter følgende declations ind:
'Windows constants
Public Const WS_VSCROLL = &H200000
Public Const SB_LINEUP = 0
Public Const SB_LINEDOWN = 1
Public Const WM_VSCROLL = &H115
Public Const GWL_STYLE = (-16)
Public Const GWL_EXSTYLE = (-20)
Public Const HWND_NOTOPMOST = -2
Public Const SWP_NOZORDER = &H4
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOMOVE = &H2
Public Const SWP_FRAMECHANGED = &H20 'The frame changed: send WM_NCCALCSIZE
Public Const SWP_DRAWFRAME = SWP_FRAMECHANGED

Hvis jeg indsætter disse undes declations giver den fejl! kan det være fordi de skal erklæres andet steds?
Avatar billede martin_moth Mester
19. februar 2003 - 13:21 #11
De skal bare erkælres "øverst", option explicit. Har du brugt API-kald før?
Avatar billede rapid Nybegynder
19. februar 2003 - 13:50 #12
Nej jeg har aldrig brugt dette før!
Avatar billede somaliomar Praktikant
19. februar 2003 - 13:53 #13
Du opretter et modul i dit projekt og tilføjer koden jeg postede 19/02-2003 10:29:58
Avatar billede martin_moth Mester
19. februar 2003 - 13:58 #14
Så kunne du muligvis have interesse i at forstå hvordan det virker før du selv går i gang med at bruge det...

Fx. hvor der står
  Declare Function SetWindowLong Lib "user32" Alias
betyder det, at du anvender funktionen SetWindowLong der findes i filen User32.dll, der ligger i din windows-system mappe. Ahh - det er (blandt andet) DET de mange dll'ere der følger med når man installere programmer bruges til - at definere (fælles) funktioner, der kan kaldes af andre programmer ;o)

Det jeg mente i mit svar var, at du ikke med "almindelig" VB-kode kan opnå det du vil - det kræver f.eks. API-kald. Før du bruger API-kald bør du nok forstå hvad det er, og til det kan du bruge www.allapi.net, fx. Tutorial 2 i dette link: www.allapi.net/vbtutor/tutmain.shtml
Avatar billede rapid Nybegynder
19. februar 2003 - 14:01 #15
Ja tak mange tak for det!
Jeg har sat den kode op jeg fik, og det dur nu, så nu skulle jeg være i stand til at løse problemet:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester