powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Почему диалог выбора файлов всплывает за другими окнами?
20 сообщений из 20, страница 1 из 1
Почему диалог выбора файлов всплывает за другими окнами?
    #39352319
Alexxx96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Вопрос такой: Из VB6 вызываю диалог открытия файла (например файла Excel)
Делаю так:
Application.Dialogs(xlDialogOpen)
либо
fileToOpen = Application.GetOpenFilename("Документы MSExcel (*.xls), *.xls,(*.xlsx), *.xlsx")

Но загвоздка в том, что диалоги выбора файла всплывают ЗА основной формой, а зачастую и ЗА всеми окнами которые открыты в данный момент на экране. Что за чепуха? Как быть?
Это происходит, после компиляции в exe. Если запускать из редактора VB6 то форма диалога как и положено появляется поверх остальных окон.
Форум вроде почитал, но ответа так и не нашел.
Очень надеюсь на вашу помощь.
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352387
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так надо вывести эксель на передний план.

Да и вообще, зачем из VB6 использовать экселевский диалог, если у него есть свой?
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352424
Alexxx96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А примерчик хорошего диалога VB6 не покажите. А то раньше работал из VBA Excel и такой проблемы не возникало, а с выбором файлов из VB6 сталкиваюсь в первый раз.
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352630
Alexxx96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел вот такой способ:
Dim WSHShell, folder

Set WSHShell = CreateObject("Shell.application")
folder = WSHShell.browseforfolder(0, "Auai? iaiee", 0)

, но опять же это выбор каталога, а не файла.
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352639
Alexxx96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да и этот способ возвращает только имя папки, а не путь целиком.
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352680
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он стесняется.
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352742
Alexxx96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariyон стесняется.

Я вообще-то именно так и подумал сначала
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352767
Фотография by-pass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexxx96,

Завязывайте с VB6, в крайнем случае перепрыгивайте на VB.Net.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
Attribute VB_Name = "basFile"
Option Explicit


Public Declare Function CopyFile& Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long)
Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (ofn As OPENFILENAME) As Boolean
Public Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (ofn As OPENFILENAME) As Boolean

Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    stFilter As String
    stCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    strFile As String
    nMaxFile As Long
    stFileTitle As String
    nMaxFileTitle As Long
    stInitialDir As String
    strTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    stDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

Public Enum OFN_FLAGS
    OFN_READONLY = &H1
    OFN_OVERWRITEPROMPT = &H2
    OFN_HIDEREADONLY = &H4
    OFN_NOCHANGEDIR = &H8
    OFN_SHOWHELP = &H10
    OFN_ENABLEHOOK = &H20
    OFN_ENABLETEMPLATE = &H40
    OFN_ENABLETEMPLATEHANDLE = &H80
    OFN_NOVALIDATE = &H100
    OFN_ALLOWMULTISELECT = &H200
    OFN_EXTENSIONDIFFERENT = &H400
    OFN_PATHMUSTEXIST = &H800
    OFN_FILEMUSTEXIST = &H1000
    OFN_CREATEPROMPT = &H2000
    OFN_SHAREAWARE = &H4000
    OFN_NOREADONLYRETURN = &H8000
    OFN_NOTESTFILECREATE = &H10000
    OFN_NONETWORKBUTTON = &H20000
    OFN_NOLONGNAMES = &H40000
    OFN_EXPLORER = &H80000
    OFN_NODEREFERENCELINKS = &H100000
    OFN_LONGNAMES = &H200000
End Enum


Public Function FileOpenSave(Optional ByRef flags As Long = 0&, Optional ByVal InitialDir As Variant, Optional ByVal Filter As String = vbNullString, Optional ByVal FilterIndex As Long = 1, Optional ByVal DefaultExt As String = vbNullString, Optional ByVal FileName As String = vbNullString, Optional ByVal DialogTitle As String = vbNullString, Optional ByVal hwnd As Long = -1, Optional ByVal OpenFile As Boolean = True) As String
Dim ofn As OPENFILENAME
Dim stFileName As String
Dim stFileTitle As String
Dim fResult As Boolean

    ' Give the dialog a caption title.
    If IsMissing(InitialDir) Then InitialDir = CurDir
    If (hwnd = -1) Then hwnd = 0


    ' Allocate string space for the returned strings.
    stFileName = Left$(FileName & String$(256, vbNullChar), 256)
    stFileTitle = String$(256, vbNullChar)

    With ofn
        .lStructSize = Len(ofn)
        .hwndOwner = hwnd
        .stFilter = Filter
        .nFilterIndex = FilterIndex
        .strFile = stFileName
        .nMaxFile = Len(stFileName)
        .stFileTitle = stFileTitle
        .nMaxFileTitle = Len(stFileTitle)
        .strTitle = DialogTitle
        .flags = flags
        .stDefExt = DefaultExt
        .stInitialDir = InitialDir
        .hInstance = 0
        .stCustomFilter = String$(255, vbNullChar)
        .nMaxCustFilter = 255
        .lpfnHook = 0
    End With

    If OpenFile Then
        fResult = GetOpenFileName(ofn)
    Else
        fResult = GetSaveFileName(ofn)
    End If

    If fResult Then
        flags = ofn.flags
        FileOpenSave = Left$(ofn.strFile, InStr(1, ofn.strFile, vbNullChar, vbBinaryCompare) - 1)
    End If
End Function


Public Function adhFileExists(sFN) As Boolean
Dim s As String

    On Error Resume Next
    s = Dir(sFN, vbHidden Or vbSystem Or vbArchive Or vbReadOnly)
    adhFileExists = ((Len(s) > 0) And (Err.Number = 0))
    Err.Clear
End Function
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352798
Alexxx96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это такой ОГРОМНЫЙ код ради того что бы всего то в VB6 выбрать файл? (теперь понятно почему VB6 загнулся)
В любом случае спасибо, но боюсь, что я в нем не разберусь.
Я вообще не программист по образованию, просто балуюсь иногда VBA и VB6.
А по проще никак нельзя реализовать?
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352809
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexxx96Это такой ОГРОМНЫЙ код ради того что бы всего то в VB6 выбрать файл? (теперь понятно почему VB6 загнулся)на с++ код для выбора файла был бы такой же или еще больше, не понятно, почему с++ не загнулся.
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352826
Фотография by-pass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexxx96,

Да ничто не загнулось. Для каждой задачи свой инструмент.
Ну и нужно как-то развиваться, а баловаться - оно зачем?

Код выше - это код модуля, просто киньте его в проект в виде отдельного модуля.
код вызова примерно такой:
Код: vbnet
1.
2.
3.
        sFilter = "Batch file (*.vba)" & Chr$(0) & "*.vba" & Chr$(0) & "All Files (*.*)" & Chr$(0) & "*.*" & Chr$(0)
        sBatchFileName = FileOpenSave(OFN_OVERWRITEPROMPT, CurDir$, sFilter, , ".vba", , "Select Batch file", -1, True)
        If sBatchFileName = "" Then Exit Function
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352905
BrowseForFolder,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexxx96Нашел вот такой способ:
Dim WSHShell, folder

Set WSHShell = CreateObject("Shell.application")
folder = WSHShell.browseforfolder(0, "Auai? iaiee", 0)

, но опять же это выбор каталога, а не файла.оно-то и для файлов, вроде, пригодно
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Sub test()
' Flags for the options parameter
Const BIF_returnonlyfsdirs = &H1
Const BIF_dontgobelowdomain = &H2
Const BIF_statustext = &H4
Const BIF_returnfsancestors = &H8
Const BIF_editbox = &H10
Const BIF_validate = &H20
Const BIF_browseforcomputer = &H1000
Const BIF_browseforprinter = &H2000
Const BIF_browseincludefiles = &H4000

'
Set WshShell = CreateObject("Shell.Application")
Set oItem = WshShell.BrowseForFolder( _
        &H0, "Select a file or folder to copy", _
        BIF_returnonlyfsdirs + BIF_browseincludefiles, "C:\")
        
Debug.Print oItem.Self.Path
End Sub


но работает как-то очень странно ...
Из одного и того же каталога, файлы htm, zip, xls - выбирает,
а на dll, exe, cmd, bat - валится с "Method 'BrowseForFolder' of object 'IShellDispatch5' failed"
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39352937
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexxx96А примерчик хорошего диалога VB6а чем штатный CommonDialog плох?
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39353093
Alexxx96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to by-pass,

Спасибо, теперь разобрался. Все заработало. Думаю этот вариант действительно самый оптимальный ввиду своей стабильности.

to BrowseForFolder,

Действительно, оказывается можно и файлы выбирать (не знал, спасибо за подсказку), но как замечено работает не очень стабильно. Хотя если, как в моем случае, выбору подлежат только файлы Excel , то вариант вполне рабочий.

to Shocker.Pro,
штатный CommonDialog может и не плох, но как его найти? У меня Visual basic portable и там такого я не нашел. Какой references надо подключить что бы появился CommonDialog ?
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39353170
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это в компонентах
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39353365
Фотография by-pass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Уже не помню, но разве этот ОСХ не нужно будет потом регистрировать, если кому-то передавать программулину?
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39353370
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
by-pass,

Нужно.
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39353522
Alexxx96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

У меня такого в компонента нет. Видимо из за того что у меня portable.
Скачал comdlg32.ocx, компонент появился, но выдает ошибку , что то с лицензированием (у меня win 8, может с этим связано, а может не тот скачал)
А раз выясняется что этот OCX на других компах придется ещё регистрировать, то пока альтернативы варианту предложенному, by-pass-ом я не вижу.
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39353576
Фотография by-pass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexxx96,

Вопрос регистрации решается просто - создание инсталляшки.
Другое дело, что если планируется передавать софт, написанный на VB6 на сторону, то можно огрести дополнительные ошибки у заказчика. А первое впечатление, испорченное выскакиванием всяких ошибок, это очень чревато...
Я такое решаю тестирование на виртуальных машинах, но эти лишние "телодвижения" - оно нужно?
И все таки, почему VB6?
...
Рейтинг: 0 / 0
Почему диалог выбора файлов всплывает за другими окнами?
    #39353795
Alexxx96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
by-passAlexxx96,

......
И все таки, почему VB6?

Работа у меня экономическая и поэтому основные мои средства это Excel и VBA, а VBA и VB6 это родственники.
Только из VBA exe-файл не сделать, а из VB6 сделать. А exe нужен что бы чьи-нибудь шаловливые ручки из соседних отделов ничего не попортили в коде. В начале я это решал проще-мне присылали файл на обработку и я его сам обрабатывал макросами VBA, но теперь времени стало нехватать.
Ну и кроме синтаксиса бэйсика я в общем то ничего и не знаю
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Почему диалог выбора файлов всплывает за другими окнами?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]