Gå til innhold

koble .txt-fil til combobox?


Anbefalte innlegg

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 av Nezualck
Lenke til kommentar
Videoannonse
Annonse

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 av aadnk
Lenke til kommentar

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

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
  • 1 måned senere...

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

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

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 av Nezualck
Lenke til kommentar
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...