Разницу между ComCtl32.dll в XP и "не XP" известна? С каким пор язык VB обзавёлся виртуальной машиной?Цитата:
Сообщение от Dr.Lion/RSM
Вид для печати
Разницу между ComCtl32.dll в XP и "не XP" известна? С каким пор язык VB обзавёлся виртуальной машиной?Цитата:
Сообщение от Dr.Lion/RSM
Не юзай его! Какой смысл таскать за собой ocx, если все, что он делает, можно сделать через API! Если хочеш, могу скинуть пример. Скажи только куда. Кроме того, по умолчанию он есстессно не ставится ни с одной виндой.Цитата:
Сообщение от Dr.Lion/RSM
Нет. Нет никакой виртуальной машины ;) Ты перепутал, наверное, с набором стандартных dll для VB. Они действительно ставятся с виндой и с офисом.Цитата:
Сообщение от Dr.Lion/RSM
По поводу динамических контролов - не вопрос. Буквально вчера решал такую же задачку. Тавай ТЗ - помогу набросать код.
Кроме того могу написать инсталяху для тулзни.
Понятия не имею, о какой разнице идет речь! Насчет виртуальной машины: что такое по-твоему msvbvm60.dll ? Если делать инсталяху средствами VB, то в общий пакет он ложит кучу всякого геммороя, в том числе и выше указанную библиотеку, а это значит, что без нее программы на VB не будут работать. Но данная библиотека попадает на комп вместе с виндой (у меня XP без офиса), либо с офисом (это наверняка).Цитата:
Сообщение от icebear
Если знаешь, то напиши мне пример, как можно заюзать это в Visual Basic через Win API. Кусок исходника можешь выложить сдесь. Вот то, что у меня юзается сейчас:Цитата:
Сообщение от Odrick
Private Function GetFileName(BoxName As String) As String
Dialog.Filter = "Файл настройки|*.ini|Текстовый файл|*.txt|Все файлы|*.*"
Dialog.Flags = cdlOFNHideReadOnly
Dialog.DialogTitle = BoxName
Dialog.FileName = ""
Dialog.ShowOpen
Dialog.InitDir = ""
GetFileName = Dialog.FileName
End Function
Напиши, пожалуйста, альтернативу под API.
Какая здесь нафиг инсталяха? Архив с тремя файлами распаковывается в каталог эмуля - и все!Цитата:
Сообщение от Odrick
:) msvbvm60.dll - всего лиш набор com-серверов, которые реализуют стандартные GUI-элементы VB и основные функции языка. Но это никак не виртуальная машина ;) Так можно любую dll с com-объектами и функциями назвать виртуальной машиной.Цитата:
Сообщение от Dr.Lion/RSM
Это да. Но справедливо только в том случае, если у юзера есть все компоненты, нужные для работы софта. По хорошему это делается так: вылаживается минимальная версия (архив с 3-мя файлами :) ) и полная инсталяха. Но только сделанная не "стандартными средствами VB" ;) . А дальше пусть каждый качает то, что ему нужно.Цитата:
Сообщение от Dr.Lion/RSM
По поводу диалога выбора файла. Сделай модуль, вставь в него следующий код и пользуй функцию opendlg. Думаю смысл всех параметров ясен ;) Так как здесь юзается чистое API, ничего лишнего типа comdlg32.ocx за собой таскать не прийдеться :)
Да, посмотрел интерфейс - хотелось бы все-таки что-то в духе списка с ветками настроек слева и странички справа с параметрами. И чтобы каждый параметр редактировался с помощью своего контрола. Так по моему удобнее будет... Но это так, мое мнение :)Код:Option Explicit 'Чтоб все объявить явно
Public Enum ofnflags 'Флаги API GetOpenFileName
OFN_ALLOWMULTISELECT = &H200
OFN_CREATEPROMPT = &H2000
OFN_ENABLEHOOK = &H20
OFN_ENABLETEMPLATE = &H40
OFN_ENABLETEMPLATEHANDLE = &H80
OFN_EXPLORER = &H80000 ' new look commdlg
OFN_EXTENSIONDIFFERENT = &H400
OFN_FILEMUSTEXIST = &H1000
OFN_HIDEREADONLY = &H4
OFN_LONGNAMES = &H200000 ' force long names for 3.x modules
OFN_NOCHANGEDIR = &H8
OFN_NODEREFERENCELINKS = &H100000
OFN_NOLONGNAMES = &H40000 ' force no long names for 4.x modules
OFN_NONETWORKBUTTON = &H20000
OFN_NOREADONLYRETURN = &H8000
OFN_NOTESTFILECREATE = &H10000
OFN_NOVALIDATE = &H100
OFN_OVERWRITEPROMPT = &H2
OFN_PATHMUSTEXIST = &H800
OFN_READONLY = &H1
OFN_SHAREAWARE = &H4000
OFN_SHAREFALLTHROUGH = 2
OFN_SHARENOWARN = 1
OFN_SHAREWARN = 0
OFN_SHOWHELP = &H10
End Enum
Private Type OPENFILENAME 'Структура для API GetOpenFileName
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 Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Public Function opendlg(hwnd As Long, Filter As String, FilterIndex As Long, FileName As String, DefaultExt As String, InitDir As String, DialogTitle As String, flags As ofnflags) As String
'Функция вызывает окно выбора файла, возвращает выбранный файл (или пустую строку в случае отмены)
Dim iDelim As Long
Dim OFN As OPENFILENAME 'Структура для API GetOpenFileName
Dim sTemp As String
Dim i As Integer
Dim retval As Long 'Значение возвращаемое самой API
flags = flags And (&H1 Or &H2 Or &H4 Or &H8 Or &H10 Or &H100 Or &H200 Or &H400 Or &H800 Or &H1000 Or &H2000 Or &H4000 Or &H8000 Or &H40000 Or &H80000 Or &H100000 Or &H200000) 'Эти флаги не должны стоять в открытии, сбросить их
With OFN
'Длинны структуры
.lStructSize = Len(OFN)
'Дескриптор окна
.hwndOwner = hwnd
'Коментарии излишни, флаги
.flags = flags
'Расширение по умолчанию, тоже нужно хоть и открытие :-(
.lpstrDefExt = DefaultExt
sTemp = InitDir
'Если не выбрана парка то папка с прогой
If sTemp = "" Then sTemp = App.Path
.lpstrInitialDir = sTemp
sTemp = FileName
'Все заполнить символом chr(0). Надо!
.lpstrFile = sTemp & String$(255 - Len(sTemp), 0)
.nMaxFile = 255
.lpstrFileTitle = String$(255, 0)
.nMaxFileTitle = 255
sTemp = Filter
'Чтоб ни мучится с выписыванием chr(0) в вызов ф-ии
For i = 1 To Len(sTemp)
If Mid(sTemp, i, 1) = "|" Then
Mid(sTemp, i, 1) = vbNullChar
End If
Next
sTemp = sTemp & String$(2, 0)
.lpstrFilter = sTemp
.nFilterIndex = FilterIndex
.lpstrTitle = DialogTitle
.hInstance = App.hInstance
End With
'Вызов API
retval = GetOpenFileName(OFN)
'А все ли ОК?
If retval = 0 Then
opendlg = ""
Else
'первый символ chr(0)
iDelim = InStr(OFN.lpstrFile, vbNullChar)
'Удалить лишнии chr(0)
If iDelim Then opendlg = Left$(OFN.lpstrFile, iDelim - 1)
End If
End Function
Вот это чтоб получить несчастное имя файла, мне нужно эту хреновину вставить? Я так ничего и не понял, что там к чему и как этим пользоваться! Помоему, я где-то когда-то видел Диалог через АПИ, но там было все намного короче и понятней, вот вспомнить бы где видел!Цитата:
Сообщение от Odrick
Вот последняя версия программы. Об изменениях и дополнениях читайте в файле about. Как и обещал, откомпилено в пи код. Жду новых сообщений о глюках!
Ндя... Объясняю: Это код для отдельного модуля. То есть, добавляеш в проект модуль, обзываеш его как-нить OpenDialog.bas и вставляеш туда код. Для того, чтобы вызвать диалог открытия файла в твоем случае делаеш так:
Private Function GetFileName(BoxName As String) As String
GetFileName = opendlg(Me.hwnd, "Файл настройки|*.ini|Текстовый файл|*.txt|Все файлы|*.*", 0, "", "", "", BoxName, OFN_HIDEREADONLY)
End Function
Так понятнее? ;) Или нужно более подробно расписать текст модуля? Давай мыло - напишу подробно с теорией использования API в VB :) А то что большой модуль - так он и реализует все что нужно в диалоге выбора файла. Могу укоротить его раза в 3. Но тогда он будет несколько убог по функциональности.
Вот теперь понятно, что я должен вставить в свою программу. В версии 1.3 попробую.Цитата:
Сообщение от Odrick
Вот мыло:[email protected] расталкуй, если можешь, по поводу Win API. Укоротить твой пример не мешало бы, ибо диалог у меня используется только для открытия файла в таком виде, как я тибе приводил пример. Еще, что мне нужно вставить в программу вместо:Цитата:
Сообщение от Odrick
IniName=Dialog.FileName
и как мне быть со строками из моего примера:
...
Dialog.FileName=""
...
Dialog.InitDir=""
...
Рассмотрим внимательно параметры функции:
Public Function opendlg(hwnd As Long, Filter As String, FilterIndex As Long, FileName As String, DefaultExt As String, InitDir As String, DialogTitle As String, flags As ofnflags) As String
Dialog.FileName это аналогичный параметр функции FileName
Dialog.InitDir = параметр InitDir
Так что это все задается во время вызова, а не предварительно как в случае с
CommonDialogControl :)
Подожди, насколько я понял у тебя есть функция GetFileName, которая возвращает имя выбранного файла?Цитата:
Сообщение от Dr.Lion/RSM