Avatar billede lillehans Nybegynder
07. december 2002 - 21:32 Der er 31 kommentarer og
1 løsning

Fritekst-søgning i VB 6.0

Jeg har følgende kode:
with list1
.additem "Bamse"
.additem "Dukkelise"
end with
private sub list1.click()
if list1.text = "Bamse" then
text1.text ="Bamse hører sammen med Dukkelise, men Bamse kan også optræde alene."
end if
if list1.text = "Dukkelise" then
text1.text ="Dukkelise hører sammen med Bamse, men Dukkelise kan også optræde alene."
end if
end sub
Problem: Jeg vil nu gerne søge på alle forekomster af eksempelvis Bamse i min list1Click, for eksempel i text2.text og få dem skrevet ud en for en med den tilhørende tekst (context)i for eksempel text3.text.
Hvordan skal en sådan kode se ud?
Avatar billede mikker Nybegynder
07. december 2002 - 22:09 #1
Den skal jeg nok lige have skåret ud i pap.
Hvor meget af din list1 vil du have gennemsøgt?
Hvad er det lige du vil have skal stå i hhv list2 og list3?

- Mikker
Avatar billede joern Nybegynder
07. december 2002 - 22:28 #2
Hej.
Jeg synes - trods den omstændige forklaring - heller ikke at det er ganske klart hvad du vil opnå.

Når jeg i lister vil søge flere forekomster af en søgestreng, så anvender jeg en tekstboks hvor jeg for hvert tegn (tekst1.change) gennemsøger enten filen som listens indhold kom fra, - eller bedre et array, der indeholder listens poster som en slags skygge.
Inden søgningen tømmes listen, og derpå tilføjes kun poster der indeholder søgeteksten. 
Kommandoen for at søge i f.eks. mit array er: InStr

Kodeeksempel fra projekt http://www.jkfsoft.dk/boger.htm

Private Sub txtsogtitel_Change()
  lstresu.Clear
  For t = 0 To total
    If InStr(LCase(titler(t)), LCase(txtsogtitel.Text)) > 0 Then lstresu.AddItem titler(t)
  Next
  If lstresu.ListCount = 1 Then
    lstresu.SetFocus
    lstresu.ListIndex = 0
    lstresu_Click
  End If
End Sub

M.v.h.  Jørn
Avatar billede lillehans Nybegynder
07. december 2002 - 22:29 #3
>Mikker, det er list1click og teksten der er indeholdt i if-sætningen, der skal undersøges. Det er eksempelvis alle 3 forekomster af "Bamse" men kunne også være Dukkelise, eller "hører" eller "sammen" eller "med". Der skal være tale om fritekstsøgning.
Avatar billede mikker Nybegynder
08. december 2002 - 14:26 #4
Jewg mener du skal bruge INSTR...

Forklarer nærmere senere, hvis ikke der er andre der kommer først :O)

- Mikker
Avatar billede lillehans Nybegynder
08. december 2002 - 15:59 #5
Tak. Jeg vil gerne bede om yderligere forklaring.
Altså jeg skriver søgeordet i text2.text. Resultatet søges i list1click og resultatet skal udskrives i text3.text.
Avatar billede mikker Nybegynder
08. december 2002 - 21:39 #6
Den laver lidt bøvl, men nu bliver jeg nødt til at gå i seng.
Vender nok tilbage imorgen engang.
Leg lidt med det :O)

Option Explicit
Option Compare Text 'så søger vi uafhængigt af U/L case
Private Sub Form_Load()
' text3 skal være multiline = true !!!
Text2 = "bamse" ' her har jeg valgt et ord for nemheds skyld
With List1
.AddItem "Bamse"
.AddItem "Dukkelise"
End With
End Sub

Private Sub list1_click()
Text3 = ""
' følgende kode skulle gerne søge efter det ord du har valgt.
' derefter vil sætnigen ('context') blive fundet og udskrevet
' jeg har valgt at bruge , & . som 'afbrydere'
Dim sord ' søgeordet
Dim svenstre, shojre ' søg højre og venstre
Dim venstrep, hojrep ' venstre og højre position
Dim sstart ' startposition
If List1.Text = "Bamse" Then
Text1.Text = "Bamse hører sammen med Dukkelise, men Bamse kan også optræde alene."
End If
If List1.Text = "Dukkelise" Then
Text1.Text = "Dukkelise hører sammen med Bamse, men Dukkelise kan også optræde alene."
End If
' instr returnerer en værdi - 0 hvis ingen sammenfald
' søg i text1 efter streng i text2
forfra:
sord = InStr(sstart, Text1, Text2)
' hvis ikke søgnignen passer skal vi tilbage til text2 og markere ordet
' så vi kan starte forfra
If sord = 0 Then Text2.SetFocus: Text2.SelStart = 0: Text2.SelLength = Len(Text2)
' hvis der er fundet noget og det ikke er det første bogstav
If sord > 1 Then
' vi tager et skridt til venstre for at undersøge
' om vi skal have dette tegn med
venstrep = sord - 1
' vi må ikke komme længere ned end til det første bogstav (venstrep = 1)
' så 'ryger vi ud over'
Do While Not venstrep <= 1
Select Case Mid(Text1, venstrep, 1)
' vi søger efter følgende tegn: komma & punktum
Case ".", ","
  Exit Do
Case Else
' ellers hopper vi endnu et tegn til venstre
  venstrep = venstrep - 1
End Select
Loop
End If
' nu til højre, hvis ikke det er det yderste tegn altså
If sord < Len(Text1) Then
hojrep = sord + 1
Do While Not hojrep >= Len(Text1)
Select Case Mid(Text1, hojrep, 1)
' vi søger efter følgende tegn: komma & punktum
Case ".", ","
  Exit Do
Case Else
' ellers hopper vi endnu et tegn til højre
  hojrep = hojrep + 1
End Select
Loop
End If
' fjern komma og punktum igen
If hojrep < Len(Text1) Then hojrep = hojrep - 1
If IsEmpty(venstrep) = True Then venstrep = 1
Text3 = Text3 & Mid(Text1, venstrep, hojrep)
If (hojrep + Len(Text2)) <= Len(Text1) Then
sord = InStr((hojrep + 1), Text1, Text2)
If sord > 0 Then sstart = hojrep + 1: Text3 = Text3 & vbCrLf: GoTo forfra
End If
End Sub

- Mikker
Avatar billede lillehans Nybegynder
09. december 2002 - 12:06 #7
Har set koderne. Vender nok først tilbage sent i aften. Er på arbejde nu. :O)
Avatar billede mikker Nybegynder
09. december 2002 - 20:41 #8
Jeg er ked af at lave om på det hele, men med lidt arbejde tror jeg denne vil virke bedre. Det er nemmere at rette den til, samt få den til at opføre sig ordentligt :O)

Det virker nok lidt rodet, men igen.... Leg lidt med det.
Hvis bare det nogenlunde minder om noget du på et tidspunkt kan bruge, så skal jeg gerne lege lidt mere med det. Hvis ikke du kan bruge det, så har jeg da i det mindste slappet af og hygget mig en times tid :O)

Option Explicit
Dim sstreng As String
Dim sord As String
Dim plac As Integer

Private Sub Form_Load()
List1.AddItem "test1"
List1.AddItem "test2"
List1.AddItem "test3"
End Sub

Private Sub List1_Click()
Dim startsog As Integer
Dim svar_sog As Long
Dim svar_hojre As Long
Dim svar_venstre As Long
Dim streng_start As Integer
Dim streng_slut As Integer
Dim vsog, hsog
startsog = 1
vsog = 1
hsog = 1
If List1.Text = "test1" Then
Text1 = "Dette er test nummer 1,der er ingen bamse, ingen dukkelise"
End If
If List1.Text = "test2" Then
Text1 = "Dette er test nummer 2,der er ingen dukkelise, ingen bamse"
End If
If List1.Text = "test3" Then
Text1 = "Dette er test nummer 3. Her er både bamse og dukkelise. Bamse er her endda to gange"
End If
svar_sog = InStr(startsog, Text1, Text2, vbTextCompare)
If svar_sog = 0 Or svar_sog = Null Then
With Text2
    .SetFocus
    .SelLength = Len(Text2)
    .SelStart = 0
End With
End If
If Len(Text1) > ((svar_sog + Len(Text2)) - 1) Then
svar_hojre = InStr((svar_sog + Len(Text2)), Text1, ".", vbTextCompare)
End If
If svar_sog > 1 Then
svar_venstre = InStrRev(Text1, ".", svar_sog, vbTextCompare)
End If
If svar_venstre = 0 Or svar_venstre = Null Then
    streng_start = 1
Else
    streng_start = svar_venstre
End If
If svar_hojre = 0 Or svar_hojre = Null Then
    streng_slut = Len(Text1)
Else
    streng_slut = (svar_hojre - svar_venstre)
End If
Text3 = Mid(Text1, streng_start, streng_slut)
End Sub

- Mikker

P.S. Denne udgave søger kun efter punktum, som afbrydere...
Avatar billede mikker Nybegynder
09. december 2002 - 20:48 #9
Jeg har lige rettet en _mindre_ fejl jeg havde lavet, så nu skriver dne _kun_ i text3, hvis der rent faktisk _ER_ et resultat :O)

Option Explicit
Dim sstreng As String
Dim sord As String
Dim plac As Integer

Private Sub Form_Load()
List1.AddItem "test1"
List1.AddItem "test2"
List1.AddItem "test3"
End Sub

Private Sub List1_Click()
Dim startsog As Integer
Dim svar_sog As Long
Dim svar_hojre As Long
Dim svar_venstre As Long
Dim streng_start As Integer
Dim streng_slut As Integer
Dim vsog, hsog
startsog = 1
vsog = 1
hsog = 1
If List1.Text = "test1" Then
Text1 = "Dette er test nummer 1,der er ingen bamse, ingen dukkelise"
End If
If List1.Text = "test2" Then
Text1 = "Dette er test nummer 2,der er ingen dukkelise, ingen bamse"
End If
If List1.Text = "test3" Then
Text1 = "Dette er test nummer 3. Her er både bamse og dukkelise. Bamse er her endda to gange"
End If
svar_sog = InStr(startsog, Text1, Text2, vbTextCompare)
If svar_sog = 0 Or svar_sog = Null Then
With Text2
    .SetFocus
    .SelLength = Len(Text2)
    .SelStart = 0
End With
Else
If Len(Text1) > ((svar_sog + Len(Text2)) - 1) Then
svar_hojre = InStr((svar_sog + Len(Text2)), Text1, ".", vbTextCompare)
End If
If svar_sog > 1 Then
svar_venstre = InStrRev(Text1, ".", svar_sog, vbTextCompare)
End If
If svar_venstre = 0 Or svar_venstre = Null Then
    streng_start = 1
Else
    streng_start = svar_venstre
End If
If svar_hojre = 0 Or svar_hojre = Null Then
    streng_slut = Len(Text1)
Else
    streng_slut = (svar_hojre - svar_venstre)
End If
Text3 = Mid(Text1, streng_start, streng_slut)
End If
End Sub

- Mikker
Avatar billede lillehans Nybegynder
09. december 2002 - 23:08 #10
>Mikker. Det er et stort stykke arbejde du har lavet, tak for det. Men du har nok misforstået mig. Det jeg ville var at indtaste et søgeord i text2.text, hvorefter programmet automatisk skulle gennemsøge den tekst, der er anført i de respektive If-end sætninger i list1.click. Men det var ikke meningen, at jeg selv skulle klikke i list1 for at få undersøgt teksten. Forestil dig, at jeg har 10.000 if-end'er?
Kunne du ændre programmet til:
"Hvis et af de ord, der er anført et eller andet sted mellem if-endif i hele list1.click er = søgeordet i text2.text så skriv dette ord i text3.text hver gang det forekommer"? Måske kan man slet ikke gennelæse indholdet af list1.click automatisk?
Avatar billede mikker Nybegynder
10. december 2002 - 15:04 #11
Troede bare det var det du ville, eftersom selve sub'en hedder list1_click.
Jeg regnede faktisk med, at du ville bruge det til at søge i en hvilken som helst tekst...

Anyway.
Ifølge hvad du siger _nu_ er list1 ikke længere nødvendig - Korrekt?
Hvis man skriver et ord i text2 og trykker <enter> er det godt nok - Korrekt?
Du vil stadig have mere end bare det ord der er skrevet i text2 - Korrekt?

Nu tror jeg tiøren faldt :O)

Hvad med det her:

Option Compare Text
Private Sub Command1_Click()
Text3 = ""
For i = 0 To (List1.ListCount - 1)
If List1.List(i) = Text2 Then
If Text2 = "bamse" Then
Text3 = Text3 & "Bamse hører sammen med Dukkelise, men Bamse kan også optræde alene."
Text3 = Text3 & vbCrLf
End If
If Text2 = "dukkelise" Then
Text3 = Text3 & "Dukkelise hører sammen med Bamse, men Dukkelise kan også optræde alene."
Text3 = Text3 & vbCrLf
End If
End If
Next i
End Sub

Private Sub Form_Load()
' husk at sætte text3.multiline = true
List1.AddItem "bamse"
List1.AddItem "dukkelise"
End Sub

- Mikker
Avatar billede mikker Nybegynder
10. december 2002 - 15:05 #12
Du er stadig nødt til at trykke på en knap (command1), men jeg håber det er iorden...

- Mikker
Avatar billede lillehans Nybegynder
10. december 2002 - 22:21 #13
>Mikker fejlen er jo min. Det ser rigtigt ud, men jeg får først prøvet det i morgen. Foreløbig tak, endnu engang.
Avatar billede lillehans Nybegynder
11. december 2002 - 13:58 #14
>mikker Tampen brænder. Fantastisk at du stadig hænger på.:o)
If List1.List(i) = Text2 Then
text3= skal være lig text1.text i nedenstående:
text1.text ="Bamse hører sammen med Dukkelise, men Bamse kan også optræde alene."
Det er ikke meningen, at jeg igen skal skrive sætningen "Bamse hører..osv" det er meningen at denne tekst skal komme frem i text3. Det er altså rigtigt, det du koder, men teksten skal ikke skrives igen af mig/bruger. Der er jo allerede skrevet en tekst, og det er den der skal vises. Der skal altså ikke søges på de items jeg har lavet men i den tilhørende tekst til disse items. Der skal søges i text1.text ved at indtaste et ord i text2. Det er helt ok med command1.click.
Avatar billede lillehans Nybegynder
11. december 2002 - 14:27 #15
Se her mikker
with list1
.additem &#8221;Test1&#8221;
.additem &#8221;Test2&#8221;
end with
list1.click
If  list1.click = Test1&#8221; then
text1.text = &#8220;Dette er test1 første item&#8221;
end if
If  list1.click = &#8220;Test2&#8221; then
text1.text = &#8220;Dette er test2 andet item&#8221;
end if
end sub
Det er altså min kode.
Og så problemet jeg vil søge fritekst:
Altså hvis text2.text = &#8221;første&#8221; then
i text3 skal så fremkomme hele sætningen&#8221;Dette er test1 første item&#8221;
hvis text2.text = &#8220;test1&#8221;
skal I text3 fremkomme hele sætningen&#8221;Dette er test1 første item&#8221;
Er du med nu?
Avatar billede lillehans Nybegynder
11. december 2002 - 14:30 #16
Se her mikker
with list1
.additem &#8221;Test1&#8221;
.additem &#8221;Test2&#8221;
end with
list1.click
If  list1.click = "Test1" then
text1.text = "Dette er test1 første item"
end if
If  list1.click = "Test2" then
text1.text = "Dette er test2 andet item"
end if
end sub
Det er altså min kode.
Og så problemet jeg vil søge fritekst:
Altså hvis text2.text = "første" then
i text3 skal så fremkomme "Dette er test1 første item"
hvis text2.text = "test1"
skal I text3 fremkomme "Dette er test1 første item"
Er du med nu?
Avatar billede lillehans Nybegynder
11. december 2002 - 14:31 #17
Se her mikker
with list1
.additem "Test1"
.additem "Test2"
end with
Avatar billede lillehans Nybegynder
11. december 2002 - 14:33 #18
Undskyld rodet. Word og Eksperten har det ikke godt med hinanden, når der skal oversættes anførselstegn ved kopiering. Håber du kan finde ud af det alligevel.
Avatar billede mikker Nybegynder
11. december 2002 - 14:38 #19
Så hvis du indtaster 'hører' i text2
Skal der komme 2 linier i text3, nemlig _både_
"Bamse hører sammen med Dukkelise, men Bamse kan også optræde alene."
_OG_
"Dukkelise hører sammen med Bamse, men Dukkelise kan også optræde alene."

Fordi ordet 'hører' findes begge steder? Nærmer jeg mig?

- Mikker
Avatar billede mikker Nybegynder
11. december 2002 - 15:10 #20
Hej igen...

Glem list1_click()
Du sidder fast i dine idéer. list1_click() er kun brugbar, hvis du _selv_ vil 'klikke' i list1. Nu er vi blevet enige om command1_click() Ikke sandt?
_GODT_. Næste spørgsmål:

Hvad fand** er det du vil med alle de if..end if sætninger?
Hvad vil du i det hele taget med list1?
Hvad skal du bruge text1 til?
Hele idéen virker mere og mere absurd og du gør tingene flere gange.
Først skriver du svarerne i if...end if sætninger, så lægger du nogle 'items' med søgemuligheder ind i list1 og så søger du bagefter?????? !!!!

Prøv at beskrive hvad du skal bruge det til, så kan det være vi kan finde en mere rationel måde at håndtere tingene på.

Anyway, selvfølgelig vil jeg hjælpe, men jag kan ikke få mig selv til at lave noget der med fuldt overlæg er klodset. Det kan godt være jeg _er_ klodset, men jeg _prøver_ at æade være :O)

Næste forsøg:
Ligner meget det sidste, men er sikkert helt forkert.
Du bliver ved med at insistere på, at bruge list1, så jeg har flyttet alle dine if..end if sætninger over til at være 'items' i list1.

ALSOOOO! Voila

Private Sub Command1_Click()
Text3 = ""
For i = 0 To (List1.ListCount - 1)
res = InStr(1, List1.List(i), Text2, vbTextCompare)
If res > 0 Then
Text3 = Text3 & List1.List(i)
Text3 = Text3 & vbCrLf
End If
Next i
End Sub

Private Sub Form_Load()
' husk at sætte text3.multiline = true
List1.AddItem "Bamse hører sammen med Dukkelise, men Bamse kan også optræde alene."
List1.AddItem "Dukkelise hører sammen med Bamse, men Dukkelise kan også optræde alene."
List1.AddItem "Lisebamsen hører bare ikke efter"
End Sub
Avatar billede lillehans Nybegynder
11. december 2002 - 16:30 #21
Flot klarer mikker, tusind tak! Det var præcis det jeg ønskede.Måske har jeg ud over problemer med VB også problemer med at udtrykke mig på dansk, slår det mig pludselig. Men det skal jeg nok have hjælp til andetsteds!:o))
Jeg har en lærebog i VB, der er forsynet med et stikordsregister. Dette er ikke særlig udtømmende, og jeg bruger lang tid på at finde ting, som jeg ved, at jeg har set i bogen på et eller andet tidspunkt. Tænk hvis bogen havde været på CD og jeg kunne søge ved hjælp af et eller andet tilfældigt ord?
Det er altså en slags udvidet indholdsfortegnelse jeg arbejder med. Det hele er kun for sjov, men man lærer nok bedst ved at skulle bruge koderne til noget konkret. Det kan sikkert gøres meget mere elegant, men jeg må jo tage et skridt af gangen.
Avatar billede mikker Nybegynder
11. december 2002 - 17:10 #22
JUUUUHUUUUUUUUU !!!! :o)  DET LYKKEDES. FANTASTISK.

Takker for point, men hvis du har lyst til at 'tage et skridt mere' så se på nedenstående kode. Problemet med den sidste kodestump du fik er, at den tager ordet 'lise' fra 'dukkelise' og mener det er super.
Derudover har jeg tilladt mig at markere det ord du har søgt.
Anyway, prøv det.

Glædelig jul og godt nytår

Private Sub Command1_Click()
Text3 = ""
For i = 0 To (List1.ListCount - 1)
res = InStr(1, List1.List(i), Text2, vbTextCompare)
If res > 0 Then
    If res = 1 And Mid(List1.List(i), (res + Len(Text2)), 1) Like "[!a-z]" = True Then
        repfra$ = List1.List(i)
        repmed$ = "[" & Text2 & "]"
        Text3 = Text3 & Replace(repfra$, Text2, repmed, 1, , vbTextCompare)
        Text3 = Text3 & vbCrLf
    End If
    If (res + Len(Text2)) >= Len(List1.List(i)) Then
        repfra$ = List1.List(i)
        repmed$ = "[" & Text2 & "]"
        Text3 = Text3 & Replace(repfra$, Text2, repmed, 1, , vbTextCompare)
        Text3 = Text3 & vbCrLf
    End If
    If res > 1 And res < (Len(List1.List(i)) - Len(Text2)) Then
    If Mid(List1.List(i), (res + Len(Text2)), 1) Like "[!a-z]" = True And Mid(List1.List(i), (res - 1), 1) Like "[!a-z]" = True Then
        repfra$ = List1.List(i)
        repmed$ = "[" & Text2 & "]"
        Text3 = Text3 & Replace(repfra$, Text2, repmed, 1, , vbTextCompare)
        Text3 = Text3 & vbCrLf
    End If: End If
End If
Next i
With Text2
.SelLength = Len(Text2)
.SelStart = 0
.SetFocus
End With
End Sub

Private Sub Form_Load()
' husk at sætte text3.multiline = true
List1.AddItem "Bamse hører sammen med Dukkelise, men Bamse kan også optræde alene."
List1.AddItem "Dukkelise hører sammen med Bamse, men Dukkelise kan også optræde alene."
List1.AddItem "Lisebamsen hører bare ikke efter"
End Sub


- Mikker
Avatar billede mikker Nybegynder
11. december 2002 - 17:14 #23
Jeg LOVER det er sidste gang jeg retter i min kode, men den var sgu ikke så elegant og slet ikke gennemført :O)

Private Sub Command1_Click()
Text3 = ""
For i = 0 To (List1.ListCount - 1)
res = InStr(1, List1.List(i), Text2, vbTextCompare)
If res > 0 Then
    If res = 1 And Mid(List1.List(i), (res + Len(Text2)), 1) Like "[!a-z]" = True Then
        repfra$ = List1.List(i)
        repmed$ = "[" & UCase(Text2) & "]"
        Text3 = Text3 & Replace(repfra$, Text2, repmed, 1, , vbTextCompare)
        Text3 = Text3 & vbCrLf
    End If
    If (res + Len(Text2)) >= Len(List1.List(i)) Then
        repfra$ = List1.List(i)
        repmed$ = "[" & UCase(Text2) & "]"
        Text3 = Text3 & Replace(repfra$, Text2, repmed, 1, , vbTextCompare)
        Text3 = Text3 & vbCrLf
    End If
    If res > 1 And res < (Len(List1.List(i)) - Len(Text2)) Then
    If Mid(List1.List(i), (res + Len(Text2)), 1) Like "[!a-z]" = True And Mid(List1.List(i), (res - 1), 1) Like "[!a-z]" = True Then
        repfra$ = List1.List(i)
        repmed$ = "[" & UCase(Text2) & "]"
        Text3 = Text3 & Replace(repfra$, Text2, repmed, 1, , vbTextCompare)
        Text3 = Text3 & vbCrLf
    End If: End If
End If
Next i
With Text2
.SelStart = 0
.SelLength = Len(Text2)
.SetFocus
End With
End Sub

Private Sub Form_Load()
' husk at sætte text3.multiline = true
List1.AddItem "Bamse hører sammen med Dukkelise, men Bamse kan også optræde alene."
List1.AddItem "Dukkelise hører sammen med Bamse, men Dukkelise kan også optræde alene."
List1.AddItem "Lisebamsen hører bare ikke efter"
End Sub
Avatar billede mikker Nybegynder
11. december 2002 - 17:15 #24
Spørg _endelig_ løs, hvis du har spørgsmål. Jeg hygger mig usigeligt når jeg har projekter at lege med :O)

- Mikker
Avatar billede lillehans Nybegynder
11. december 2002 - 22:08 #25
>mikker. Mange tak for dit tilbud! Jeg får først mulighed for at studere din udvidede kode i løbet af i morgen. Men forærer du nu ikke det hele væk i stedet for at få point? :o))
Avatar billede mikker Nybegynder
12. december 2002 - 16:02 #26
Det er nu ikke pointene der er vigtige for mig. Det gælder om at lære, husk på, at jeg også lærer mens jeg prøver at løse opgaven.
Det sjove er jo netop at have en opgave, istedet for at have en halv idé om et eller andet man godt kunne tænke sig.
Sådanne idéer får jeg aldrig lavet til ende :O)

- Mikker
Avatar billede lillehans Nybegynder
15. december 2002 - 20:29 #27
>Mikker, suk. Det er desværre ikke rigtigt, endnu. Din kode søger fint i list.index, men det er jo sætningen i handlingsdelen, der skal søges på.
with list1
.additem "Test1"
.additem "Test2"
end with
list1.click
If  list1.click = "Test1" then
text1.text = "Dette er test1 første item"
end if
If  list1.click = "Test2" then
text1.text = "Dette er test2 andet item"
end if
end sub
Der skal altså søges i text1.text "Dette er test1 første item"
og text1.text "Dette er test2 andet item"
ved at indtaste et søgeord i fx text2. Du skal glemme, at if'erne står i en list. If'erne skal altså opfattes som en database!
Gider du stadig hjælpe?
Avatar billede mikker Nybegynder
16. december 2002 - 18:19 #28
Du siger, at det er en udvidet indholdsfortegnelse.
Så lad mig spørge således:

Hvis nu man indtastede "b" i TEXT1
så kom alle ordene i indholdsfortegnelsen, der startede med "b" i LIST1
Altså ord, som DU har bestemt skal være i indholdsfortegnelsen?
Derefter kan man klikke i list1 og få vist forklaringen, eller 'indholdet' i TEXT2 ?

Jeg vil MEGET gerne hjælpe dig, men jeg har ikke lige tid idag og jeg har en 14 timers vagt imorgen, så jeg kan ikke love noget før onsdag...

- Mikker
Avatar billede mikker Nybegynder
19. december 2002 - 16:55 #29
Her er det næste løsningsforslag...

Læg mærke til, at jeg har brugt en .txt fil med navnet indhold.txt.
Dette er naturligvis ikke nødvendigt for dig, hvis du kæder det sammen med databsen med det samme. Jeg har følgende på min form:

list1, text1, text2, text3, command1, command2

text2 og command1 har ikke længere nogen effekt. Gør følgende for at test programmet:

start programmet og click command2.
Stop og genstart programmet... !!! :O)

Nu skulle du gerne have nogle items i din list1 ? GODT
prøv så at skrive noget text i text1 og tryk <enter>.

Hvis alt virker som hos mig, vil du kunne lide hvad du ser. HÅBER jeg da :O)

Private Sub Command2_Click()
If Right(App.Path, 1) <> "\" Then
gem$ = App.Path & "\indhold.txt"
Else
gem$ = App.Path & "indhold.txt"
End If
Text1 = App.Path
Open gem$ For Output As #1
For antord = 1 To 18
If antord = 1 Then nytord$ = "Abstraktion"
If antord = 2 Then nytord$ = "access"
If antord = 3 Then nytord$ = "Active Server Pages"
If antord = 4 Then nytord$ = "backcolor"
If antord = 5 Then nytord$ = "Basic"
If antord = 6 Then nytord$ = "Beregning"
If antord = 7 Then nytord$ = "C++"
If antord = 8 Then nytord$ = "Cancel"
If antord = 9 Then nytord$ = "DAO"
If antord = 10 Then nytord$ = "Data"
If antord = 11 Then nytord$ = "Database"
If antord = 12 Then nytord$ = "Farve"
If antord = 13 Then nytord$ = "Fejl"
If antord = 14 Then nytord$ = "Figur"
If antord = 15 Then nytord$ = "Gates, Bill"
If antord = 16 Then nytord$ = "Gem"
If antord = 17 Then nytord$ = "Get"
If antord = 18 Then nytord$ = "Hej"
Write #1, nytord$, "Forklaring til " & nytord$
Next antord
Close
End Sub

Private Sub Form_Load()
Dim nytord$
Text1.TabIndex = 0
List1.TabIndex = 1
' husk at sætte text3.multiline = true
If Right(App.Path, 1) <> "\" Then
hent$ = App.Path & "\indhold.txt"
Else
hent$ = App.Path & "indhold.txt"
End If
Open hent$ For Input As #1
Do While Not EOF(1)
Input #1, nytord$, forklaring$
List1.AddItem nytord$
Loop
Close
End Sub

Private Sub Text1_Change()
For a = 0 To List1.ListCount - 1
If UCase(Left(List1.List(a), (Len(Text1)))) = UCase(Text1) Then
List1.ListIndex = a
List1.Selected(a) = True
Exit For
Else: List1.Selected(a) = False
End If
Next a
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
If List1.ListIndex = -1 Then List1.ListIndex = 0
If KeyAscii = 13 Then ' 13 er <Enter>
If Right(App.Path, 1) <> "\" Then
hent$ = App.Path & "\indhold.txt"
Else
hent$ = App.Path & "indhold.txt"
End If
Open hent$ For Input As #1
Do While Not EOF(1)
DoEvents
Input #1, nytord$, forklaring$
If nytord$ = List1.List(List1.ListIndex) Then
Text3 = forklaring$
Exit Do
End If
Loop
Close
End If
End Sub


God fornøjelse og glædelig jul
- Mikker
Avatar billede mikker Nybegynder
19. december 2002 - 17:04 #30
Der var jeg lige en tand for hurtig.

Du får naturligvis en fejl første gang du forsøger at starte programmet...

Her er lige en ny version hvor jeg bruger command1 til at hente filen og fylde list1.

Private Sub Command1_Click()
If Right(App.Path, 1) <> "\" Then
hent$ = App.Path & "\indhold.txt"
Else
hent$ = App.Path & "indhold.txt"
End If
Open hent$ For Input As #1
Do While Not EOF(1)
Input #1, nytord$, forklaring$
List1.AddItem nytord$
Loop
Close
End Sub

Private Sub Command2_Click()
If Right(App.Path, 1) <> "\" Then
gem$ = App.Path & "\indhold.txt"
Else
gem$ = App.Path & "indhold.txt"
End If
Text1 = App.Path
Open gem$ For Output As #1
For antord = 1 To 18
If antord = 1 Then nytord$ = "Abstraktion"
If antord = 2 Then nytord$ = "access"
If antord = 3 Then nytord$ = "Active Server Pages"
If antord = 4 Then nytord$ = "backcolor"
If antord = 5 Then nytord$ = "Basic"
If antord = 6 Then nytord$ = "Beregning"
If antord = 7 Then nytord$ = "C++"
If antord = 8 Then nytord$ = "Cancel"
If antord = 9 Then nytord$ = "DAO"
If antord = 10 Then nytord$ = "Data"
If antord = 11 Then nytord$ = "Database"
If antord = 12 Then nytord$ = "Farve"
If antord = 13 Then nytord$ = "Fejl"
If antord = 14 Then nytord$ = "Figur"
If antord = 15 Then nytord$ = "Gates, Bill"
If antord = 16 Then nytord$ = "Gem"
If antord = 17 Then nytord$ = "Get"
If antord = 18 Then nytord$ = "Hej"
Write #1, nytord$, "Forklaring til " & nytord$
Next antord
Close
End Sub

Private Sub Form_Load()
' husk at sætte text3.multiline = true
Text1.TabIndex = 0
List1.TabIndex = 1
End Sub

Private Sub Text1_Change()
For a = 0 To List1.ListCount - 1
If UCase(Left(List1.List(a), (Len(Text1)))) = UCase(Text1) Then
List1.ListIndex = a
List1.Selected(a) = True
Exit For
Else: List1.Selected(a) = False
End If
Next a
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
If List1.ListIndex = -1 Then List1.ListIndex = 0
If KeyAscii = 13 Then ' 13 er <Enter>
If Right(App.Path, 1) <> "\" Then
hent$ = App.Path & "\indhold.txt"
Else
hent$ = App.Path & "indhold.txt"
End If
Open hent$ For Input As #1
Do While Not EOF(1)
DoEvents
Input #1, nytord$, forklaring$
If nytord$ = List1.List(List1.ListIndex) Then
Text3 = forklaring$
Exit Do
End If
Loop
Close
End If
End Sub


- Mikker
Avatar billede lillehans Nybegynder
28. december 2002 - 22:23 #31
>Mikker, du har bestemt været en stor hjælp, og jeg ville gerne give dig nogle flere point. Men det ved jeg ikke, hvordan jeg gør nu, når spørgsmålet er lukket. Men.. det er jo stadig på fx "Abstraktion" der søges. Og ikke i "forklaringen" til "Abstraktion". Men det kan nok ikke lade sig gøre.
Godt nytår!
Avatar billede mikker Nybegynder
28. december 2002 - 22:33 #32
Selvfølgelig kan det lade sig gøre, jeg har da vist dig mere end en måde at søge i tekst.
Anyway, jeg har nok bare ikke forstået opgaven ordentligt.

Godt nytår til dig også :O)

- Mikker
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