If the buffer is too small, the function returns FALSE and the CommDlgExtendedError function returns FNERR_BUFFERTOOSMALL. In this case, the first two bytes of the lpstrFile buffer contain the required size, in bytes or characters.
т.е. размер буфера не м.б. больше 65536? Почему тогда nMaxFile имеет тип Long? Почему lpstrFile, я же там могу вообще указать нулевую строкуfirst two bytes of the lpstrFile buffer contain the required size
Dim sTemp() As String
sTemp = Split(Trim(ofn.lpstrFile), Chr(0))
Source писал(а):Интересно, что диалог вызывается только при nMaxFile=len(lpstrFile)+1, при других значениях возвращается ноль (диалог не вызывается)! Глядя на название nMaxFile можно подумать, что эта величина задаёт максимальное число файлов при мультивыборе, тогда можно легко было бы рассчитать и размер буфера, выделив 255 байт на имена файлов + путь, тогда ofn.lpstrFile = Space$(nMaxFile+1)*255. Но на самом деле это размер буфера... И чем думали в том Microsofte? Короче, всё как всегда у них делается через одно место
Ну, если я укажу ofn.lpstrFile = Space$(300), я же могу указать nMaxFile=50 (меньше 300), но не сработает!А MSDN то не судьба поглядеть? nMaxFile определяет размер буфера в символах, заданного в lpstrFile. Так что понятно, что при задании нуля ничего интересного не произойдет.
Предлагаешь слетать в прошлое и перехватить?З.Ы. Год назад отправлял Гайдару статью про стандартные диалоги для книги, то ли не дошла, то ли одно из двух. Вот там все было подробно рзобрано про все стандартные диалоги.
Source писал(а):Ну, если я укажу ofn.lpstrFile = Space$(300), я же могу указать nMaxFile=50 (меньше 300), но не сработает!А MSDN то не судьба поглядеть? nMaxFile определяет размер буфера в символах, заданного в lpstrFile. Так что понятно, что при задании нуля ничего интересного не произойдет.
Source писал(а):Предлагаешь слетать в прошлое и перехватить?З.Ы. Год назад отправлял Гайдару статью про стандартные диалоги для книги, то ли не дошла, то ли одно из двух. Вот там все было подробно рзобрано про все стандартные диалоги.
Диалог вообще не покажется.Сработает, если выбранный пользователем путь + файлы уместятся в 50 символов.
Не проще ли самому на сайте выложить и мне ссылку кинутьЭто намек Гайдару, если дошла статья, то может на сайте выложит, ежли таки нет, то могу послать еще раз.
Source писал(а):Диалог вообще не покажется.Сработает, если выбранный пользователем путь + файлы уместятся в 50 символов.
Source писал(а):Не проще ли самому на сайте выложить и мне ссылку кинутьЭто намек Гайдару, если дошла статья, то может на сайте выложит, ежли таки нет, то могу послать еще раз.
alibek писал(а):Viper, ты бы все-таки уточнил у gaidar-а.
Если статья ушла в книгу, возможно издательство будет против того, чтобы материалы книги размещались в интернете.
Source писал(а):Странно вообще всё работает, в папке 3 237 файлов. После их выбора через Ctrl+A выдаёт после разрезки по именам 2329 файлов (с путём):
- Код: Выделить всё
Dim sTemp() As String
sTemp = Split(Trim(ofn.lpstrFile), Chr(0))
? UBound(sTemp)
2329
? len(Trim(ofn.lpstrFile))
28143
Да, иначе я бы не смог выбирать несколько файловА у тебя точно установлен флаг MULTISELECT?
Dim Ret As Long, ofn As OPENFILENAME, sTemp() As String, i As Long, sPathGet As String
'выбрать файл(ы)
ofn.lStructSize = Len(ofn)
ofn.hwndOwner = Me.hwnd
ofn.hInstance = App.hInstance
ofn.nMaxFile = 70000
ofn.lpstrFile = Space$(ofn.nMaxFile - 1)
ofn.nMaxFileTitle = 256 'для определении имени файла при выборе только 1 файла
ofn.lpstrFileTitle = Space$(ofn.nMaxFileTitle - 1)
ofn.lpstrInitialDir = CurDir
ofn.lpstrTitle = "File Open"
ofn.flags = OFN_EXPLORER Or OFN_FILEMUSTEXIST Or OFN_ALLOWMULTISELECT
Ret = GetOpenFileName(ofn)
If Ret = 0 Then GoTo 100
sTemp = Split(Trim(ofn.lpstrFile), Chr(0))
If UBound(sTemp) <= 2 Then
'выбран 1 файл - полный путь, отделить путь от имени файла
sPathGet = Mid(sTemp(0), 1, InStrRev(sTemp(0), "\"))
sTemp(0) = Trim(ofn.lpstrFileTitle) 'взять имя файла
sTemp(0) = Left$(sTemp(0), Len(sTemp(0)) - 1) 'Left$ убирает конец строки=0
Else
sPathGet = sTemp(0) & "\"
End If
Debug.Print "UBound(sTemp)="; UBound(sTemp); Len(Trim(ofn.lpstrFile))
Source писал(а):2. Интересно, что если не очистить ofn.lpstrFile перед повторным вызовом диалога, то диалог откроет родительскую папку CurDir, несмотря на ofn.lpstrInitialDir = CurDir!
Сейчас этот форум просматривают: Yandex-бот и гости: 124