Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Szukanie w bazie .dat
ixe




Typ: neutral
Postów: 5
Zarejestrowany: Apr 2004
Szukanie w bazie .dat

Mam mały problem z szukaniem słów w słowniku w pliku dat. Kod podaje mi tylko ostanie znalezione słowo w bazie a chce żeby podawało każde po kolei do końca, mam:

Private Sub Command13_Click()
Label5.Caption = "Brak słów"

Label5.Visible = False
Open "baza.dat" For Input As #1
2
If EOF(1) = True Then GoTo 3
Input #1, z1$
Input #1, z2$
    If UCase(z2$) = UCase(Text2.text) Then
        Label5.Caption = LCase(z1$)
       
       
    End If
GoTo 2
3
Close #1
Label5.Visible = True
End Sub


Jak ktoś wie jak to przerobić to będe wdzięczny.

13-04-2004 00:06
Pokaż profil ixe  Wyślij email do ixe   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Przecież przed wyszukiwaniem wstawiłeś :
Label5.Visible = False
i dopiero na końcu wyszukiwania
Label5.Visible = True
więc kolejne wyniki pozytywne wyszukiwania są niewidoczne, a nawet gdy usuniesz Label5.Visible=False to i tak bez żadnego chociażby MsgBox nie zdążyłbyś zobaczyć wyniku pozytywnego innego niż ostatni? (chyba, że masz takie "szybkie oko" )(Tak brzydko napisałeś, a bez skoków nie można, w ładnej pętli, Jelcyn byłby niezadowolony... )

Private Sub Command13_Click()
Label5.Caption = "Brak słów"


Label5.Visible = False
Open "baza.dat" For Input As #1
2
If EOF(1) = True Then GoTo 3
Input #1, z1$
Input #1, z2$
    If UCase(z2$) = UCase(Text2.text) Then
        Label5.Caption = LCase(z1$)
       
       
    End If
GoTo 2
3
Close #1

Label5.Visible = True
End Sub

P.S. Może powinieneś uzyć również Trim ?

Pozdrawiam - Karolina


_____________________________________________
Karolina

13-04-2004 02:06
Pokaż profil karolinavb  Wyślij email do karolinavb   
ixe




Typ: neutral
Postów: 5
Zarejestrowany: Apr 2004
solution

Tak tylko ciągle nie wiem jak zrobić żeby zatrzymywał się po każdym naciśnięciu butonu na kolejnym słowie a nie leciał do końca, niby takie proste a jednak.
Jak ktoś wie to prosze.

13-04-2004 10:05
Pokaż profil ixe  Wyślij email do ixe   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Możesz spróbowac tak np (szuka na "okrągło" ):
(Brak obługi błędów, trzeba dopisać...., plik może przecież być źle wypełniony..., komunikaty gdy zawartość text2 jest pusta itd...). Nie wiem też jak wyglada całość kodu...Dobrze byłoby ścieżkę do pliku podać w zależności np od ścieżki do aplikacji app.path itd...

Private Sub Command13_Click()
Dim z1$, z2$
Static dblLastPos As Double
Dim dblPos As Double
Dim bEof As Boolean

Label5.Caption = "Brak słów"
Label5.Visible = False
Open "baza.dat" For Input As #1
Do Until bEof
    If Not EOF(1) Then
        Input #1, z1$
        ' może brakować 2-giej kolumny
        If Not EOF(1) Then
            Input #1, z2$
            dblPos = Seek(1)
            If dblPos > dblLastPos Then
                If Trim(Len(z1$)) > 0 _
                    And Trim(Len(z2$)) > 0 _
                    And Trim(UCase(z2$)) = Trim(UCase(text2.Text)) Then
                    Label5.Caption = LCase(z1$)
                    dblLastPos = dblPos
                    Exit Do
                Else
                    dblLastPos = dblPos
                End If
            End If
        Else
          bEof = True
            dblLastPos = 0
            Exit Do
        End If
    Else
        bEof = True
        dblLastPos = 0
        Exit Do
    End If
Loop
Close #1
Label5.Visible = True
End Sub

Pozdrawiam Karolina


_____________________________________________
Karolina

13-04-2004 12:27
Pokaż profil karolinavb  Wyślij email do karolinavb   
ixe




Typ: neutral
Postów: 5
Zarejestrowany: Apr 2004
super

No teraz jest super. Może dało by się to jeszcze przerobić tak żeby wszystkie poszczególne znalezione słowa wyświetlił po przecinku w jednej labelce? Może się to też innym przydać.

13-04-2004 12:54
Pokaż profil ixe  Wyślij email do ixe   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Jesli chcesz umieścić wszystkie znalezione słowa w jednej kontrolce, to nie może to być kontrolka Label, ponieważ, gdy będzie ich więcej po prostu ich nie zobaczysz. Musisz wtedy zastosować kontrolkę, która umożliwia przesuwanie tekstu (scroll) np TextBox alabo ListBox. Poniżej wykorzystałam dla uproszczenia  TextBox.
1. Nazwałam ją txtSlowa
2. Właściwość ScrollBars kontrolki ustawiłam na vertical
3. Własciwość Multiline na True
4. Ponadto w częci Genelar formy zadeklarowałam funkcję PostMessage, która pozwala na "scrollowanie" tekstu w kontrolce tTexBox, przykład zaczerpnęłam ze strony http://www.visualbasicforum.com/showthread.php?t=2522
5. Zamiast przecinka jest vbCrLf

Częśc General formy
Option Explicit
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const EM_LINESCROLL = &HB6


Private Sub Command13_Click()
' nie zapomnij o chociaz najbardziej prostej obludze bledow
On Error GoTo lerror
Dim z1$, z2$
Static dblLastPos As Double
Dim dblPos As Double
Dim bEof As Boolean

txtSlowa.Visible = False
If dblLastPos = 0 Then
    txtSlowa.Text = "Brak słów"
End If
Open App.Path & "\baza.dat" For Input As #1
Do Until bEof
    If Not EOF(1) Then
        Input #1, z1$
        If Not EOF(1) Then
            Input #1, z2$
            dblPos = Seek(1)
            If dblPos > dblLastPos Then
                If Trim(Len(z1$)) > 0 _
                    And Trim(Len(z2$)) > 0 _
                    And Trim(UCase(z2$)) = Trim(UCase(text2.Text)) Then
                    If dblLastPos = 0 Then
                        txtSlowa.Text = LCase(z1$)
                    Else
                        txtSlowa.Text = txtSlowa.Text & vbCrLf & LCase(z1$)
                    End If
                    ' http://www.visualbasicforum.com/showthread.php?t=2522
                    PostMessage txtSlowa.hwnd, EM_LINESCROLL, 0&, 2& 'przesuwa w dol 2 linie, lub to bottom
                    dblLastPos = dblPos
                    Exit Do
                Else
                    dblLastPos = dblPos
                End If
            End If
        Else
          bEof = True
            dblLastPos = 0
            Exit Do
        End If
    Else
        bEof = True
        dblLastPos = 0
        Exit Do
    End If
Loop
Close #1
txtSlowa.Visible = True
Exit Sub
lerror:
    MsgBox (Err.Description & "  " & Err.Number)
End Sub

Pozdrawiam Karolina
P.S. Nie jest to żadne szcególnie świetne rozwiązanie to tylko szybko zrobiony przykład...


_____________________________________________
Karolina

13-04-2004 13:50
Pokaż profil karolinavb  Wyślij email do karolinavb   
ixe




Typ: neutral
Postów: 5
Zarejestrowany: Apr 2004
ok

To poprzednie rozwiązanie jest chyba lepsze tutaj dobrze by było aby po jednym kliknięciu pokazał wszystkie słowa odrazu. Dzięki

13-04-2004 14:25
Pokaż profil ixe  Wyślij email do ixe   
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Na początku, zanim zaczyna się pisać kod należy zrobić założenia,sprecyzowac do czego zmierzamy, bo jeśli ciągle zmieniamy plany i przerabiamy kod to już nie jest program tylko bałagan powstający z ciągłych przeróbek, więc sprecyzuj dokładne założenia, czego oczekuje użytkownik.
Z Twojego kodu wynika co innego, a z tego co potem piszesz co innego. W kontrolce Label można zobaczyć tylko tyle tekstu jaki wymiar kontrolki sobie narzucamy, chyba że dynamicznie będziemy zmieniać wymiar tylko po co jak są inne kontrolki, w których można przesuwac tekst . Przecież nie wiesz z góry ile jest tych słów, a jak 500 to co ? Jak chcesz je zobaczyć razem ?

P.S. Ja do obsługi zwykłych plików używam FileSystemObject, a do obsługi plików dat zorganizowanych w kolumny (jak się domyślam u Ciebie) ADO
Pozdrawiam Karolina


_____________________________________________
Karolina

13-04-2004 14:40
Pokaż profil karolinavb  Wyślij email do karolinavb   
ixe




Typ: neutral
Postów: 5
Zarejestrowany: Apr 2004
ok

Jest ok pierwsze rozwiązanie spełnia swoje zadanie

13-04-2004 14:44
Pokaż profil ixe  Wyślij email do ixe   
Wszystkich odpowiedzi: 8 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1