Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    VB6 - Modulo di ricerca file

    Ciao!
    Ho creato un software per gestire tutti i miei mp3!
    Tutto ok funziona. Mi crea un elenco di tutti i file audio contenuti nella mia cartella musica.

    Il punto è che vorrei fare un modulo di ricerca, anche sin qui saprei come muovermi! Solo che io vorrei farlo intuitivo!

    Esempio:

    Se io ho il file "pinco pallino canta.mp3" e nel modulo scrivo "pinco" non me lo troverà mai! Dovrei scrivere proprio esattamente il nome del file!

    Come posso fare? è molto difficile?

    HELP!

  2. #2
    Ciao..no, non è difficile. Innanzitutto, se utilizzi una listbox per come elenco dei file, ti posso postare un codice che, appena scrivi una lettera, si posiziona alla prima voce che inizia con quella lettera e così via.. Comunque tempo fa postai una funzione apposita, magari anche troppo complessa: io te la posto, se non riesci a farla funzionare a modo ne scrivo una più semplice..
    codice:
    --------------------------------------------------------------------------------Public Function Cerca(ByVal List As ListBox, ByVal WordToSearch As String, SearchType As Byte, PartialType As Byte, IgnoreShift As Boolean, ElementIndex() As Variant)--------------------------------------------------------------------------------
    
    
    WordToSearch = parola da cercare 
    SearchType = 0--> ricerca integrale della parola, ossia restituisce l'index degli elementi formati dalla parola che cerchi 
    1--> ricerca graduale: se WordToSearch è per esempio "Ciao" puoi scegliere nel seguente argomento quante lettere di questa parola devi far cercare: ESEMPIO 
    
    SearchType = 1; PartialType = da 1 a 4 in quanto sono i caratteri della parola da cercare: se metti per esempio 2 trova tutti gli elementi il cui text è "ci". Questo serve quando si cerca una parola lunga e non viene trovato il risultato, allora si cerca graduatamente.. 
    
    IgnoreShift = Booleano. Se posto uguale a True--> ignora i caratteri minuscoli e maiuscoli, quindi "CIaO" = "ciAO"; al contrario per avere un'uguaglianza esatta occorre mettere questo argomento uguale a False. 
    
    ElementIndex = matrice in cui vengono salvati gli index degli elementi che corrispondono alla ricerca. 
    
    
    code:--------------------------------------------------------------------------------Public Function Cerca(ByVal List As ListBox, ByVal WordToSearch As String, SearchType As Byte, PartialType As Byte, IgnoreShift As Boolean, ElementIndex() As Variant)
    
    If SearchType <> 0 And SearchType <> 1 Then msg = "Argomento non valido: deve essere 0 o 1": GoTo Messaggi
    
    If SearchType = 0 Then
    
        If IgnoreShift = True Then
            k = 0
            For i = 0 To List.ListCount - 1
                If UCase(List.List(i)) = UCase(WordToSearch) Then
                    ReDim Preserve ElementIndex(k)
                    ElementIndex(k) = i
                    k = k + 1
                End If
            Next i
        Else
            k = 0
            For i = 0 To List.ListCount - 1
                If List.List(i) = WordToSearch Then
                    ReDim Preserve ElementIndex(k)
                    ElementIndex(k) = i
                    k = k + 1
                End If
            Next i
        End If
    
    ElseIf SearchType = 1 Then
    
        Select Case PartialType
        
            Case Is = 0 'con funz. Instr
                If IgnoreShift = True Then
                   k = 0
                        For i = 0 To List.ListCount - 1
                          If InStr(1, UCase(List.List(i)), UCase(WordToSearch), vbTextCompare) <> 0 Then
                            ReDim Preserve ElementIndex(k)
                              ElementIndex(k) = i
                              k = k + 1
                          End If
                        Next i
                Else
                        For i = 0 To List.ListCount - 1
                          If InStr(1, List.List(i), WordToSearch, vbBinaryCompare) <> 0 Then
                              ReDim Preserve ElementIndex(k)
                              ElementIndex(k) = i
                              k = k + 1
                          End If
                        Next i
                End If
            
            Case Is <> 0
               
               If Len(WordToSearch) < PartialType Then msg = "Il valore dell'argomento PartialType deve essere compreso" _
               & Chr(13) & "tra 0 e la lunghezza dell'argomento WordToSearch": GoTo Messaggi
               
               If IgnoreShift = True Then
                   k = 0
                        For i = 0 To List.ListCount - 1
                          If Left(UCase(WordToSearch), PartialType) = UCase(List.List(i)) Then
                              ReDim Preserve ElementIndex(k)
                              ElementIndex(k) = i
                              k = k + 1
                          End If
                        Next i
                Else
                        For i = 0 To List.ListCount - 1
                          If Left(WordToSearch, PartialType) = (List.List(i)) Then
                              ReDim Preserve ElementIndex(k)
                              ElementIndex(k) = i
                              k = k + 1
                          End If
                        Next i
                End If
               
               
            End Select
    End If
    Exit Function
    Messaggi:
    MsgBox msg, vbCritical, "Funzione Cerca"
    End Function
    --------------------------------------------------------------------------------
    
    
    
    code:--------------------------------------------------------------------------------
    'Si usa così:
    Dim matr() As Variant
    
    Cerca List1, "dD", 1, 0, True, matr
        
    On Error GoTo risolvi
        For i = 0 To UBound(matr)
            MsgBox matr(i)
        Next i
    Exit Sub
    
    risolvi:
    If Err.Number = 9 Then MsgBox "Non sono stati trovati elementi!"
    ciao

  3. #3
    a dir il vero è un po' complessa...nn è che nn la capisco ma non riesco a capire come adattarla al mio programma....

    come interagisco col la listbox?

    grazie ancora

  4. #4
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    Ciao, ti posto il codice di esempio con le api, per cercare file usando anche il carattere jolly *
    Il codice non è mio, l'ho preso pari pari grazie all'API-GUIDE dal sito www.allapi.net.
    codice:
    'Create a form with a command button (command1), a list box (list1)
    'and four text boxes (text1, text2, text3 and text4).
    'Type in the first textbox a startingpath like c:\
    'and in the second textbox you put a pattern like *.* or *.txt
    
    Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
    Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
    Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
    Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
    
    Const MAX_PATH = 260
    Const MAXDWORD = &HFFFF
    Const INVALID_HANDLE_VALUE = -1
    Const FILE_ATTRIBUTE_ARCHIVE = &H20
    Const FILE_ATTRIBUTE_DIRECTORY = &H10
    Const FILE_ATTRIBUTE_HIDDEN = &H2
    Const FILE_ATTRIBUTE_NORMAL = &H80
    Const FILE_ATTRIBUTE_READONLY = &H1
    Const FILE_ATTRIBUTE_SYSTEM = &H4
    Const FILE_ATTRIBUTE_TEMPORARY = &H100
    
    Private Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
    End Type
    
    Private Type WIN32_FIND_DATA
        dwFileAttributes As Long
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME
        ftLastWriteTime As FILETIME
        nFileSizeHigh As Long
        nFileSizeLow As Long
        dwReserved0 As Long
        dwReserved1 As Long
        cFileName As String * MAX_PATH
        cAlternate As String * 14
    End Type
    Function StripNulls(OriginalStr As String) As String
        If (InStr(OriginalStr, Chr(0)) > 0) Then
            OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
        End If
        StripNulls = OriginalStr
    End Function
    
    Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer, DirCount As Integer)
        'KPD-Team 1999
        'E-Mail: KPDTeam@Allapi.net
        'URL: http://www.allapi.net/
    
        Dim FileName As String ' Walking filename variable...
        Dim DirName As String ' SubDirectory Name
        Dim dirNames() As String ' Buffer for directory name entries
        Dim nDir As Integer ' Number of directories in this path
        Dim i As Integer ' For-loop counter...
        Dim hSearch As Long ' Search Handle
        Dim WFD As WIN32_FIND_DATA
        Dim Cont As Integer
        If Right(path, 1) <> "\" Then path = path & "\"
        ' Search for subdirectories.
        nDir = 0
        ReDim dirNames(nDir)
        Cont = True
        hSearch = FindFirstFile(path & "*", WFD)
        If hSearch <> INVALID_HANDLE_VALUE Then
            Do While Cont
            DirName = StripNulls(WFD.cFileName)
            ' Ignore the current and encompassing directories.
            If (DirName <> ".") And (DirName <> "..") Then
                ' Check for directory with bitwise comparison.
                If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
                    dirNames(nDir) = DirName
                    DirCount = DirCount + 1
                    nDir = nDir + 1
                    ReDim Preserve dirNames(nDir)
                End If
            End If
            Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory.
            Loop
            Cont = FindClose(hSearch)
        End If
        ' Walk through this directory and sum file sizes.
        hSearch = FindFirstFile(path & SearchStr, WFD)
        Cont = True
        If hSearch <> INVALID_HANDLE_VALUE Then
            While Cont
                FileName = StripNulls(WFD.cFileName)
                If (FileName <> ".") And (FileName <> "..") Then
                    FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
                    FileCount = FileCount + 1
                    List1.AddItem path & FileName
                End If
                Cont = FindNextFile(hSearch, WFD) ' Get next file
            Wend
            Cont = FindClose(hSearch)
        End If
        ' If there are sub-directories...
        If nDir > 0 Then
            ' Recursively walk into them...
            For i = 0 To nDir - 1
                FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\", SearchStr, FileCount, DirCount)
            Next i
        End If
    End Function
    Sub Command1_Click()
        Dim SearchPath As String, FindStr As String
        Dim FileSize As Long
        Dim NumFiles As Integer, NumDirs As Integer
        Screen.MousePointer = vbHourglass
        List1.Clear
        SearchPath = Text1.Text
        FindStr = Text2.Text
        FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)
        Text3.Text = NumFiles & " Files found in " & NumDirs + 1 & " Directories"
        Text4.Text = "Size of files found under " & SearchPath & " = " & Format(FileSize, "#,###,###,##0") & " Bytes"
        Screen.MousePointer = vbDefault
    End Sub
    Per il tuo caso, nella textbox di ricerca inserisci pinco*.mp3 e voilà.. ti tira fuori tutti i file che iniziano con pinco..
    Jupy

  5. #5
    ragazzi mi spiace ma così nn si può! Nn ci capisco nulla!
    nell'api su servono 4 textbox ke io nn ho!

    forse è meglio se vi spiego il layout della mia applicazione!

    Allora, io esploro una cartella fissa (App.path & "\canzoni\") e inserisco nella Listbox l'elenco dei file Mp3 contenuti in quella cartella.

    poi ho solo 1 textbox dove verrà inserito la parola da cercare.

    come posso fare a inserire una delle funzioni la sopra?

  6. #6
    Me l'ho immaginavo..è un modulo per ricerca a gradi e che può anche distinguere 2 parole che si differenziano per qualche carattere maiuscolo..
    Cmq ti scrivo una funzione più semplice:
    codice:
    Const LB_FINDSTRING = &H18F
    Private Sub Text1_Change()
    List1.ListIndex = SendMessage(List1.hwnd, LB_FINDSTRING, -1, ByVal CStr(Text1.Text))
    End Sub
    provalo e fammi sapere..

    ciao

  7. #7
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    Originariamente inviato da Pinco Pallino 2
    ragazzi mi spiace ma così nn si può! Nn ci capisco nulla!
    nell'api su servono 4 textbox ke io nn ho!

    forse è meglio se vi spiego il layout della mia applicazione!

    Allora, io esploro una cartella fissa (App.path & "\canzoni\") e inserisco nella Listbox l'elenco dei file Mp3 contenuti in quella cartella.

    poi ho solo 1 textbox dove verrà inserito la parola da cercare.

    come posso fare a inserire una delle funzioni la sopra?
    Ciao, mi sembra di capire che non è tanto che usi vb.. quel codice era di esempio e come tale, servivano 4 textbox ecc..
    per il tuo caso ti posto il codice, evidenziando la parte dove devi mettere i tuoi "oggetti".
    codice:
    Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
    Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
    Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
    Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
    
    Const MAX_PATH = 260
    Const MAXDWORD = &HFFFF
    Const INVALID_HANDLE_VALUE = -1
    Const FILE_ATTRIBUTE_ARCHIVE = &H20
    Const FILE_ATTRIBUTE_DIRECTORY = &H10
    Const FILE_ATTRIBUTE_HIDDEN = &H2
    Const FILE_ATTRIBUTE_NORMAL = &H80
    Const FILE_ATTRIBUTE_READONLY = &H1
    Const FILE_ATTRIBUTE_SYSTEM = &H4
    Const FILE_ATTRIBUTE_TEMPORARY = &H100
    
    Private Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
    End Type
    
    Private Type WIN32_FIND_DATA
        dwFileAttributes As Long
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME
        ftLastWriteTime As FILETIME
        nFileSizeHigh As Long
        nFileSizeLow As Long
        dwReserved0 As Long
        dwReserved1 As Long
        cFileName As String * MAX_PATH
        cAlternate As String * 14
    End Type
    Function StripNulls(OriginalStr As String) As String
        If (InStr(OriginalStr, Chr(0)) > 0) Then
            OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
        End If
        StripNulls = OriginalStr
    End Function
    
    Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer, DirCount As Integer)
        'KPD-Team 1999
        'E-Mail: KPDTeam@Allapi.net
        'URL: http://www.allapi.net/
    
        Dim FileName As String ' Walking filename variable...
        Dim DirName As String ' SubDirectory Name
        Dim dirNames() As String ' Buffer for directory name entries
        Dim nDir As Integer ' Number of directories in this path
        Dim i As Integer ' For-loop counter...
        Dim hSearch As Long ' Search Handle
        Dim WFD As WIN32_FIND_DATA
        Dim Cont As Integer
        If Right(path, 1) <> "\" Then path = path & "\"
        ' Search for subdirectories.
        nDir = 0
        ReDim dirNames(nDir)
        Cont = True
        hSearch = FindFirstFile(path & "*", WFD)
        If hSearch <> INVALID_HANDLE_VALUE Then
            Do While Cont
            DirName = StripNulls(WFD.cFileName)
            ' Ignore the current and encompassing directories.
            If (DirName <> ".") And (DirName <> "..") Then
                ' Check for directory with bitwise comparison.
                If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
                    dirNames(nDir) = DirName
                    DirCount = DirCount + 1
                    nDir = nDir + 1
                    ReDim Preserve dirNames(nDir)
                End If
            End If
            Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory.
            Loop
            Cont = FindClose(hSearch)
        End If
        ' Walk through this directory and sum file sizes.
        hSearch = FindFirstFile(path & SearchStr, WFD)
        Cont = True
        If hSearch <> INVALID_HANDLE_VALUE Then
            While Cont
                FileName = StripNulls(WFD.cFileName)
                If (FileName <> ".") And (FileName <> "..") Then
                    FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
                    FileCount = FileCount + 1
                    List1.AddItem path & FileName
                End If
                Cont = FindNextFile(hSearch, WFD) ' Get next file
            Wend
            Cont = FindClose(hSearch)
        End If
        ' If there are sub-directories...
        If nDir > 0 Then
            ' Recursively walk into them...
            For i = 0 To nDir - 1
                FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\", SearchStr, FileCount, DirCount)
            Next i
        End If
    End Function
    Sub Command1_Click()
        Dim SearchPath As String, FindStr As String
        Dim FileSize As Long
        Dim NumFiles As Integer, NumDirs As Integer
        Screen.MousePointer = vbHourglass
        List1.Clear
        SearchPath = App.path & "\canzoni\"
        FindStr = Text2.Text
        FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)
        Screen.MousePointer = vbDefault
    End Sub
    Allora, nella riga evidenziata in rosso, devi mettere il nome della tua listBox
    nella riga verde, ho messo il percorso di ricerca (indicato da te), se non va bene cambialo
    nella riga blu, devi mettere il nome della tua textBox che contiene la stringa da cercare.
    è logico che il codice che si trova all'interno dell'evento Click dell'oggetto Command (Command1_Click), lo devi mettere all'interno dell'evento click del tuo pulsante di ricerca...
    Jupy

  8. #8
    Mde2005:

    Ho provato il codice ma mi da errori nel debug che nn capisco!

    Jupy:

    ho provato anke il tuo! Non ho modificato nulla visto ke i nomi degli oggetti son proprio quelli (list1,text2 e la path è App.path & "\canzoni\")

    Non mi da nessun errore solamente che non funziona! Qualsiasi cosa metto mi da la listbox vuota!

    Grazie ancora per tutto l'interessamento!

  9. #9
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    Ciao, ma come stringa di ricerca cosa inserisci?
    Jupy

  10. #10
    stringa di ricerca?!?

    Io ho inserito il codice che mi hai dato tu facendo copia incolla!
    Pensavo fosse li la stringa di ricerca! VVoVe:

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.