2009-05-28 85 views
0

私のGoogle-Fuは今日弱いです。うまくいけば、これは簡単なことです。CommonDialogコントロールのInitDirプロパティをマイコンピュータに設定する方法

VB6 CommonDialogコントロールのInitDirプロパティを[My] Computerで開始するように設定する必要があります。 InitDirを空の文字列に設定すると、最後に開いたダイアログの現在のディレクトリにデフォルトで設定されます。

マイコード:

With MyCommonDialogControl 
    .DialogTitle = "Choose Import File" 
    .Filter = "Import Files|*.dbf" 
    .InitDir = Environ("HOMEDRIVE") //Needs to be "My Computer" 
    .CancelError = False 
    .ShowOpen 
    If Len(.Filename) = 0 Then Exit Sub 
    InputFile = .Filename 
End With 

は、どのような援助のために事前にありがとうございます。

答えて

1

私はVB6とVBAの両方で動作するように見えるEnvironメソッドを使用しています - 私はこのメソッドを使用したことはありませんが、もう1つはp/Invoke参照によるものです:shell32.dllのSHGetSpecialFolderLocationとSHGetPathFromIDList

私が手にコードを持っていなかったので、私は別のサイトhttp://en.kioskea.net/faq/sujet-951-vba-vb6-my-documents-environment-variables

からコピーして貼り付けてきた私は、正確さを保証することはできませんが、それは私が使用したコードと非常によく似ています過去のものなので、デバッグを最小限に抑えて動作するはずです...とにかく、少なくとも正しい方向を指しています。

Option Explicit 
Private Type SHITEMID 
    cb As Long 
    abID As Byte 
End Type 
Private Type ITEMIDLIST 
    mkid As SHITEMID 
End Type 
Private Const CSIDL_PERSONAL As Long = &H5 
Private Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" _ 
         (ByVal hwndOwner As Long, ByVal nFolder As Long, _ 
         pidl As ITEMIDLIST) As Long 
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _ 
         (ByVal pidl As Long, ByVal pszPath As String) As Long 


Public Function Rep_Documents() As String 
    Dim lRet As Long, IDL As ITEMIDLIST, sPath As String 
    lRet = SHGetSpecialFolderLocation(100&, CSIDL_PERSONAL, IDL) 
    If lRet = 0 Then 
     sPath = String$(512, Chr$(0)) 
     lRet = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal sPath) 
     Rep_Documents = Left$(sPath, InStr(sPath, Chr$(0)) - 1) 
    Else 
     Rep_Documents = vbNullString 
    End If 
End Function 

Rep_Documents()を参照すると、My Documentsフォルダのパス名を保持する文字列が表示されます。これは、ファイルダイアログのInitDirプロパティに割り当てる場合にすぎません。

+0

これは決定的なパスを持っている特別なフォルダの素晴らしい作品が、あなたがCSIDL_DRIVESを使用してSHGetSpecialFolderLocationを使用した後SHGetPathFromIDListを実行しようとすると、それは空の文字列を返します。 「マイコンピュータ」に相当するパスは表示されません。 私は代わりにInitDirをデスクトップにルーティングしましたが、これがOCXまたはAPIのどちらかで実行できるかどうかはまだ不思議です。 +1のために。 :) –

+0

Heather "マイコンピュータ"は実際にはディレクトリではなく、ドライブと仮想パスの論理グループです。つまり、ごみ箱が含まれています。私はその「道」を手に入れる方法がわからないので、決して必要はありません。申し訳ありませんが、「マイコンピュータ」ではなく「マイドキュメント」を希望しているように質問しました。 – BenAlabaster

+0

SHGetSpecialFolderLocationなどのラッピングにKarl Petersonのコードをおすすめできますか?彼のコードは常に非常に高品質です。あなたがグーグルのように聞こえて、結果のコードが必ずしも信頼できるとは限りませんか? http://visualstudiomagazine.com/articles/2009/01/19/lemme-tell-ya-where-to-stick-it。aspx – MarkJ

1

マイコンピュータが同等の物理ディレクトリパスを持たないvirtual folderであるという問題があります。 Googlingこれは、私のためにWindows XP上で動作する以下になりました。

CommonDialog1.InitDir = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" 
    CommonDialog1.ShowOpen 

Apparentlyこれは、マイコンピュータの名前空間にCLSIDを使用しています。誰でもこの物を説明できる人は誰ですか?私はちょうど私が本当に理解していないGoogleの結果を投稿しています:)

+0

これは私にとってはうまくいかないようですが、他の仮想フォルダでも動作します。私はすでにそれをあきらめて、私の顧客に、自分のマイドキュメントフォルダからコントロールを持っていなくてはならないと言っただけです。 –

-1

作品だけでなく、THANKS! (WinXPのSP3)

Option Explicit ' 

    Private getdir As String 
    ' 

    ' 

    Private Sub Command1_Click() 

     Dim strFilter As String 
    Dim lngFlags As Long 
    strFilter = thAddFilterItem(strFilter, "Excel Files (*.xls)", "*.XLS") 
    'strFilter = thAddFilterItem(strFilter, "Text Files(*.txt)", "*.TXT") 
    'strFilter = thAddFilterItem(strFilter, "All Files (*.*)", "*.*") 
' MsgBox thCommonFileOpenSave(InitialDir:=App.Path, Filter:=strFilter, FilterIndex:=3, Flags:=lngFlags, DialogTitle:="File Browser") 
    MsgBox thCommonFileOpenSave(InitialDir:="::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", Filter:=strFilter, FilterIndex:=3, Flags:=lngFlags, DialogTitle:="File Browser") 

    Debug.Print Hex(lngFlags) 
End Sub 

Option Explicit 

Type thOPENFILENAME 
    lStructSize As Long 
    hwndOwner As Long 
    hInstance As Long 
    strFilter As String 
    strCustomFilter As String 
    nMaxCustFilter As String 
    nFilterIndex As Long 
    strFile As String 
    nMaxFile As Long 
    strFileTitle As String 
    nMaxFileTitle As Long 
    strInitialDir As String 
    strTitle As String 
    Flags As Long 
    nFileOffset As Integer 
    nFileExtension As Integer 
    strDefExt As String 
    lCustData As Long 
    lpfnHook As Long 
    lpTemplateName As String 
End Type 

Declare Function th_apiGetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (OFN As thOPENFILENAME) As Boolean 
Declare Function th_apiGetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (OFN As thOPENFILENAME) As Boolean 
Declare Function CommDlgExtendetError Lib "commdlg32.dll"() As Long 

Private Const thOFN_READONLY = &H1 
Private Const thOFN_OVERWRITEPROMPT = &H2 
Private Const thOFN_HIDEREADONLY = &H4 
Private Const thOFN_NOCHANGEDIR = &H8 
Private Const thOFN_SHOWHELP = &H10 
Private Const thOFN_NOVALIDATE = &H100 
Private Const thOFN_ALLOWMULTISELECT = &H200 
Private Const thOFN_EXTENSIONDIFFERENT = &H400 
Private Const thOFN_PATHMUSTEXIST = &H800 
Private Const thOFN_FILEMUSTEXIST = &H1000 
Private Const thOFN_CREATEPROMPT = &H2000 
Private Const thOFN_SHAREWARE = &H4000 
Private Const thOFN_NOREADONLYRETURN = &H8000 
Private Const thOFN_NOTESTFILECREATE = &H10000 
Private Const thOFN_NONETWORKBUTTON = &H20000 
Private Const thOFN_NOLONGGAMES = &H40000 
Private Const thOFN_EXPLORER = &H80000 
Private Const thOFN_NODEREFERENCELINKS = &H100000 
Private Const thOFN_LONGNAMES = &H200000 

Function StartIt() 
    Dim strFilter As String 
    Dim lngFlags As Long 
    strFilter = thAddFilterItem(strFilter, "Excel Files (*.xls)", "*.XLS") 
    strFilter = thAddFilterItem(strFilter, "Text Files(*.txt)", "*.TXT") 
    strFilter = thAddFilterItem(strFilter, "All Files (*.*)", "*.*") 
    Startform.filenameinput.Value = thCommonFileOpenSave(InitialDir:="x:\Anlagen_PG80", Filter:=strFilter, FilterIndex:=3, Flags:=lngFlags, DialogTitle:="File Browser") 
    Debug.Print Hex(lngFlags) 
End Function 

Function GetOpenFile(Optional varDirectory As Variant, Optional varTitleForDialog As Variant) As Variant 
    Dim strFilter As String 
    Dim lngFlags As Long 
    Dim varFileName As Variant 
    lngFlags = thOFN_FILEMUSTEXIST Or thOFN_HIDEREADONLY Or thOFN_NOCHANGEDIR 

    If IsMissing(varDirectory) Then varDirectory = "" 
    End If 

    If IsMissing(varTitleForDialog) Then varTitleForDialog = "" 
    End If 

    strFilter = thAddFilterItem(strFilter, "Excel (*.xls)", "*.XLS") 
    varFileName = thCommonFileOpenSave(OpenFile:=True, InitialDir:=varDirectory, Filter:=strFilter, Flags:=lngFlags, DialogTitle:=varTitleForDialog) 

    If Not IsNull(varFileName) Then varFileName = TrimNull(varFileName) 
    End If 

    GetOpenFile = varFileName 

End Function 

Function thCommonFileOpenSave(Optional ByRef Flags As Variant, Optional ByVal InitialDir As Variant, Optional ByVal Filter As Variant, _ 
           Optional ByVal FilterIndex As Variant, Optional ByVal DefaultEx As Variant, Optional ByVal fileName As Variant, _ 
           Optional ByVal DialogTitle As Variant, Optional ByVal hwnd As Variant, Optional ByVal OpenFile As Variant) As Variant 

    Dim OFN As thOPENFILENAME 
    Dim strFileName As String 
    Dim FileTitle As String 
    Dim fResult As Boolean 

    If IsMissing(InitialDir) Then InitialDir = CurDir 
    If IsMissing(Filter) Then Filter = "" 
    If IsMissing(FilterIndex) Then FilterIndex = 1 
    If IsMissing(Flags) Then Flags = 0& 
    If IsMissing(DefaultEx) Then DefaultEx = "" 
    If IsMissing(fileName) Then fileName = "" 
    If IsMissing(DialogTitle) Then DialogTitle = "" 
    If IsMissing(hwnd) Then hwnd = 0 
    If IsMissing(OpenFile) Then OpenFile = True 

    strFileName = Left(fileName & String(256, 0), 256) 
    FileTitle = String(256, 0) 

    With OFN 
     .lStructSize = Len(OFN) 
     .hwndOwner = hwnd 
     .strFilter = Filter 
     .nFilterIndex = FilterIndex 
     .strFile = strFileName 
     .nMaxFile = Len(strFileName) 
     .strFileTitle = FileTitle 
     .nMaxFileTitle = Len(FileTitle) 
     .strTitle = DialogTitle 
     .Flags = Flags 
     .strDefExt = DefaultEx 
     .strInitialDir = InitialDir 
     .hInstance = 0 
     .lpfnHook = 0 
     .strCustomFilter = String(255, 0) 
     .nMaxCustFilter = 255 
    End With 

    If OpenFile Then fResult = th_apiGetOpenFileName(OFN) Else fResult = th_apiGetSaveFileName(OFN) 


    If fResult Then 
     If Not IsMissing(Flags) Then Flags = OFN.Flags 
     thCommonFileOpenSave = TrimNull(OFN.strFile) 
     Else 
     thCommonFileOpenSave = vbNullString 
    End If 

End Function 

Function thAddFilterItem(strFilter As String, strDescription As String, Optional varItem As Variant) As String 

    If IsMissing(varItem) Then varItem = "*.*" 
    thAddFilterItem = strFilter & strDescription & vbNullChar & varItem & vbNullChar 

End Function 

Private Function TrimNull(ByVal strItem As String) As String 
    Dim intPos As Integer 
    intPos = InStr(strItem, vbNullChar) 
    If intPos > 0 Then 
     TrimNull = Left(strItem, intPos - 1) 
     Else 
     TrimNull = strItem 
    End If 

End Function 
関連する問題