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.
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
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
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.
' ---------------------------------- 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 ------------------------------------------
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.
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
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.
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
' 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)
' 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
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
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 ################
Det virker nu. Du er dygtig du får mange tak for hjælpen
mvh mvhansen
Synes godt om
Ny brugerNybegynder
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.