Nezualck Skrevet 13. april 2005 Del Skrevet 13. april 2005 (endret) Lurer på hvordan man kobler data fra en .txt fil til en combobox, i tekstfilen har jeg følgende tabell/matrise: A37,40 198x36 0,21 0,22 223x36 0,19 0,20 246x36 0,17 0,18 271x36 0,16 0,17 296x36 0,15 0,15 321x36 0,14 0,14 346x36 0,13 0,13 396x36 0,11 0,12 Det jeg ønsker å få til er å velge dimensjon (f.eks 198x36) i en combobox, krysse av i en optionButton for kvalitet (A37 eller 40) og få ut en verdi (f.eks 0,21) som jeg senere skal legge sammen med tilsvarende verdier fra lignende tabeller. Har 20 forskjellige tabeller/matriser som skal legges inn så hvis det finnes en enklere måte så tar jeg i mot all hjelp med stor takknemlighet. Bruker vb 6.0 Endret 13. april 2005 av Nezualck Lenke til kommentar
aadnk Skrevet 13. april 2005 Del Skrevet 13. april 2005 (endret) Til dette kan du benytte Split-funksjonen. Legg inn kombinasjonsboksen cmbData, sjekkboksen chkQuality samt merknadsboksen lblInfo, hvorpå du legger inn følgende kode: ' Vår private array som skal inneholde alle elementer Private aArray() As Variant Public Sub OpenFile(sFile As String) Dim Free As Long, sData As String, aBuffer, Tell As Long ' Hent ledig filnummer Free = FreeFile ' sFile er filnavnet/tabellen du skal åpne Open sFile For Binary As #Free ' Allokerer innlastingsbuffer sData = Space(LOF(Free)) ' Laster inn data Get #Free, , sData Close #Free ' Segmenterer datastreng etter linjer aBuffer = Split(sData, vbCrLf) ' Realloker array ReDim aArray(LBound(aBuffer) To UBound(aBuffer)) ' Gå gjennom hver linje og lag en array For Tell = LBound(aArray) To UBound(aArray) ' Del opp linje etter mellomrom aArray(Tell) = Split(aBuffer(Tell), " ") Next ' Oppdaterer kontroller UpdateCombobox cmbData ' Du har ikke nevnt om det er mulighet for mer enn to kvalitettyper, slik at jeg antar det holder ' å kun sette sjekkboksens tittel til det første elementet (til nå) chkQuality.Caption = Split(aArray(0)(0), ",")(0) End Sub Public Sub UpdateCombobox(ComboBox As ComboBox) Dim Tell As Long ' Slett tidligere elementer ComboBox.Clear ' Oppdater kombinasjonsboksen ved å gå gjennom hele arrayen og legge til første element For Tell = LBound(aArray) + 1 To UBound(aArray) ' Legg til element ComboBox.AddItem aArray(Tell)(0) Next End Sub Public Function ValidPath(Path As String) As String ' Legg til en skråstrek dersom denne mangler i endelsen av strengen ValidPath = Path & IIf(Right(Path, 1) = "\", "", "\") End Function Private Sub cmbData_Change() ' Viser verdier i merknadsboks lblInfo.Caption = aArray(cmbData.ListIndex + 1)(chkQuality.Value + 1) End Sub Private Sub chkQuality_Click() ' Oppdater informasjon cmbData_Change End Sub Private Sub cmbData_Click() ' Oppdater informasjon cmbData_Change End Sub For å eksempelvis laste inn tabell Data.txt i samme mappe som applikasjonen, gjør du som følger: OpenFile ValidPath(App.Path) & "Data.txt" Endret 13. april 2005 av aadnk Lenke til kommentar
Nezualck Skrevet 18. april 2005 Forfatter Del Skrevet 18. april 2005 Tusen takk for hjelpen ' Du har ikke nevnt om det er mulighet for mer enn to kvalitettyper, slik at jeg antar det holder ' å kun sette sjekkboksens tittel til det første elementet (til nå) chkQuality.Caption = Split(aArray(0)(0), ",")(0) Dersom det er flere kvaliteter å velge mellom hvordan blir det da? F.eks: Kval1,Kval2,Kval3,Kval4 198x36 0,21 0,22 0,23 0,24 223x36 0,19 0,20 0,21 0,22 246x36 0,17 0,18 0,19 0,20 271x36 0,16 0,17 0,18 0,19 296x36 0,15 0,15 0,16 0,17 321x36 0,14 0,14 0,15 0,16 346x36 0,13 0,13 0,14 0,14 396x36 0,11 0,12 0,13 0,13 Lenke til kommentar
aadnk Skrevet 18. april 2005 Del Skrevet 18. april 2005 I så fall blir det langt mer hensiktsmessig å benytte en kombinasjonsboks istedenfor, slik at vi slipper unødvendigheter som kontrollvektorer til slikt et formål: ' Vår private array som skal inneholde alle elementer Private aArray() As Variant Public Sub OpenFile(sFile As String) Dim Free As Long, sData As String, aBuffer, Tell As Long ' Hent ledig filnummer Free = FreeFile ' sFile er filnavnet/tabellen du skal åpne Open sFile For Binary As #Free ' Allokerer innlastingsbuffer sData = Space(LOF(Free)) ' Laster inn data Get #Free, , sData Close #Free ' Segmenterer datastreng etter linjer aBuffer = Split(sData, vbCrLf) ' Realloker array ReDim aArray(LBound(aBuffer) To UBound(aBuffer)) ' Gå gjennom hver linje og lag en array For Tell = LBound(aArray) To UBound(aArray) ' Del opp linje etter mellomrom aArray(Tell) = Split(aBuffer(Tell), " ") Next ' Oppdaterer kontroller UpdateCombobox cmbData ' Oppdater kvalitetstypekombinasjonsboksen UpdateQuality cmbQuality End Sub Public Sub UpdateQuality(ComboBox As ComboBox) Dim Tell As Long, aQualities As Variant ' Slett tidligere elementer ComboBox.Clear ' Hent alle kvalitetstyper aQualities = Split(aArray(0)(0), ",") ' Gå gjennom alle kvalitetstyper og legg dem til kombinasjonsboksen For Tell = LBound(aQualities) To UBound(aQualities) ' Legg kvalitetstypen til kombinasjonsboksen ComboBox.AddItem aQualities(Tell) Next ' Sett til første element, dersom det forefinnes If ComboBox.ListCount > 0 Then ComboBox.ListIndex = 0 End If End Sub Public Sub UpdateCombobox(ComboBox As ComboBox) Dim Tell As Long ' Slett tidligere elementer ComboBox.Clear ' Oppdater kombinasjonsboksen ved å gå gjennom hele arrayen og legge til første element For Tell = LBound(aArray) + 1 To UBound(aArray) ' Legg til element ComboBox.AddItem aArray(Tell)(0) Next ' Sett til første element, dersom det forefinnes If ComboBox.ListCount > 0 Then ComboBox.ListIndex = 0 End If End Sub Public Function ValidPath(Path As String) As String ' Legg til en skråstrek dersom denne mangler i endelsen av strengen ValidPath = Path & IIf(Right(Path, 1) = "\", "", "\") End Function Private Sub cmbData_Change() ' Viser verdier i merknadsboks lblInfo.Caption = aArray(cmbData.ListIndex + 1)(cmbQuality.ListIndex + 1) End Sub Private Sub cmbData_Click() ' Oppdater informasjon cmbData_Change End Sub Private Sub cmbQuality_Change() ' Oppdater informasjon cmbData_Change End Sub Private Sub cmbQuality_Click() ' Oppdater informasjon cmbData_Change End Sub For å få koden til å fungere, fjerner du først chkQuality, hvorpå du så legger til kombinasjonsboksen cmbQuality. Du åpner en fil på likeledes måte. Lenke til kommentar
Nezualck Skrevet 29. mai 2005 Forfatter Del Skrevet 29. mai 2005 Takk for all hjelp så langt!!! Jobber jevnt og trutt videre med programmet mitt, men står helt fast nå Det jeg nå ønsker er å plukke en verdi fra følgende tabell/matrise ut i fra den nærmeste verdi som jeg fikk i den forrige matrisen (som jeg fikk hjelp til over) og en angitt høyde fra brukeren... Det beste hadde vært om jeg kunne ha fått ut en mer nøyaktig verdi gjennom lineær interpolering, men det er ikke livsnødvendig... verdi| 0,5m| 1,0m| 1,5m| 2,0m| 0,20 | 0,20 | 0,19 | 0,18 | 0,17 | 0,25 | 0,24 | 0,23 | 0,22 | 0,20 | 0,30 | 0,29 | 0,28 | 0,26 | 0,23 | 0,35 | 0,34 | 0,28 | 0,26 | 0,23 | Vet ikke om dette var så bra forklart, så bare spør hvis det er noen uklarheter! Eksempel: I den forrige matrisen valgte jeg 223x36 og kval2 da fikk jeg verdien 0,20 i en label. Ved hjelp av denne verdien og valgt høyde f.eks 1,5m skal programmet returnere verdien 0,18 Kan noen være så snill og hjelpe meg med dette eller komme med noen andre løsninger? Lenke til kommentar
aadnk Skrevet 30. mai 2005 Del Skrevet 30. mai 2005 Dersom du lagerer matrisen således, er bortimot ingen endringer i koden påkrevde: 0,5m|1,0m|1,5m|2,0m 0,20 0,20 0,19 0,18 0,17 0,25 0,24 0,23 0,22 0,20 0,30 0,29 0,28 0,26 0,23 0,35 0,34 0,28 0,26 0,23 Eneste du imidlertid må forandre, er atskillelsestegnet i følgende kode: ' Hent alle kvalitetstyper aQualities = Split(aArray(0)(0), ",") Atskillelsestegnet spesifiseres i siste paramenter av Split (kommaet), og må endres til en vertikal linje (|). Lenke til kommentar
Nezualck Skrevet 31. mai 2005 Forfatter Del Skrevet 31. mai 2005 (endret) Brukte "|" kun for å gjøre matrisen lettere å lese.. Den andre matrisen er avhengig av den første. Den verdien den første matrisen gir meg i labelen lblInfo skal brukes til å velge en verdi i den neste matrisen, ut i fra hvor mange meter (0,5-2,0m) brukeren velger (les eksempel over). Jeg tenkte noe lignende dette var mulig å få til: cmbNyData.Selected=lblInfo.text Trenger ikke å vise cmbNyData, men bare få programmet til å vise den nye verdien i en label (f.eks lblNyInfo). Trenger sikkert ikke å bruke comboboks, men vet ikke hvordan jeg ellers skal hente ut en verdi fra matrisen (nybegynner vettu...) Skrev nettopp en mail til en lærer der jeg forklarte det slik: Jeg holder på å lage et program som regner ut u-verdier for bygninger og i den forbindelse har jeg et problem. Jeg har en matrise som gir meg en verdi i en label utifra brukerens valg i to kombobokser. På grunnlag av denne verdien ønsker jeg å hente ut en ny verdi fra en annen matrise, altså den andre matrisen bruker verdien fra den første matrisen/tabellen til å gi meg en ny verdi... første matrise: Kval1 Kval2 Kval3 Dimensjon1 0,20 0,21 0,22 Dimensjon2 0,21 0,23 0,24 Brukeren velger dimensjon1 og kvalitet2 i to kombobokser og får ut verdien U=0,20 i en label andre matrise: U H1 H2 H3 0,20 0,21 0,22 0,23 0,21 0,21 0,23 0,24 Programmet velger 0,20 og brukeren velger Høyde2 i en komboboks og får ut verdien U*=0,22 i en label Har ikke peiling på om dette er mulig, men hvis du har noen tips om hvordan det kan gjøres blir jeg veldig takknemlig! Jeg har aldri vært flik til å forlare ting Endret 31. mai 2005 av Nezualck Lenke til kommentar
aadnk Skrevet 31. mai 2005 Del Skrevet 31. mai 2005 Brukte "|" kun for å gjøre matrisen lettere å lese.. Problemet er dog at elementene inneholdt atskillelsestegnet, hvilket ville kondemnere en korrekt splittene såfremt tegnet ikke ble endret. Følgelig må du nok benytte «|» istedenfor. Jeg har nå kommet til en løsning på denne oppgaven. Ettersom sluttproduktet ble nokså stort, har jeg vedlagt det hele i en ZIP-fil. Håper du får noe ut av det. For øvrig kunne en kanhende benyttet en Access-database til dette. Buildings.zip Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå