jeg arbejder i et udviklingsmiljø hvor jeg kan skrive VB4 kompatibel kode (skulle jeg måske nok lige have fortalt først, sorry), derfor tror jeg at jeg bliver nød til at anvende en WinAPI funktion
Nu har jeg måske helt misforstået det hele, men hvis det er et spørgsmål om at få de to kolonner til at stå pænt under hinanden i samme listbox, kan du ikke bare gøre således:
Alle rækker deles op, og første delstreng ("kolonne") smides i Kol1() andes delstreng i Kol2(). Er Kol1() og Kol2() defineret som... :
Dim Kol1() As String * 20 Dim Kol2() As String * 20
... vil de altid fylde 20 karakterer, også hvis de kun indeholder fx. 'asdfasdf'
Herefter kunne du fylde listboxen ved
For Tæller = LBound(Kol1()) To UBound(Kol1()) List1.AddItem Kol1(Tæller) & Kol2(Tæller) Next Tæller
martin_moth: nej det er ikke løsningen, Du havde fanget problemet korrekt nok, nemlig at få listet begge kolonner pænt under hinanden, men det er ikke nok at få dem til at være i en streng der er lige lang. Når der benyttes en proportional font, afhænger længden af hvilke bogstaver der er i strengen, derfor ville jeg finde en funktion der kunne få dannet en streng af en hvis længde i pixels.
Netop derfor skrev jeg, at du skulle vælge f.eks. courier... Så virker det!
Men jeg tror ikke du kan løse problemet på "din" måde. Måske kan du vha. API-kald få beregnet længden af din streng i pixels, men hvad så? Du kan jo ikke angive, at en streng skal have en bestemt længde i pixels - kun i karakterer. Hvis jeg nu gav dig en funktion, der som input tog en streng, og output gav længden i pixels, så ville du stadig have et problem.
Som jeg ser det, bliver du nødt til at gøre f.eks. som jeg siger (og anvende f.eks. Courier), eller anvende f.eks. et MSFlexgrid eller andet, der kan håndterer kolonner. Det ville muligvis også bliver både pænere og mere funtionelt, da brugeren kan skalere bredden af kolonnerneosv.
Men vil du bruge en listbox, vil jeg påstå, at den eneste løsning er den jeg har skitseret, ved anvendelse af f.eks. Courier ...
You can use the LB_SETTABSTOPS message to set tabstops in the listbox. KB article Q71067 has details (VB3 code). The tabstops are set in "dialog units", which if I remember rightly come out at about 4 pixels. The KB article has a routine for calculating the exact conversion factor, but you can just use trial and error to find the right values for the tabstop array. The code below is 32-bit (VB4-32 or VB5):
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) _ As Long Public Const LB_SETTABSTOPS = &H192
Dim tabstops(1 to 3) As Long tabstop(1) = 200 tabstop(2) = 400 tabstop(3) = 600 SendMessage list1.hWnd, LB_SETTABSTOPS, 3, tabstops(1)
VBs adgang til mange af windows' komponenter er temmelig begrænset. Jeg vil anbefale at du læser nogle af Franseco Balenas artikler om "subclassing" hvis du vil have fuldt indblik. Prøv evt.: www.vb2themax.com
Det ser ud som noget jeg kan bruge, men hvor skal jeg fyre beskeden af?
spaghettikode:
Begin dialog load_dialog..... .... Listbox ,,,,,,.Set_Listbox ..... End Dialog Dim Load_d As load_dialog SendMessage(Set_listbox.hWnd, LB_SETTABSTOPS,3,tabstops(1)) Dialog(Load_d)
...Spaghetti slut
fyrer jeg den af som ovenfor
får jeg fejl 'left of "." must be an object, structure, or dialog'
altså må jeg referere forkert til listbox objektet, hvordan fanger jeg den?
Det ser ud som om jeg ikke kan sende dialogobjekter til eksterne funktioner i den vb udgave jeg har i udviklingsmiljøet, og mit forhavende ikke kan lykkes, men jeg roder lidt videre
Husk lige at skrive Call når du benytter SendMessage med parenteser (eller fjern parenteserne).
Prøv følgende (jeg har desværre ikke installeret VB på denne maskine endnu, så du måp selv "afluse" koden):
Opret først et modul.
1. Indsæt følgende udenfor alle funktioner og subs (dvs. i Declare-delen af modulet):
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) _ As Long Public Const LB_SETTABSTOPS = &H192
2. Opret en funktion:
Function DefineListboxTabs(byref list1 as listbox)
Dim tabstops(1 to 3) As Long tabstop(1) = 200 tabstop(2) = 400 tabstop(3) = 600
...Nu er din listbox "sat" til at køre med de definerede tabs indtil du afslutter programmet eller om-definerer dem.
FYI: Grunden til at kun det første element af array'et sendes med er at resten af array'et automatisk sendes med. Det ligger nemlig i forlængelse af første element og API'et sørger for at "slice" array'et i elementer der har en størrelse der svarer til "long". Det vil sige at de efterfølgende tabs også er lagt på listbox'en.
den afart der følger med det her datawarehouseprodukt, tillader ikke at jeg kommunikerer med dialogboksen via API'et, så alle anstrengelser er forgæves.
Jeg laver en ekstern dll som kan klare det og kalder den indefra applikationen.
tak for kampen
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.