Avatar billede mvhansen Nybegynder
17. december 2005 - 17:41 Der er 20 kommentarer og
1 løsning

HScrollBar på en textbox og en listebox

Hej Experter

Er der en der kan hjælpe mig jeg har textbox og en listebox
jeg godt vil have en HScrollBar på
Hvordan er koderne jeg har prøvet med

Private Sub HScroll1_Change()
HScroll1_Scroll
End Sub


Private Sub HScroll1_Scroll()
List1.Left = -HScroll1
End Sub

men den scrol med hele listbox1
på form1

mvh

mvhansen
Avatar billede joern Nybegynder
17. december 2005 - 20:32 #1
Hej.

Jeg mener at der ikke kan komme vandret scroll i en alm. listeboks, den lodrette kommer automatisk, når der er linier nok.

I en tekstboks skal du indstille to properties, nemlig multiline til 'true' og scrollbars til 'both'.
Det kan nok ikke ændres i runtime, men skal angives i designtime.

/jørn
Avatar billede mvhansen Nybegynder
17. december 2005 - 20:53 #2
Hej joern

Tak skal du have for hjælpen
Hvad gør man så, jeg henter data fra database
og kan ikke læse alt som jeg lister uden at lave en listebox der fylder det halve af skærmen

mvh

mvhansen
Avatar billede sjh Nybegynder
17. december 2005 - 21:00 #3
Ja det passer nu ikke helt Joern.. med api kan næsten alt laves ;)
http://www.vb-helper.com/howto_listbox_horizontal_scrollbar.html
Avatar billede mvhansen Nybegynder
17. december 2005 - 21:25 #4
Hej sjh

Hvad er api ?
Jeg har prøvet at lagt koderne ind på min form
jeg kan ikke få det til at virke

Use SendMessage to send the control the LB_SETHORIZONTALEXTENT message specifying the necessary width to display the list items. 


' Set the list box's horizontal extent so it
' can display its longest entry. This routine
' assumes the form is using the same font as
' the list box.
Private Sub SetListboxScrollbar()
Dim i As Integer
Dim new_len As Long
Dim max_len As Long

    For i = 0 To List1.ListCount - 1
        new_len = 10 + ScaleX(TextWidth(List1.List(i)), _
            ScaleMode, vbPixels)
        If max_len < new_len Then max_len = new_len
    Next i

    SendMessage List1.hwnd, _
        LB_SETHORIZONTALEXTENT, _
        max_len, 0
End Sub

mvh

mvhansen
Avatar billede sjh Nybegynder
17. december 2005 - 21:27 #5
Avatar billede joern Nybegynder
17. december 2005 - 21:42 #6
Hej.

Sjh har svar på (næsten) alt.  Ang. at dine data fylder meget, vil jeg anbefale, at du bruger en anden kontrol end listeboks.  Selv foretrækker jeg MSFlexGrid, men det er fordi jeg ikke kan anvende DataGrid, da mine datebaser er ren ascii-tekst.

Jeg lader listebokse vise det (eller de) væsentligste felter og ved klik i listen vises så øvrige felter i hvert sit tekstfelt.  Så man evt. kan rette data.

http://jkfsoft.dk/cd_base.htm kan du se skærmbilledet fra mit seneste program.

Tak for point i øvrigt.

M.v.h. Jørn
Avatar billede sjh Nybegynder
17. december 2005 - 21:54 #7
Jørn > Er der noget salg i dine "specielle programmer" ?
Avatar billede mvhansen Nybegynder
17. december 2005 - 22:00 #8
Hej sjh

Jeg har downloade
og prøvet at sette nogle af koder ind på min form1 hvor jeg har en List1
men jeg kan ikke få Scrollbar frem

mvh

mvhansen
Avatar billede sjh Nybegynder
17. december 2005 - 22:13 #9
' ---------------------------------- Fx. modListScroll.bas ----------------------------------
' Tilføj denne kode i et module Fx. modListScroll.bas
' -------------------------------------------------------------------------------------------
Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const LB_SETHORIZONTALEXTENT = &H194

Public Sub SetListboxScrollbar(objList As ListBox)
Dim i As Integer
Dim new_len As Long
Dim max_len As Long
  With objList
      For i = 0 To .ListCount - 1
        new_len = 10 + ScaleX(TextWidth(.List(i)), ScaleMode, vbPixels)
        If max_len < new_len Then max_len = new_len
      Next
      SendMessage .hwnd, LB_SETHORIZONTALEXTENT, max_len, 0
  End With
End Sub
' ---------------------------------- Fx. modListScroll.bas ----------------------------------

' ------------------------------------------ Form1 ------------------------------------------
' Husk at køre Call SetListboxScrollbar(List1) hvis du bruger .Clear og .RemoveItem
' -------------------------------------------------------------------------------------------
Private Sub Command1_Click()
Dim i As Integer
  ' Når du så skal tilføje noget i din ListBox
  For i = 1 To 10
    List1.AddItem "Tekst Tekst Tekst Tekst Tekst Tekst Tekst Tekst " & i
  Next
  ' Kør da denne sub efter du har tilføjet tekst..
  Call SetListboxScrollbar(List1)
End Sub
' ------------------------------------------ Form1 ------------------------------------------
Avatar billede joern Nybegynder
17. december 2005 - 22:21 #10
>>sjh

I år har jeg efter ordre udviklet http://jkfsoft.dk/staevne0.htm og solgt mit regnskabsprogram et par gange.  Med det er jo hobby først og fremmest.  Det jeg henviser til ovenfor er under udvikling efter en forespørgsel på mit 'store' kartoteksprogram 'melodier', som Per syntes var for omfattende.
Gennem 6-7 år har jeg ialt haft ca. 40 kunder.

/jørn
Avatar billede mvhansen Nybegynder
17. december 2005 - 22:44 #11
Hej sjh

Kan man ikke ligge nogle koder ind på formen hvor listeBoxen er. Da jeg har flere listeBoxe på forskellig form i mit projekt, hvor jeg henter data fra en database jeg syntes ikke jeg kan få det til at virke

mvh

mvhansen
Avatar billede sjh Nybegynder
17. december 2005 - 22:55 #12
mvhansen > Så prøver vi igen.

opret et module og smid denne kode ind i det.
' ---------------------------------- Fx. modListScroll.bas ----------------------------------
' Tilføj denne kode i et module Fx. modListScroll.bas
' -------------------------------------------------------------------------------------------
Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const LB_SETHORIZONTALEXTENT = &H194

Public Sub SetListboxScrollbar(objList As ListBox)
Dim i As Integer
Dim new_len As Long
Dim max_len As Long
  With objList
      For i = 0 To .ListCount - 1
        new_len = 10 + ScaleX(TextWidth(.List(i)), ScaleMode, vbPixels)
        If max_len < new_len Then max_len = new_len
      Next
      SendMessage .hwnd, LB_SETHORIZONTALEXTENT, max_len, 0
  End With
End Sub
' ---------------------------------- Fx. modListScroll.bas ----------------------------------


nu kan du så bruge denne funktion (sub) på alle dine forms:
Call SetListboxScrollbar(List1)

Husk dog at ændre ListBox navn : Call SetListboxScrollbar(LISTBOX_NAVN)
Du skal også køre : Call SetListboxScrollbar(LISTBOX_NAVN) efter .AddItem, .Clear og .RemoveItem ellers vil den ikke opdater din scroll.
Avatar billede mvhansen Nybegynder
17. december 2005 - 23:22 #13
Hej sjh

Jeg har lavet en modul og  Tilføj denne kode
Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const LB_SETHORIZONTALEXTENT = &H194

Public Sub SetListboxScrollbar(objList As ListBox)
Dim i As Integer
Dim new_len As Long
Dim max_len As Long
  With objList
      For i = 0 To .ListCount - 1
        new_len = 10 + ScaleX(TextWidth(.List(i)), ScaleMode, vbPixels)
        If max_len < new_len Then max_len = new_len
      Next
      SendMessage .hwnd, LB_SETHORIZONTALEXTENT, max_len, 0
  End With
End Sub

Og tilføjet denne kode på form2 hvor jeg har en list1 på
Call SetListboxScrollbar(List1)

jeg kan ikke få det til at virke jeg ved ikke hvad du mener her

(Husk dog at ændre ListBox navn : Call SetListboxScrollbar(LISTBOX_NAVN)
Du skal også køre : Call SetListboxScrollbar(LISTBOX_NAVN) efter .AddItem, .Clear og .RemoveItem ellers vil den ikke opdater din scroll.)

Jeg vil ikke tage mere af din tid
du får tak for din hjælp

mvh

mvhansen
Avatar billede sjh Nybegynder
17. december 2005 - 23:26 #14
godt så køre du bare den her "Call SetListboxScrollbar(List1)" efter du har tilføjet noget data i din listbox (List1)
Avatar billede mvhansen Nybegynder
17. december 2005 - 23:40 #15
sjh

den melder fejl

På denne form2 har jeg de koder her

' Læg altid "(General)" ting i toppen af dine Forms, så de ikke ligger
' og blander sig med Form'ens egne funktioner og events.
' Giver bedre overskuelighed i det lange løb :+)

' Oprindeligt var det en Function, men da den ikke skal levere noget
' svar tilbage, er det bedre at bruge en Sub - så den er ændret tilsvarende.
' Da du heller ikke har brug for at kunne kalde denne funktion fra andre
' steder i programmet, kan vi lige så godt lægge den "Private" i stedet
' for "Public" - så det kun er i denne Form man kan kalde funktionen.
Private Sub DB_List()
  Dim objRS ' Til RecordSets - specifik definition er ikke nødvendig
  Dim SQLQuery As String ' Til vores SQL sætninger
 
' *Tip* - Da vi i Form1's Form_Load() event allerede har foretaget et kald til
'        at åbne en forbindelse til databasen, via Call OpenDataBase
'        så har vi allerede en åben forbindelse til database i objConn
'        så vi skal altså ikke spekulere på at skulle åbne igen her ....
 
  ' For god ordens skyld, starter vi med at tømme List1
  List1.Clear
  ' Så henter vi en røvfuld records :+P
  SQLQuery = "SELECT * FROM Teccon"
  Set objRS = objConn.Execute(SQLQuery)
  ' Hvis vi (ikke er i begyndelsen) og (vi ikke er i slutningen) så har vi fået en record
  If (Not objRS.BOF) And (Not objRS.EOF) Then
    ' Flyt til starten af den record liste vi har fået
    objRS.MoveFirst
    ' Sålænge vi ikke er nået til den sidste record (i slutningen: EOF = End Of File),
    ' så gentag det følgende kode
    While Not objRS.EOF
      List1.AddItem objRS("Dato")
      List1.AddItem objRS("Kunde")
      List1.AddItem objRS("Projektnr")
      List1.AddItem objRS("Ordrenr")
      List1.AddItem objRS("Beskrivelse")
      List1.AddItem objRS("Projekt_opretter")
      List1.AddItem ""
      List1.AddItem "----------------------------------------------------------------------------------------------------------------"
      List1.AddItem ""
      ' Flyt til næste record ...
      objRS.MoveNext
    Wend ' Slut på While-Wend løkken
  End If
  objRS.Close ' Luk vores RecordSet
  Set objRS = Nothing ' Destruer objektet i hukommelsen igen = ryd pænt op :+)
End Sub



Private Sub Form_Load()
  ' Kosmetisk - centrer formen på skærmen - se: KodeModul
  ' "Me" henviser til denne form
  Call CenterForm(Me)
 
  ' Hent vores liste ....
  Call DB_List
End Sub


mvh

mvhansen
Avatar billede sjh Nybegynder
17. december 2005 - 23:46 #16
' For god ordens skyld, starter vi med at tømme List1
  List1.Clear
  ' Så henter vi en røvfuld records :+P
  SQLQuery = "SELECT * FROM Teccon"
  Set objRS = objConn.Execute(SQLQuery)
  ' Hvis vi (ikke er i begyndelsen) og (vi ikke er i slutningen) så har vi fået en record
  If (Not objRS.BOF) And (Not objRS.EOF) Then
    ' Flyt til starten af den record liste vi har fået
    objRS.MoveFirst
    ' Sålænge vi ikke er nået til den sidste record (i slutningen: EOF = End Of File),
    ' så gentag det følgende kode
    While Not objRS.EOF
      List1.AddItem objRS("Dato")
      List1.AddItem objRS("Kunde")
      List1.AddItem objRS("Projektnr")
      List1.AddItem objRS("Ordrenr")
      List1.AddItem objRS("Beskrivelse")
      List1.AddItem objRS("Projekt_opretter")
      List1.AddItem ""
      List1.AddItem "----------------------------------------------------------------------------------------------------------------"
      List1.AddItem ""
      ' Flyt til næste record ...
      objRS.MoveNext
    Wend ' Slut på While-Wend løkken
  End If
  ' ################ HER ################
  Call SetListboxScrollbar(List1)
  ' ################ HER ################
  objRS.Close ' Luk vores RecordSet
  Set objRS = Nothing ' Destruer objektet i hukommelsen igen = ryd pænt op :+)
End Sub
Avatar billede sjh Nybegynder
17. december 2005 - 23:51 #17
' ----------------------------- Module.bas -----------------------------
Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const LB_SETHORIZONTALEXTENT = &H194

Public Sub SetListboxScrollbar(objList As ListBox, frmForm As Form)
Dim i As Integer
Dim new_len As Long
Dim max_len As Long
  With objList
      For i = 0 To .ListCount - 1
        new_len = 10 + frmForm.ScaleX( _
        frmForm.TextWidth(.List(i)), _
        frmForm.ScaleMode, vbPixels)
        If max_len < new_len Then max_len = new_len
      Next
      SendMessage .hwnd, LB_SETHORIZONTALEXTENT, max_len, 0
  End With
End Sub
' ----------------------------- Module.bas -----------------------------


' For god ordens skyld, starter vi med at tømme List1
  List1.Clear
  ' Så henter vi en røvfuld records :+P
  SQLQuery = "SELECT * FROM Teccon"
  Set objRS = objConn.Execute(SQLQuery)
  ' Hvis vi (ikke er i begyndelsen) og (vi ikke er i slutningen) så har vi fået en record
  If (Not objRS.BOF) And (Not objRS.EOF) Then
    ' Flyt til starten af den record liste vi har fået
    objRS.MoveFirst
    ' Sålænge vi ikke er nået til den sidste record (i slutningen: EOF = End Of File),
    ' så gentag det følgende kode
    While Not objRS.EOF
      List1.AddItem objRS("Dato")
      List1.AddItem objRS("Kunde")
      List1.AddItem objRS("Projektnr")
      List1.AddItem objRS("Ordrenr")
      List1.AddItem objRS("Beskrivelse")
      List1.AddItem objRS("Projekt_opretter")
      List1.AddItem ""
      List1.AddItem "----------------------------------------------------------------------------------------------------------------"
      List1.AddItem ""
      ' Flyt til næste record ...
      objRS.MoveNext
    Wend ' Slut på While-Wend løkken
  End If
  ' ################ HER ################
  Call SetListboxScrollbar(List1, Me)
  ' ################ HER ################
  objRS.Close ' Luk vores RecordSet
  Set objRS = Nothing ' Destruer objektet i hukommelsen igen = ryd pænt op :+)
End Sub
Avatar billede mvhansen Nybegynder
17. december 2005 - 23:59 #18
sjh

den melder fejl i modulet  (modListScroll.bas)

Compile error:
Sub or Function not defined
TextWidth
mvh
mvhansen
Avatar billede mvhansen Nybegynder
18. december 2005 - 00:01 #19
sjh

Skal jeg sidde en HScroll1

ind på form2
Avatar billede sjh Nybegynder
18. december 2005 - 00:03 #20
NY KODE:
' ----------------------------- modListScroll.bas -----------------------------
Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const LB_SETHORIZONTALEXTENT = &H194

Public Sub SetListboxScrollbar(objList As ListBox, frmForm As Form)
Dim i As Integer
Dim new_len As Long
Dim max_len As Long
  With objList
      For i = 0 To .ListCount - 1
        new_len = 10 + frmForm.ScaleX( _
        frmForm.TextWidth(.List(i)), _
        frmForm.ScaleMode, vbPixels)
        If max_len < new_len Then max_len = new_len
      Next
      SendMessage .hwnd, LB_SETHORIZONTALEXTENT, max_len, 0
  End With
End Sub
' ----------------------------- modListScroll.bas -----------------------------

  ' ################ HER ################
  Call SetListboxScrollbar(List1, Me)
  ' ################ HER ################


>Skal jeg sidde en HScroll1< NEJ
Avatar billede mvhansen Nybegynder
18. december 2005 - 00:16 #21
Sjh

Det virker nu.
Du er dygtig du får mange tak for hjælpen


mvh
mvhansen
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