Как использовать мульти выделение в окне GetOpenFileName?...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Как использовать мульти выделение в окне GetOpenFileName?...

Сообщение BV » 10.07.2005 (Вс) 18:28

Вопрос, однако! При присвоении флага OFN_ALLOWMULTISELECT вызывается совсем не привычное окно выбора файла а... доисторическое! Да-да, доисторическое :)

Вот код моей функции:

Код: Выделить всё
Option Explicit

Public Const OFN_ALLOWMULTISELECT As Long = &H200
Public Const OFN_FILEMUSTEXIST As Long = &H1000
Public Const OFN_HIDEREADONLY As Long = &H4
Public Const OFN_LONGNAMES As Long = &H200000
Public Const OFN_NOREADONLYRETURN As Long = &H8000&
Public Const OFN_OVERWRITEPROMPT As Long = &H2
Public Const OFN_PATHMUSTEXIST As Long = &H800

Public 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

Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (ByRef pOpenfilename As OPENFILENAME) As Long

Public Const GET_TRUE As Long = 1

Public Function GetOpenDialog(ByVal hwndMain As Long, ByVal strTitle As String, _
    ByVal strFilter As String, ByVal lFilter As Long, ByVal strName As String, _
    Optional ByVal bAllowMultiselect As Boolean = False, _
    Optional ByVal strInitDirectory As String = vbNullString) As String
    Dim CommonDialogOpen As OPENFILENAME
    Dim X As Long
    With CommonDialogOpen
        .lStructSize = Len(CommonDialogOpen)
        .hwndOwner = hwndMain
        .hInstance = App.hInstance
        .lpstrTitle = strTitle
        .lpstrFilter = strFilter
        .nFilterIndex = lFilter
        .lpstrInitialDir = strInitDirectory
        .lpstrFile = strName & LPBuff(512 - Len(strName))
        .nMaxFile = 511
        .lpstrFileTitle = LPBuff(512)
        .nMaxFileTitle = 511
        .flags = OFN_HIDEREADONLY Or OFN_LONGNAMES Or OFN_FILEMUSTEXIST
        If bAllowMultiselect Then .flags = .flags Or OFN_ALLOWMULTISELECT
    End With
    X = GetOpenFileName(CommonDialogOpen)
    If X <> GET_TRUE Then
        GetOpenDialog = vbNullString
        Exit Function
    Else
        GetOpenDialog = StripTerminator(CommonDialogOpen.lpstrFile)
    End If
End Function

Public Function LPBuff(ByVal lNumber As Long) As String
    LPBuff = String$(lNumber, vbNullChar)
End Function

Public Function StripTerminator(ByVal strString As String) As String
    Dim intZeroPos As Integer
    intZeroPos = InStr(strString, vbNullChar)
    If intZeroPos > 0 Then
        StripTerminator = Left$(strString, intZeroPos - 1)
    Else
        StripTerminator = strString
    End If
End Function


Мне-то нужно мульти выделение. Так в чём тут дело?

P.S.
Переход на ComDlg32.ocx не предлагать ;)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 10.07.2005 (Вс) 19:58

Я всегда использовал флаг OFN_EXPLORER, он помогает
Почему nMaxFile = 512, везде вродебы пишется 2562?

JohnCR
Обычный пользователь
Обычный пользователь
 
Сообщения: 75
Зарегистрирован: 14.06.2005 (Вт) 19:03

Сообщение JohnCR » 10.07.2005 (Вс) 20:15

.flags = &H200 Or &H80000

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 10.07.2005 (Вс) 22:29

Да, флаг OFN_EXPLORER помогает... Спасибо, не знал.

Но ведь если проводить аналогию с ComDlg32.ocx, то странно, что OFN_ALLOWMULTISELECT вызывает диалог старого вида.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 15.07.2005 (Пт) 17:26

Да-да. Я этот глюг давно уже знаю и мне тоже интересно почему так!!!

За OFN_EXPLORER спасибо. :arrow:
А я все практикую лечение травами...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Majestic-12 [Bot] и гости: 126

    TopList  
cron