Re: Про диалог открытия файлов
От: ZAMUNDA Земля для жалоб и предложений
Дата: 03.02.06 09:04
Оценка:
Здравствуйте, Slider, Вы писали:

S>Есть проблемка такого рода. Есть такая штука в access DoCmd.TransferText acExportDelim,"Имя спецификации","Имя таблицы", "Имя файла",

S>которая экспортирует таблицу в txt или csv файлик. В "В имя файла" вводится путь и имя файла. Это должно забиваться железно. Как можно задать путь сохранения интерфейсно.
S> Проблема состоит в том что мне нужно создать условия для того чтобы пользхователь смог выбрать куда он будет сохранять этот файлик. Самый простой способ который я смог гы реализовать это заставить пользователя вбивать путь ручками в текстовое поле на форме:) но это не устраивает. Нужно чтобы появлялось окно Save as.
В MSDN есть пример на C++. На VB/VBA он буит примерно так выглядеть.
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (ByRef pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

Private Const OFN_PATHMUSTEXIST As Long = &H800
Private Const OFN_FILEMUSTEXIST As Long = &H1000

Sub GetOpenFileNameTest()
    Dim ofn As OPENFILENAME ' common dialog box structure
    Dim szFile As String ' buffer for file name
    Dim hf As Long ' file handle

    ofn.lStructSize = Len(ofn)
    ofn.hwndOwner = 0&
    ofn.lpstrFile = vbNullChar & Space(259)
    ofn.nMaxFile = Len(ofn.lpstrFile)
    ofn.lpstrFilter = "All" & vbNullChar & "*.*" & vbNullChar & "Text" & vbNullChar & "*.TXT" & vbNullChar & vbNullChar
    ofn.nFilterIndex = 1
    ofn.flags = OFN_PATHMUSTEXIST Or OFN_FILEMUSTEXIST

    If GetOpenFileName(ofn) <> 0& Then
        szFile = Left$(ofn.lpstrFile, InStr(1, ofn.lpstrFile, vbNullChar) - 1)
        MsgBox "Выбран файл: " & Mid$(szFile, ofn.nFileOffset + 1) & _
               ", находящийся в папке: " & Left$(szFile, ofn.nFileOffset)
    End If
End Sub

Этот пример, показывает окно для открытия файла, чтоб показать окно для сохранения, нужно использовать функцию GetSaveFileName, объявление и использование которой такое же как и у GetOpenFileName (но пример там сложный дюже). Можешь поменять название функции в примере,

Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (ByRef pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

Private Const OFN_PATHMUSTEXIST As Long = &H800
Private Const OFN_FILEMUSTEXIST As Long = &H1000

Sub GetSaveFileNameTest()
    Dim ofn As OPENFILENAME ' common dialog box structure
    Dim szFile As String ' buffer for file name
    Dim hf As Long ' file handle

    ofn.lStructSize = Len(ofn)
    ofn.hwndOwner = 0&
    ofn.lpstrFile = vbNullChar & Space(259)
    ofn.nMaxFile = Len(ofn.lpstrFile)
    ofn.lpstrFilter = "All" & vbNullChar & "*.*" & vbNullChar & "Text" & vbNullChar & "*.TXT" & vbNullChar & vbNullChar
    ofn.nFilterIndex = 1
    ofn.flags = OFN_PATHMUSTEXIST 'Чтоб пользователь мог ввести имя с клавиатуры убираем OFN_FILEMUSTEXIST

    If GetSaveFileName(ofn) <> 0& Then
        szFile = Left$(ofn.lpstrFile, InStr(1, ofn.lpstrFile, vbNullChar) - 1)
        MsgBox "Выбран файл: " & Mid$(szFile, ofn.nFileOffset + 1) & _
               ", находящийся в папке: " & Left$(szFile, ofn.nFileOffset)
    End If

End Sub


и всё будет работать.

Excel'е есть Application.GetSaveFileName, который инкапсулирует работу оной функции, но в Access я такой не нашёл. Есть ещё Control "Microsoft Windows Common Dialog Control", но если у тебя формы нет, то лучше пользовать приведённый пример.

S> Но это еще пол беды:) Дело в том что когда пользователь выбрал в этом окне скажем "Рабочий стол" для примера на нем должна появиться папочка ну скажем test и вот в нее должен уже попасть наш файлик. Как это можно реализовать ? Помогитте плиз ....Я уже голову сломал не знаю как сделать......

Ну тут совсем просто, создать папку MkDir, а полный путь можно получить присоединив к пути открытого файла, имя папки, которую ты хочешь создать.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.