Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Окно выбора файлов (common dialog), без контрола 
:(
    Опции темы
JusTalionis
Дата 25.5.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: 6
Всего: 17



Для тех, кто не любит применять контролы.  Не буду объяснять почему - кто не хочет их использовать - сам знает, чем они неудовлетворительны.
Этот исходник решает вопрос - как открыть стандартное окно выбора файлов (common dialog) через использование API, а не контрола.

Создаете в своей программе модуль, вписываете в него следующий код: 
Код

'           ПОДКЛЮЧЕНИЕ ФУНКЦИЙ API
'--------------------------------------------------------------------------
Option Explicit

'Команда задержки программы
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'Использование:
'Sleep 100 'задержка выполнения на 0.1 сек

'--------------------------------------------------------------------------
'Окна открытия и сохранения файлов Common Dialog

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
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOPENFILENAME As OpenFileName) As Long
Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOPENFILENAME As OpenFileName) As Long

Function OpenDialog$(Optional ByVal DefaultFile$, Optional ByVal MasksList$)
'            Функция получения имени файла для открытия.
'
' Вход: два необязательных аргумента.
' Первый аргумент - строка: предлагаемое имя файла (можно с путем).
' Второй аргумент - строка, список расширений,
'   разделенных запятыми, напр.: "Текстовые,*.txt,Все файлы,*.*"
'   (пробелы являются значащими).
'
' Возвращает: строка- полное имя выбранного файла (либо пустую строку при отмене).
' Длина имени файла - не более 218 символов. При превышении выдает пустую строку.
' Использует подпрограмму SplitFName.
' -----------------------------------------------------------------------------------

Dim OpenFile As OpenFileName, EndName As Integer, sFilter As String, strIniFolder As String

DefaultFile$ = Trim(DefaultFile$)    ' (иначе не откроется окно)

' Определение маски отображаемых файлов
If MasksList$ = "" Then
  sFilter = " " & Chr$(0) & "*.*" & Chr$(0)
Else
  sFilter = Replace(MasksList$, ",", Chr$(0)) + Chr$(0) 'замена запятых нулями.
End If

Call SplitFName(DefaultFile$, strIniFolder, DefaultFile$) ' разделение пути и имени

' Заполнение структуры для вызова функции GetOpenFileName
OpenFile.lStructSize = Len(OpenFile)
OpenFile.hwndOwner = 0
OpenFile.hInstance = 0
OpenFile.lpstrFilter = sFilter
OpenFile.nFilterIndex = 1
OpenFile.lpstrFile = Left$(DefaultFile$ + String$(255, 0), 255) + Chr$(0)
OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1
OpenFile.lpstrFileTitle = OpenFile.lpstrFile
OpenFile.nMaxFileTitle = OpenFile.nMaxFile
OpenFile.lpstrInitialDir = strIniFolder
OpenFile.lpstrTitle = "Выбор файла"               ' заголовок окна
OpenFile.flags = 0

GetOpenFileName OpenFile                          ' вызов API

' Получаем полное имя файла
If InStr(OpenFile.lpstrFile, "\") = 0 Then
  OpenDialog$ = ""      'если имя файла было предложено, но отмена.
Else
  EndName = InStr(OpenFile.lpstrFile, Chr$(0))
  Select Case EndName
    Case 1:    OpenDialog$ = ""      '0 в первой позиции - имя не введено
    Case 0:    OpenDialog$ = ""      'слишком длинное имя
    Case Else: OpenDialog$ = Left$(OpenFile.lpstrFile, EndName - 1)
  End Select
End If

End Function

Function SaveDialog$(Optional ByVal DefaultFile$, Optional ByVal MasksList$)
'            Функция получения имени файла для сохранения.
'
' Вход: два необязательных аргумента.
' Первый аргумент - строка: предлагаемое имя файла (можно с путем).
' Второй аргумент - строка, список расширений,
'   разделенных запятыми, напр.: "Текстовые,*.txt,Все файлы,*.*"
'   (пробелы являются значащими).
'
' Возвращает: строка- полное имя выбранного файла (либо пустую строку при отмене).
' Длина имени файла - не более 218 символов. При превышении выдает пустую строку.
' Использует подпрограмму SplitFName.
' -----------------------------------------------------------------------------------

Dim OpenFile As OpenFileName, EndName As Integer, sFilter As String, strIniFolder As String

DefaultFile$ = Trim(DefaultFile$)
If MasksList$ = "" Then
  sFilter = " " & Chr$(0) & "*.*" & Chr$(0)
Else
  sFilter = Replace(MasksList$, ",", Chr$(0)) + Chr$(0)
End If
Call SplitFName(DefaultFile$, strIniFolder, DefaultFile$)
OpenFile.lStructSize = Len(OpenFile)
OpenFile.hwndOwner = 0
OpenFile.hInstance = 0
OpenFile.lpstrFilter = sFilter
OpenFile.nFilterIndex = 1
OpenFile.lpstrFile = Left$(DefaultFile$ + String$(255, 0), 255) + Chr$(0)
OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1
OpenFile.lpstrFileTitle = OpenFile.lpstrFile
OpenFile.nMaxFileTitle = OpenFile.nMaxFile
OpenFile.lpstrInitialDir = strIniFolder
OpenFile.lpstrTitle = "Сохранение файла"               ' заголовок окна
OpenFile.flags = 0

GetSaveFileName OpenFile                          ' вызов API

' Получаем полное имя файла
If InStr(OpenFile.lpstrFile, "\") = 0 Then
  SaveDialog$ = ""      'если имя файла было предложено, но отмена.
Else
  EndName = InStr(OpenFile.lpstrFile, Chr$(0))
  Select Case EndName
    Case 1:    SaveDialog$ = ""      '0 в первой позиции - имя не введено
    Case 0:    SaveDialog$ = ""      'слишком длинное имя
    Case Else: SaveDialog$ = Left$(OpenFile.lpstrFile, EndName - 1)
  End Select
End If

End Function


Public Sub SplitFName(ByVal FileSpec$, ByRef varFilePath$, ByRef varFileName$)
'    Подпрограмма расщепления полного имени файла:
' Делит путь+имя на отдельные путь и имя файла.
' FileSpec$ - исходная строка: путь или имя или путь+имя файла
' varFilePath$ -приемная переменная: путь (строка)
' varFileName$ -приемная переменная: имя (строка)
' Все параметры обязательные, но могут быть пустыми строками.
' Исходная переменная может, в то же время, принимать результат.
' --------------------------------------------------------------------------
Dim tmp1 As Integer

varFilePath$ = ""
tmp1 = InStrRev(FileSpec$, "\")
' если есть слэш, значит задан путь
If tmp1 > 0 Then
 varFilePath$ = Left$(FileSpec$, tmp1)
  If tmp1 = Len(FileSpec$) Then
    FileSpec$ = ""  'обнуляем имя файла, если слэш на конце (путь без имени)
  Else
    FileSpec$ = Right$(FileSpec$, Len(FileSpec$) - tmp1)  ' удаляем путь из имени
  End If
End If
' исключения:
If Trim(FileSpec$) = "." Then FileSpec$ = ""
If Trim(FileSpec$) = ".." Then
  FileSpec$ = ""
  varFilePath$ = ".."
End If
varFileName$ = FileSpec$

End Sub
'-----------------------------------------------------------------------------


В вашей программе становятся доступны следующие функции:
OpenDialog$() -открывает окно выбора файлов.
Может иметь два необязательных аргумета: строка - предполагаемое имя файла, можно с путем (чтобы открыть сразу желаемое место). 
И - строка-маска файлов, чтобы показывать только заданные файлы. Формат этой строки - список типов в виде: "Текстовые,*.txt,Все файлы,*.*"
Функция возвращает строку: полное имя выбранного файла. При отмене возвращает пустую строку.
(Ограничение на длину этой строки- 218 символов. При превышении выдает пустую строку.)

SaveDialog$() -функция работает точно так же, только ее окно имеет заголовок "Сохранение файла".

Обратите внимание, что сами эти функции файлов не открывают - они только выбирают имя.
Это имя потом открываете обычной процедурой открытия файлов на запись или чтение, или как Вам заблагорассудится.


К выше сказанному добавлена очень полезная команда приостановки выполнения:
Sleep()  , аргумент ее - время паузы в миллисекундах.

Для работы функций выбора файлов используется служебная подпрограмма отделения имени файла от пути. В программе тоже можно при желании воспользоваться ею; описание см. в комментах.

Приаттачиваю к теме заготовку проекта, где эти функции подключены к меню на форме.



Присоединённый файл ( Кол-во скачиваний: 34 )
Присоединённый файл  comdlg.zip 5,30 Kb
PM MAIL   Вверх
Mefody66
Дата 25.9.2012, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



Спасибо, хорошая программа, но у меня сейчас вопрос как раз по контролу common dialog.
Как сделать так, чтобы при открытии файла на чтение или на запись я попадал в текущую папку?
Вроде простой вопрос, но почему-то не могу найти ответа.
Заранее спасибо.
PM MAIL   Вверх
Dexx
Дата 26.9.2012, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 13.6.2005

Репутация: 5
Всего: 7



lpstrInitialDir
используя common dialog действуем по аналогии
CommonDialog1.InitDir  

Это сообщение отредактировал(а) Dexx - 26.9.2012, 00:50


--------------------

PM   Вверх
vladpros
Дата 1.12.2013, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 1.12.2013

Репутация: нет
Всего: нет



Под windows'7 глючит при вызове файла формата Word (*.doc, *.rtf)
Как избежать этого?


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Ошибка_Word.jpg 44,23 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.