Avatar billede skoefoed Nybegynder
18. august 2007 - 12:37 Der er 38 kommentarer og
1 løsning

Hjælp til søgefunktion omkring chk-bokse

Hej. Jeg er ved at lave en lille formelsamling til eget brug. Idéen er, at hvert bogstav i alfabetet har sin egen chk-boks. Når man så vil finde en formel, krydser man alle de "bogstaver" af, som man umiddelbart kan huske fra formlen. Eksempel: Jeg skal finde formlen for rumfanget af en cylinder. Jeg kan huske noget med højde og radius. Jeg krydser så af i "h" og "r" og trykker søg. Så skal alle formler med, hvor h og r vises i en txt-box.

Spørgsmålet til jer er så, hvordan jeg laver denne søgning nemmest. Jeg er ikke super hardcore til VB, så evt. svar bedes formuleres uden alt for meget indsiderviden!

På forhånd tak.
Avatar billede thesurfer Nybegynder
18. august 2007 - 12:51 #1
Du har ikke skrevet, hvordan du opbevarer formlerne.. er det f.eks. en database? streng? array? tekstfil?

Derfor: Hvordan er formlerne opbevaret?
Avatar billede skoefoed Nybegynder
18. august 2007 - 12:55 #2
Nej, kom også lige i tanke om det.

Formlerne er opbevaret i arrays på ca. 5-6 linjer (aner ikke om det spiller nogen vigtig rolle?)
Avatar billede thesurfer Nybegynder
18. august 2007 - 13:07 #3
Jeg går ud fra, at hvis man vælger "h" og "r", så SKAL begge disse bogstaver indgå i formlen?

Dvs, så SKAL finde:

V = π·r2·h

som indeholder Både "h" OG "R", og samtidigt IKKE finde:

V = l·b·h

som også indeholder "h".

Korrekt?
Avatar billede thesurfer Nybegynder
18. august 2007 - 13:07 #4
For dem der undrer sig over "π", så er det tegnet PI.. :-)
Avatar billede skoefoed Nybegynder
18. august 2007 - 13:16 #5
Ja, det er korrekt. Jo flere bogstaver man kender, jo nemmere er det at finde den rigtige formel.
Avatar billede thesurfer Nybegynder
18. august 2007 - 13:17 #6
Eksempel på en funktion, der returnerer alle formler, der indeholde ønskede bogstaver:

function findformler(valgte_bogstaver)
valgte_bogstaver = split(valgte_bogstaver, "#")

dim i, j, formel, retur, fundet
retur = ""
for i = Lbound(arrFomler) to Ubound(arrFomler)
    formel = arrFomler(i)

    fundet = true
    for j = Lbound(valgte_bogstaver) to Ubound(valgte_bogstaver)
       
        if instr(formel, valgte_bogstaver(j)) = 0 then
            fundet = false
            exit for
        end if

    next
    if fundet = true then retur = retur & formel & vbCrLf
next

findformler = retur
end function


koden bruges f.eks. sådan:

dim formler
formler = findformler("a#c")

msgbox formler


Læg mærke til, at jeg har brugt tegnet "#" som separator, mellem bogstaverne..

Hvis du f.eks. har følgende formlerne i din array:

a^2 + b^2 = c^2
h * g * 0.5
d = 4ac

Vil den returnerer:

a^2 + b^2 = c^2
d = 4ac
Avatar billede thesurfer Nybegynder
18. august 2007 - 13:19 #7
Hmm.. formlen hedder vel "a = h * g * 0.5"..

Men anyways, formlen "a = h * g * 0.5" vil ikke returneres, da den ikke indeholder "c", som jeg ønsker her:

dim formler
formler = findformler("a#c")

msgbox formler

Det er kun formler der indeholder både "a" og "c" der returneres..
Avatar billede thesurfer Nybegynder
18. august 2007 - 13:22 #8
Mht til dine checkboxe, har du ikke skrevet noget om hvordan de er sat op..
F.eks.:
Hvad hedder de? Har de nogen identificerende værdier?

Og til sidst:

Hvorfor ikke bare lade brugeren indtaste bogstaverne?

Eksempel

Indtast bogstaver separaret af ET-BESTEMT-TEGN: [      ]

Hvor:
"[      ]": er en textbox
ET-BESTEMT-TEGN: er f.eks tegnet "#" eller et mellemrum (" ")

Det vil være meget nemmere..
Avatar billede skoefoed Nybegynder
18. august 2007 - 13:34 #9
Hvad mener du med identificerende værdier? chk-box for "a" hedder fx chka. Er det det du mener?

Jeg kan godt se, at det ville være nemmere med textboxe, jeg kan bare godt lide idéen med chk-boxe. Men altså, hvis det ikke er muligt at bruge den, må jeg jo bruge textboxe istedet.

Men hvordan kan textboxe så benyttes? Skrives alle tegnene bare i samme textbox, eller skal man lave en 5-6 stykker til hvert tegn?
Avatar billede thesurfer Nybegynder
18. august 2007 - 13:45 #10
Eksempel:

Textbox'en tbxBogstaver kommer til at indeholde bogstaverne som man vil søge efter.

Dvs, i tbxBogstaver indtastaster du følgende (der er kun 1 mellemrum, mellem "a" og "c"): a c

Textbox'en tbxFormler kommer til at indeholde formlerne.

Så gør du sådan her:

tbxFormler.Text = findformler(tbxBogstaver.Text)

Husk at rette "#" til " " i funktionen, så funktionen ser sådan ud:

function findformler(valgte_bogstaver)
valgte_bogstaver = split(valgte_bogstaver, " ")

dim i, j, formel, retur, fundet
retur = ""
for i = Lbound(arrFomler) to Ubound(arrFomler)
    formel = arrFomler(i)

    fundet = true
    for j = Lbound(valgte_bogstaver) to Ubound(valgte_bogstaver)
       
        if instr(formel, valgte_bogstaver(j)) = 0 then
            fundet = false
            exit for
        end if

    next
    if fundet = true then retur = retur & formel & vbCrLf
next

if retur = "" then retur = "Der blev ikke fundet nogen formler med de indtastede bogstaver."

findformler = retur
end function


Læg mærke til, at jeg har tilføjet følgende linie:

if retur = "" then retur = "Der blev ikke fundet nogen formler med de indtastede bogstaver."

som vil returnerer "Der blev ikke fundet nogen formler med de indtastede bogstaver.", hvis den ikke finder nogen formler..

:-)
Avatar billede thesurfer Nybegynder
18. august 2007 - 14:02 #11
Hvis du ikke allerede har fundet ud af det, har jeg kaldt arrayen med formlerne for "arrFomler"..

Enten ret navnet på din array, eller ret navnet på min array.. :-)

Jeg vil anbefale at du definerer arrayen globalt, dvs, i toppen af kode-området..

PS:

Du bør også altid bruge Option Explicit, som din første linie (der må ikke være noget før)..

Med Option Explicit undgår du stavefejl i navnene på variablerne, da du bliver nødt til at definierer samtlige variabler..

Eksempel:

Vil ikke virke, da hugo ikke er defineret:
hugo = "test"


Vil virke:
dim hugo
hugo = "test"

Evt:

dim hugo as string
hugo = "test"


Det kan også være, at du skal have noget her:

function findformler(valgte_bogstaver)

f.eks.

function findformler(valgte_bogstaver as string)

Det er noget tid siden, at jeg sidst har programmeret i VB..
Avatar billede skoefoed Nybegynder
18. august 2007 - 14:03 #12
Det ser meget godt ud, men jeg er stadig ikke helt med.

Kunne jeg få dig til, at smide ALLE koderne ind (lige fra top til bund), samt skrive hvilke felter og knapper jeg skal lave??

Forstår ikke så meget af det. Undskyld at jeg er så umulig..
Avatar billede thesurfer Nybegynder
18. august 2007 - 14:09 #13
1) Textboxen som man indtaster søge-bogstaverne i, hedder: tbxBogstaver

2) Bogstaver skal separares af et mellemrum, som f.eks. (søgning efter "a" og "c"): a c

3) Textboxen som formlerne bliver vist i, hedder: tbxFormler

4) Navnet på arrayen med dine formler, skal hedde: arrFomler

5) Funktionen du skal bruge, er:

function findformler(valgte_bogstaver)
valgte_bogstaver = split(valgte_bogstaver, " ")

dim i, j, formel, retur, fundet
retur = ""
for i = Lbound(arrFomler) to Ubound(arrFomler)
    formel = arrFomler(i)

    fundet = true
    for j = Lbound(valgte_bogstaver) to Ubound(valgte_bogstaver)
       
        if instr(formel, valgte_bogstaver(j)) = 0 then
            fundet = false
            exit for
        end if

    next
    if fundet = true then retur = retur & formel & vbCrLf
next

if retur = "" then retur = "Der blev ikke fundet nogen formler med de indtastede bogstaver."

findformler = retur
end function


6) Dit kald ser sådan ud: tbxFormler.Text = findformler(tbxBogstaver.Text)


Håber at det er nok.. ellers må du lige sige til.. :-)
Avatar billede skoefoed Nybegynder
18. august 2007 - 14:22 #14
Jeg laver de 2 textboxe med deres respektive navne. Men hvor sætter jeg funktionen hen? Skal den ind i en cmd-button?

Og hvad er et kald?

Dette er hvad jeg tror, men hvordan jeg "søger" forstår jeg stadig ikke:

Option Explicit
Dim arrFomler(1 To 3) As String

Private Sub Form_Load()
arrFomler(1) = " a + b = c"
arrFomler(2) = " d + e = f"
arrFomler(3) = " d + e = c"
End Sub

Function findformler(valgte_bogstaver)
valgte_bogstaver = Split(valgte_bogstaver, " ")

Dim i, j, formel, retur, fundet
retur = ""
For i = LBound(arrFomler) To UBound(arrFomler)
    formel = arrFomler(i)

    fundet = True
    For j = LBound(valgte_bogstaver) To UBound(valgte_bogstaver)
       
        If InStr(formel, valgte_bogstaver(j)) = 0 Then
            fundet = False
            Exit For
        End If

    Next
    If fundet = True Then retur = retur & formel & vbCrLf
Next

If retur = "" Then retur = "Der blev ikke fundet nogen formler med de indtastede bogstaver."

findformler = retur

tbxFormler.Text = findformler(tbxBogstaver.Text)

End Function
Avatar billede thesurfer Nybegynder
18. august 2007 - 14:24 #15
Det ser 99.9% rigtigt ud! :-)

Det eneste du nu skal gøre, er at flytte denne linie til en knap/cmd-button:

tbxFormler.Text = findformler(tbxBogstaver.Text)
Avatar billede thesurfer Nybegynder
18. august 2007 - 14:25 #16
Eksempel:

Private Sub Command1_Click()
tbxFormler.Text = findformler(tbxBogstaver.Text)
End Sub


HUSK: ret navnet på knappen til, hvis den ikke hedder "Command1"..

.-9
Avatar billede thesurfer Nybegynder
18. august 2007 - 14:25 #17
:-)
Avatar billede thesurfer Nybegynder
18. august 2007 - 14:28 #18
Angående det med "kald":

Dette er kaldet:

tbxFormler.Text = findformler(tbxBogstaver.Text)

Du kalder på funktionen, som returnerer en værdi, der så lægges over i tbxFormler.Text.. :-)
Avatar billede skoefoed Nybegynder
18. august 2007 - 14:33 #19
Ok, det forstår jeg nu. Men jeg får en fejlmeddelelse når jeg trykker "søg":

"Compile Error:
Method or data member not found"

Dette er markeret med gul: Private Sub Søg_Click()

og "Text" efter tbxBogstaver er markeret med blåt.

Hvad skyldes det mon?
Avatar billede skoefoed Nybegynder
18. august 2007 - 14:36 #20
Når jeg vil skrive tbxBogstaver.Text, foreslår den kun følgende når jeg trykker punktum:

Count, Item, LBound, UBound?

Siger det dig noget?
Avatar billede thesurfer Nybegynder
18. august 2007 - 14:39 #21
Du har sikkert gjort et eller andet forkert..

Hvordan ser hele din kode ud?
Avatar billede skoefoed Nybegynder
18. august 2007 - 14:43 #22
Hele koden ser således ud:

Option Explicit
Dim arrFomler(1 To 3) As String

Private Sub command1_Click()
tbxFormler.Text = findformler(tbxBogstaver.Text)
End Sub

Private Sub Form_Load()
arrFomler(1) = " a + b = c"
arrFomler(2) = " d + e = f"
arrFomler(3) = " d + e = c"

End Sub

Function findformler(valgte_bogstaver)
valgte_bogstaver = Split(valgte_bogstaver, " ")

Dim i, j, formel, retur, fundet
retur = ""
For i = LBound(arrFomler) To UBound(arrFomler)
    formel = arrFomler(i)

    fundet = True
    For j = LBound(valgte_bogstaver) To UBound(valgte_bogstaver)
       
        If InStr(formel, valgte_bogstaver(j)) = 0 Then
            fundet = False
            Exit For
        End If

    Next
    If fundet = True Then retur = retur & formel & vbCrLf
Next

If retur = "" Then retur = "Der blev ikke fundet nogen formler med de indtastede bogstaver."

findformler = retur
End Function

Min knap hedder også Command1.
Avatar billede thesurfer Nybegynder
18. august 2007 - 14:44 #23
Har du følgende?:

En textbox med navnet: tbxFormler

En textbox med navnet: tbxBogstaver
Avatar billede thesurfer Nybegynder
18. august 2007 - 14:49 #24
I indlægget 18/08-2007 14:33:33 skriver du, at du har: Private Sub Søg_Click()

I indlægget 18/08-2007 14:43:14 skriver du, at du har: Private Sub command1_Click()

Du må meget gerne holde dig til en af knapperne, indtil det virker.. :-)

Undgå altid Æ, Ø , Å

Brug aldrig "Æ,Ø,Å" i programmering.

Jeg bliver nødt til at smutte.. hvis du følger det jeg har skrevet, burde det virke, som det virker hos mig..

PS: Du bruger vel Visual Basic version 6, eller bare nyere end version 5, ikke..? :-)
Avatar billede skoefoed Nybegynder
18. august 2007 - 14:54 #25
Jeg bruger command1 nu, det gør det nemmere at overskue. :-)

Det er i orden. Jeg vil kæmpe lidt videre med det.

Tusind tak for den store hjælp.


PS: Jeg bruge VB 6.0. :-)
Avatar billede thesurfer Nybegynder
18. august 2007 - 19:07 #26
Er du kommet videre?
Avatar billede skoefoed Nybegynder
19. august 2007 - 13:20 #27
Nej. Den kommer stadig med samme fejl som sidst.

Men det virker hos dig?
Avatar billede thesurfer Nybegynder
20. august 2007 - 03:16 #28
Jeg er godt nok rusten til VB.. :-)

Jeg har lavet en smule om på koden, som nu virker..

Prøv denne kode, dvs., kopier hele koden og ikke kun dele af den:

Option Explicit
Dim arrFomler(1 To 3) As String

Private Sub command1_Click()
tbxFormler.Text = ""
tbxFormler.Text = findformler(tbxBogstaver.Text)
End Sub

Private Sub Form_Load()
arrFomler(1) = "a^2 + b^2 = c^2"
arrFomler(2) = "h * g * 0.5"
arrFomler(3) = "d = 4ac"
End Sub

Function findformler(valgte_bogstaver As String)
Dim arrBogstaver
arrBogstaver = Split(valgte_bogstaver, " ")

Dim i, j, formel, retur, fundet
retur = ""
For i = LBound(arrFomler) To UBound(arrFomler)
    formel = arrFomler(i)

    fundet = True
    For j = LBound(arrBogstaver) To UBound(arrBogstaver)

        If InStr(formel, arrBogstaver(j)) = 0 Then
            fundet = False
            Exit For
        End If

    Next
    If fundet = True Then retur = retur & formel & vbCrLf
Next

If retur = "" Then retur = "Der blev ikke fundet nogen formler med de indtastede bogstaver."

findformler = retur
End Function
Avatar billede skoefoed Nybegynder
20. august 2007 - 15:55 #29
Ovenstående koder virker! Super! :-)

Tillægsspørgsmål: Hvad hvis jeg fx har 2 forskellige "typer" arrays? Altså fx arrFomler og arrFomler2? Gør det det hele meget sværere?
Avatar billede skoefoed Nybegynder
20. august 2007 - 17:15 #30
.. og hvordan kan jeg adskille formlerne med linjeskift når de vises i tbxFormler?
Lige nu vises de bare i forlængelse af hinanden med 2 sorte streger imellem. Vil som sagt gerne have dem til at stå på linjen under. :-)
Avatar billede thesurfer Nybegynder
20. august 2007 - 20:13 #31
1) Forskellige arrays:

Du kalder bare denne nye funktion, med f.eks.:

tbxFormler.Text = findformler(arrFormler2, tbxBogstaver.Text)

Læg mærke til at du nu SKAL angive hvilken array den skal arbejde med.

Hele funktionen er her:


Function findformler(valgte_array As Variant, valgte_bogstaver As String)
Dim arrBogstaver
arrBogstaver = Split(valgte_bogstaver, " ")

Dim i, j, formel, retur, fundet
retur = ""
For i = LBound(valgte_array) To UBound(valgte_array)
    formel = valgte_array(i)

    fundet = True
    For j = LBound(arrBogstaver) To UBound(arrBogstaver)

        If InStr(formel, arrBogstaver(j)) = 0 Then
            fundet = False
            Exit For
        End If

    Next
    If fundet = True Then retur = retur & formel & vbCrLf
Next

If retur = "" Then retur = "Der blev ikke fundet nogen formler med de indtastede bogstaver."

findformler = retur
End Function



2) Grunden til at der kommer sorte streger/firkanter er, at du prøver på at indsætte linieskift i en textbox, der ikke har multiline slået til.
Derfor:
- Marker tbxFormler
- Kig under dens Egenskaber (eller Properties), som plejer at være i højre side af skærmen
- Find "MultiLine" og sæt vædien til "True" (eller "Sand")

Når du har gjort det, vil du kunne skrive på flere linier. Men læg mærke til, at du ikke får en scrollbar, når du skriver mange linier. Det skal du selv slå til.
Derfor:
- Marker "ScrollBars". Herefter vælger man typisk værdien "2-Vertical" for en lodret scrollbar. Du bestemmer selv hvilken af de 4 værdier du vil bruge.

- Svar :-)
Avatar billede skoefoed Nybegynder
20. august 2007 - 21:28 #32
Jeg forstår ikke, hvordan jeg skal angive, hvilken array den skal arbejde med? Skal jeg sætte den nye funktion ind, så der er 2 funktioner? Og hvor skal kaldet hen? Skal det være sammen med det "gamle kald"?

Jeg forstår det med multiline og scrollbars, men hvad hvis jeg vil have "en linje luft" mellem formlerne som findes?
Avatar billede thesurfer Nybegynder
20. august 2007 - 21:34 #33
Hmm.. Du læser åbenbart ikke mine indlæg grundigt igennem.. :-)

Jeg synes ellers at jeg skrev det soleklart her: :-)

---

1) Forskellige arrays:

Du kalder bare denne nye funktion, med f.eks.:

tbxFormler.Text = findformler(arrFormler2, tbxBogstaver.Text)

Læg mærke til at du nu SKAL angive hvilken array den skal arbejde med.

---


Du skal bare slette den gamle funktion, og bruge den nye funktion..

Linieskift hedder vbCrLf, og jeg bruger det her:

    If fundet = True Then retur = retur & formel & vbCrLf

Hvis du vil have flere linieskift, tilføjer du bare flere "vbCrLf"..

Eksempel:

    If fundet = True Then retur = retur & formel & vbCrLf & vbCrLf
Avatar billede skoefoed Nybegynder
20. august 2007 - 21:53 #34
Jeg har erstattet den nye funktion med den gamle, og sat det nye kald ind i stedet for det gamle. Det virker, men nu finder den ikke formlerne i de "gamle arrays". Forstår ikke, hvordan jeg vælger.

Angående linjeskift, så er jeg helt med her nu! Tak! :-)
Avatar billede thesurfer Nybegynder
20. august 2007 - 22:54 #35
Har du overhovedet lagt mærke til, at jeg har skrevet "arrFormler2" ind her?:

tbxFormler.Text = findformler(arrFormler2, tbxBogstaver.Text)

:-)

Som du muligvis kan se, kan du kun søge i 1 array ad gangen..

Du erstter bare "arrFormler2" med "arrFormler" i linien..

Hvis du skal kunne søge i flere på een gang, skal koden enten laves om, eller du kan lave flere kald efter hinanden..

Man du skal huske på, at indholdet af tbxFormler bliver over skrevet, hvis du gør sådan her:

tbxFormler.Text = "hello world"

Så vil den altid indeholde "hello world"..

Hvis du vil bruge nuværende funktion, til at søge i flere arrays, kan du f.eks. gøre sådan her:


Private Sub command1_Click()

tbxFormler.Text = ""
tbxFormler.Text = tbxFormler.Text & findformler(arrFormler, tbxBogstaver.Text)
tbxFormler.Text = tbxFormler.Text & vbCrLf ' indsæt et linieskift
tbxFormler.Text = tbxFormler.Text & findformler(arrFormler2, tbxBogstaver.Text)

End Sub
Avatar billede skoefoed Nybegynder
20. august 2007 - 23:01 #36
Jeg prøvede noget forskelligt før, men fik det ikke helt til at virke, havde ellers set, at du havde indsæt "arrFormler2"

Men nu virker det!! Mange tak for hjælpen. Du har været en stor hjælp, ved godt jeg er meget "rookie", så tusind tak!!
Avatar billede thesurfer Nybegynder
20. august 2007 - 23:07 #37
Jeg vil helt klart anbefale, at du låner en bog på biblioteket, om programmering i VB.. så famler du ikke i blinde..

Du kan hurtigt komme forbi "rookie"-niveaut, og til "øvet" / "god", hvis du sætter dig ned, og læser om emnerne..

Enhver "gennemsnitlig" programmør, burde have kunne lave de her ting selv, da det faktisk er simple ting man arbejder med..

Der burde være nogle gode bøger på biblioteket.. hvis der ikke er det, kan du evt. købe en bog, som andre (f.eks. her på Eksperten - du skal bare spørge) anbefaler..

Hvis du ikke vil bruge penge på bøger, kan du nemt finde en masse tutorials på nettet..
Du skal bare søge på ord som f.eks. "vb tutorial" eller "visual basic tutorial".. så er det bare at læse så mange tutorials som muligt.. :-)

- Takker for points! :-)
Avatar billede skoefoed Nybegynder
20. august 2007 - 23:18 #38
Jeg vil helt sikkert prøve biblioteket. Jeg har kun lige snuset til VB på HTX, men vores lærer var ikke ordentlig kvalificeret til at undervise i Programmering.

Men endnu en gang tak for hjælpen. :-)
Avatar billede thesurfer Nybegynder
20. august 2007 - 23:29 #39
Det er de squ aldrig.. man kan altid fange dem på det forkerte ben i et eller andet.. :-)
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