# Browse Directory Dialog in VB6



## nomike (19. September 2002)

Da ich mit der Board-Suchfunktion nix gefunden habe poste ich mal in der Hoffnung daß des noch nicht zu oft gefragt wurde munter drauf los.

Es gibt ja einen Standard-Dialog, in dem ein Tree-View mit der Ordnerstruktur vom Windows mit dem Desktop als Root ist.
Man sucht sich einen Ordner raus und klickt auf OK oder Abbrechen.
Dann gibts da noch eine Checkbox "Recurse Subdirectories".

Wer jetzt nicht weiß was ich meine öffnet Winamp 2.x und klickt im PlaylistEditor auf Add-Dir.

Genau sowas will ich.

Allerdings ist der dreck nicht im CommonDialog Controll dabei.
Da gibts irgend ne Api-Funktion dafür. Ich weiß bloß nicht mehr welche.

Im Endeffekt soll aus dem Programm ein MP3-Renamer/Retagger werden.

In einem Verzeichnis werden alle MP3's der reihe nach hergenommen.
Dann wird versucht aus dem ID3-Tag einen Filename zu generieren (mit einem Template (zB: Filename = "%1 - %2.mp3") daß der User im Programm eingeben kann). Gleichzeitig wird versucht über eine RegularExpression (PCRE's und nicht diese dämlichen, inkompatiblen Microschuft AltRegExp's) aus dem Filename den ID3 Tag zu generieren.
Der User sieht beides am Bildschirm und klickt dann an was im besser gefällt (der generierte ID3 Tag oder der generierte Filename)

Dazu brauche ich dann auch eine Library mit der ich ID3-Tags (wenn geht auch v. 2) bearbeiten kann. Weiß jemand wo ich sowas her kriege?

Und weiß wer zufällig wo ich so ne pcre-lib her krieg (dann brauch ich nicht extra suchen)?

Vielen Dank im Vorraus...

mfg
Nomike

PS: Mir wars beim Interface ein Bissi fad. Wie gfallt euch des?!?


----------



## Dario Linsky (19. September 2002)

ja, das geht über api. bei mir sieht das so aus:


```
Option Explicit

Private Type BrowseInfo
     hwndOwner As Long
     pIDLRoot As Long
     pszDisplayName As Long
     lpszTitle As Long
     ulFlags As Long
     lpfnCallback As Long
     lParam As Long
     iImage As Long
End Type

Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long

Private Const BIF_RETURNONLYFSDIRS = 1
Private Const MAX_PATH = 256

Function BrowseForFolder(Beschriftung As String) As String
On Error GoTo 203

Dim pidl As Long
Dim path As String
Dim bi As BrowseInfo

bi.hwndOwner = Screen.ActiveForm.Hwnd
bi.lpszTitle = lstrcat(Beschriftung, "")
bi.ulFlags = BIF_RETURNONLYFSDIRS
pidl = SHBrowseForFolder(bi)

If pidl Then
    path = String(MAX_PATH, 0)
    SHGetPathFromIDList pidl, path
    CoTaskMemFree pidl
    path = Left(path, InStr(path, vbNullChar) - 1)
End If

BrowseForFolder = path

Exit Function
203 MsgBox "Es ist ein unerwarteter Fehler aufgetreten (Fehlercode 203: " & Err.Description & "). Wenn dieses Problem ... und so weiter", vbExclamation, "Fehler"

End Function
```

beim aufruf gibt die funktion den namen des ausgewählten verzeichnisses zurück.


----------



## nomike (20. September 2002)

thx - funkt

Jetzt brauch ich nur noch ne PCRE und ne ID3 Lib.

Aber das mach ich heut nimma.
Des schau ich mir morgen an...

mfg
Nomike


----------



## Dario Linsky (20. September 2002)

die id3-tags (version 2.0) stehen in der mp3-datei in den letzten 128 byte. um da ranzukommen, musst du einfach nur die datei im binärmodus öffnen und auf die entsprechende stelle der datei springen (dateiende - 128).
das id3-tag selbst ist im prinzip nichts anderes als ein zusammengesetzter datentyp:

```
Public Type ID3Tag
    ID As String * 3
    Titel As String * 30
    Artist As String * 30
    Album As String * 30
    Year As String * 4
    Comment As String * 30
    Genre As Byte
End Type
```

für das genre musst du dir noch ein feld mit 146 elementen anlegen, in die du die bezeichnungen für das jeweilige genre einträgst. dabei musst du die reihenfolge einhalten, wie sie auch in der auswahlliste vom winamp steht. die zahl, die dann in der typvariable für das genre gespeichert wird, ist dabei der index des genres in deinem feld.


----------

