Shiru, в любом случае это придётся делать. какая разница, кнопками или мышью ;)
Вид для печати
Shiru, в любом случае это придётся делать. какая разница, кнопками или мышью ;)
Ну, галки в окошке быстрее покликать, чем мотать километровый ini, и сравнивать его с предыдущим:)
Вообщем, народ, ситуация следующая. Так как версии Unreal часто обновляются, мною было принято решение написать незамысловатую утилитку для настройки unreal.ini файла. Вот краткие ее характеристики:Цитата:
Сообщение от Shiru
1.Наличие легкообновляемой базы версий, позволяющей корректно настраивать конкретную версию эмулятора а так же, при создании своей собственной записи в базе, одним движением мыши модифицировать ini файл своими любимыми настройками (т.н. пресеты).
2.Возможность изменять параметры unreal.ini в рамках выбранной записи из базы версий.
3.Возможность парой кликов мышки перенести параметры настройки из более старой версии эмулятора в файл unreal.ini новой версии.
Также следует отметить, что:
-комментарии в изменяемом ini файле не пропадают, изменяются лишь параметры!
-предполагается распространение программы в составе пакета самого эмулятора, т.к. при запуске программа в текущем каталоге ищет unreal.ini и в последствии работает именно с ним! Если SMT откажется включать UConfig (название программы) в комплект эмуля и обновлять его базу версий новыми записями, то возможны два варианта: 1) обновляю UConfig и включаю в состав новой версии я, после чего весь пакет размещаю на моем сайте; 2) на сайте размещается лишь обновленный UConfig, который придется закачивать и копировать в папку с новой версией эмуля. Это решать SMT!
Так что, хватит донимать автора, пускай занимается непосредственно доводкой самого эмуля. Вносить новый малонужный код в эмуль - значит плодить новые глюки! Пускай конфигуратор будет внешним.
И напоследок - конфигуратор готов на 70%, правильно ищет и изменяет параметры в unreal.ini. Сейчас решаются некоторые проблемы интерфейса. Программа полностью написана на VB6.
сегодня я придумал алгоритм сохранения, выглядит так: открывается диалог save as..., выбирается имя файла. потом старый ini читается по строчкам, если строка начинается с известной опции, пишется вместо неё текущее значение, комментарий сохраняется. если после записи блока какая-то настройка оказалась незаписанной, она дописывается в конец блока без комментария. опционально можно создать cmd-файл след. содержания: "<текущий>.exe -i <новый>.ini %1 %2 ... %9". пока повременю с кодингом, посмотрю на мнения, кому как покажется удобнее - настраивать отдельно или сохранять в другой файл
теперь общие вопросы к Dr.Lion/RSM. 1. эмулятор не позволяет редактировать пресеты (для ROM, keyboard, ULA, ...). может ли это делать UConfig?
2. мне кажется, пользователям будет удобнее видеть настройки сгруппированными примерно по тем же закладкам, что и в эмуляторе. похож ли интерфейс UConfig на диалог настроек?
3. примерно что находится в базе, как её поддерживать?
теперь насчёт распространения: вариант 0 возможен, если будут публиковаться все исходники (политика sourceforge). и с исходниками заморочки - надо открывать новый package или новый проект. если меняется только база, рациональнее прикладывать именно её в bin-архив. exe-шник можно взять у автора. варианты 1 и 2 для меня примерно одинаковы [хотя 1 предпочтительнее - как-никак появляется зеркало :), но для пользователей, которые как правило качают с VT, наверное удобнее 2]
пока я в сомнениях...
Впринципе, можно задать запись версии, где можно выбирать из присутствующих в unreal.ini пресетов ROM, keyboard,ULA,... Создание новых пресетов этих параметров пока не предусмотрено. Так же на предусмотрено (хотя можно реализовать) выбор путей в качестве параметров (например, путь к ZX файлам и т.п.).Цитата:
Сообщение от SMT
Интерфейс (ввиду необходимости работать со всеми версиями эмулятора) совершенно не похож на интерфейс настроек самого эмулятора (ведь этот интерфейс от версии до версии изменяется). Концепция программы построена таким образом, что автор эмулятора смог бы сам создавать записи в базе без изменения или внесения каких либо опций в самом коде UConfig. Интерфейс больше похож на сам ini файл - выбирается группа параметров, в группе выбирается конкретный параметр и в списке выбирается или задается с клавиатуры соответствующее значение параметра. При этом есть два отображения параметров:1.основной режим - самые необходимые параметры; 2.Расширенный режим - все доступные для конкретной записи версии параметры. По каждому параметру выводится небольшая справка (для этого в базе версий есть раздел с описателями параметров, который должен пополняться при появлении в эмуляторе новых настроек).Цитата:
Сообщение от SMT
В базе, как я уже упоминал, находятся записи версий. Запись версии - это перечень доступных для изменения параметров. Для каждого параметра задается список возможных значений и значение по умолчанию. Так же в базе имеется раздел, в котором приведен перечень всех известных на данный момент параметров unreal.ini с описаниями этих параметров. Так же этот список, я так думаю, будет использоваться в качестве перечня параметров, которые должны переноситься из старой версии в новую (кстати, один из способов решить проблему с заданием путей к zx файлам или rom файлам). Пока это все, но может еще что-то добавиться в базу. База представляет собой самый обыкновенный txt файл, наподобие unreal.iniЦитата:
Сообщение от SMT
Насчет sourceforge. Зря ты вообще с ним связался! Мне стало очень неудобно качать с него новую версию эмуля. Мало того, что эмуль теперь порезан на исходники, на бинарник и на доки, так этот soundforge пока скачаешь package зае..т тупыми вопросами! Ну это мое личное мнение! Было куда удобней качать эмуль прямо с форума или zx.da.ru! Как распространять UConfig - твое дело! Если
sourceforge накладывает кучу своих ограничений, то будет разумно просто включать в пакет с бинарником txt базу для UConfig. Я буду брать обновленную тобой для новой версии эмуля базу, вносить туда дополнительные записи от себя и уже в одном флаконе с Unreal, ромами, дополнительными библиотеками и файлами вместе с UConfig размещать у себя на сайте. Так же могу дополнительно размещать только сам UConfig с обновленной тобой базой. Саму базу обновлять очень легко, посмотришь в txt и сделаешь наподобие!
Какие еще вопросы?
Кстати, ничего не мешает прикрутить UConfig к другим эмуляторам, хранящим свои настройки в текстовых файлах. Еще не пробовал, но мне здается, UConfig смог бы конфигурировать, наприме, Z80Stealth Emulator.
наверное, это будет сложно (копаться в базе. в смысле не один раз, а с каждой новой версией). в любом случае, надо посмотреть на то, что получится. а насчёт sf.net - это твой выбор, зачем ты качал с sf? подождал бы 2 недели и скачал с zx.da.ru :) в любом случае, эта задержка неустранима (от меня не зависит). качать с форума неудобно imho, потому что не поддерживается докачка
Тогда такой вариант: ты перед самым выходом новой версии шлешь мне по мылу файлик новой версии unreal.ini, я вношу все изминения в базу и отсылаю тебе саму базу, которую ты и кладешь к эмулю. Но чтоб не было тормозов в этом деле, нужно, чтоб мы могли в любое время связаться, скажем, по ICQ. Я в сети почти постоянно. Номер твоей аськи вычислить мне не удалось (существует ли он вообще?). Но если и этот вариант в напряг, то я могу (с твоего разрешения) сам вести UConfig и выставлять его на сайте (вот только разрозненность получится - эмуль там, конфиг там!). А по существу, если набор параметров в unreal.ini в новой версии эмуля остается не изменным, то в UConfig ничего не мешает взять более старую версию записи и все настроить в рамках ее параметров. Вообще, записи нужны лишь чтоб играничивать набор доступных (для соответствующей версии эмуля) параметров, так что обновлять за каждым разом базу вовсе не обязательно. Ты хотя б прикладывал бы UConfig с более-менее новой базой версий (которую я мог бы тебе обновлять и высылать по мылу).Цитата:
Сообщение от SMT
Так что, мое дело предложить! Народ жаловался на неудобство настройки эмуля - я вот предлагаю выход! Тем более, имея возможность переносить параметры с предыдущей версии в новую, настраивать вообще ничего не надо!
И все-таки по-моему сохранение текущего конфига изнутри эмуля - необходимо. В ином случае это какая то неполноценная программа получается: отконфигурить можно, но только на текущую сессию... выглядит как явная недоделка.
SMT, скажи плиз для чего есть возможность непропорционального изменения размера окна?
:smile: :smile: :smile:
Ну слава кпсс! нашлись люди утолить страждущих!
наверное на форуме можно сделать окошко как в других сайтах: продукт-ссылка где лежит, патч-ссылка, лекарство- ссылка, форум не забивается, ссылки можно периодически править- и все дела.
Uниверсальный config-уратор лучше делать только под унреал, меньше гимора, глюков и вопросов,,,,,,,,,,,для особо настойчивых можно отдельным проектом пустить универсал- но делать совместимым с туевой хучей других эмулей - по опыту- тяжело, баз мало, версии плодятся как кролики, изменения чудовищные, всех ньюансов просто не успеваешь отследить. :wink: :wink: :wink:
Никто пока не собирается поддерживать другие эмули (пока не появится в этом необходимость). Просто имелось ввиду, что форма реализации конфигуратора такова, что он может править любые (даже виндошные) ini файлы, если ему сделать соответствующую базу знаний (параметров). Но все же UConfig заточен именно под Unreal Speccy.Цитата:
Сообщение от Goga
да по-хорошему, надо вообще убрать флаг, разрешающий пользователю менять размер окна. потому что нормальный результат есть только в полном экране или зуме 1:1 или 2:1, что и есть в системном меню. надо будет кнопки к этому привязатьЦитата:
Сообщение от Dexus
пока в новой версии не предвидится новых настроек, только новые кнопки в [SYSTEM.KEYS] но так как ты их не редактируешь, ничего менять не надо. в любом случае, надо сначала посмотреть на конфигуратор и базыЦитата:
Сообщение от Dr.Lion/RSM
на форуме, наверное, так не сделать. если кидать ссылки в первом сообщении, то при обновлении люди будут идти на последню страницу (неизвестно, изменилась ссылка в начале, или кто-то дописал в конец). а ведь понапишут страниц 18 - ищи потом :)Цитата:
Сообщение от Goga
На данный момент конфигуратор готов на 90%. Удалось порешать самые сложные проблемы. Сделана возможность обновления старыми настройками. Осталось сделать запись измененного unreal.ini, добавить парочку фич, вылизать код и отловить явные глюки - но это мелоч. Нужно хоть первоначально заполнить базу записями основных версий эмуля, составить полный словарь описателей параметров. Так что не сегодня - завтра я думаю смогу выкинуть в люди первую версию конфигуратора. Только вот вопрос, как мне поступить? Выставить сдесь для всеобщего скачивания, или сначала кинуть тебе на ящик, чтоб ты ознакомился и дал добро на размещение здесь (если у тебя не появится замечаний).Цитата:
Сообщение от SMT
Насчет [SYSTEM.KEYS]. По идее, можно в базе сделать возможность редактировать эти кнопки, но вопрос в том, многие ли редактируют эти кнопки? Я буду включать в базу только самые критичные и "популярные" настройки.
лучше сразу сюда
Не знаю, я кнопки по умолчанию всегда использую. А насчет пропуска первой страницы- не знаю, новички все равно с первой читают, чтоб быть в курсе, а кто давно тусуется- просто знает где и что. Не вижу проблемы. Хорошо бы еще в конфигураторе сделать Save as.... Для особо продвинутых(гы гы) .
Вот на ваш суд выставляется первая версия UConfig. Её можно назвать бета версией, так как она не содержит в базе все версии эмулятора, которые я туда хотел занести, и над ней не проводились серьезное тестирование.
Некоторая терминология:
1.База версий - текстовый файл ucbase.txt, содержащий записи по определенным версиям эмулятора.
2.Запись - описание доступных для изменения в ini файле соответствующей версии параметров. По каждому параметру имеется список доступных для него значений (за исключением параметров, значения которых вводятся с клавиатуры и бинарных значений 0/1 ) и значение по умолчанию (default).
Как работать с программой:
1.После запуска программы определитесь, что вы хотите сделать:
1.1.Изменить отдельные настройки ini файла:
а) Уберите птичку "Заполнить значениями из базы";
б) Загрузите нужный ini кнопкой Load;
в) Найдите необходимые параметры и измените их значения.
1.2.Перенести настройки из ini файла старой версии эмулятора в ini файл новой версии эмулятора:
а) Уберите птичку "Заполнить значениями из базы";
б) Загрузите нужный ini кнопкой Load;
в) Загрузите ini старой версии эмулятора кнопкой Auto, после чего начнется процесс автоматического переноса значений параметров.
г) Просмотрите в поле подсказки, какие параметры удалось перенести.
1.3.Перенести настройки default из базы в ini файл:
а) Установите птичку "Заполнить значениями из базы";
б) Загрузите нужный ini кнопкой Load, после чего значения параметров автоматически подобранной записи перенесуться в ini;
в) Если автоматически подобранная запись версии вас не устраивает, выбирите другую запись версии, после чего значения параметров этой записи перенесутся в ini.
2.Если есть необходимость, выбирите нужные параметры и измените их значения самостоятельно. Что бы получить доступ ко всем параметрам записи установите птичку "Полный список параметров".
3.Кнопкой Save and Exit запишите измененный ini файл и выйдите с программы.
Примечания:
1.Если программа не находит в базе запись, соответствующую загруженному ini файлу, то она автоматически выбирает самую последнюю запись базы.
2.При автоматическом переносе значений параметров из старой версии в новую, некоторые значения параметров не будут перенесены, если соответствующие параметры не присутствуют в обоих ini файлах. Так же некоторые параметры могут получить ошибочные значения если эти параметры присутствуют в обоих ini, но предполагают разные наборы допустимых значений (например, параметр HIMEM в версиях 0.22 и 0.29).
3.Некоторые параметры задаются путем ввода значения с клавиатуры (числовые параметры, имена файлов, пути к файлам).
4.Пока не рекомендуется использовать программу с ini файлами версиями ниже 0.22.
Просьба хорошо погонять программу и выявить ее ошибки в работе. Если вы желаете внести свою личную запись в базу, то вышлите мне по мылу файл настроек от своей любимой версии Unreal Speccy.
Выражаются благодарности:
1.SMT за его эмулятор и за отсутствие записи настроек :)
2.Scorpion/RSM за присланный набор ini файлов от разных версий эмуля.
3.Cooper/RSM за размещение программы на нашем сайте.
4.Всем, кто признает программу удобной и будет ею пользоваться.
главную форму можно ресайзить. это болезнь delphi и vb :)
в инструкции написано "снимите (установите) галку" но она задизаблена сразу после запуска. в окнах выбора файла лишние "open as read-only" - они же не отслеживаются? и ещё нужно правильно реагировать на cancel в окне выбора файла
вообще, imho, нужно очень хорошо знать разделы ini, чтобы быстро что-то найти и отредактировать. ещё минус - чтобы изменить 1-2 настройки, нужно сделать огромное количество кликов. всё-таки лучше, когда все чекбоксы и списки перед глазами одновременно
Упустил - это мой прокол, в новой версии исправлю!Цитата:
Сообщение от SMT
Да, с этим я тоже тормознул, что-нибудь придумаю :(Цитата:
Сообщение от SMT
Не отслеживаются, но и никому не мешают.Цитата:
Сообщение от SMT
Что значит "правильно"? У меня при их нажатии просто происходит возврат без загрузки файла.Цитата:
Сообщение от SMT
Те люди, которые всю жизнь вручную редактируют настройки Unreal Speccy, разделы ini знают просто отлично и что им нужно изменить находят быстро!Цитата:
Сообщение от SMT
Это неизбежная плата за универсальность! UConfig может поддержать любую существующую версию эмулятора, а запись настроек появится (может быть) только в следующей версии Unreal, которая не будет работать на Win 9x! Ты ж не станешь заботится о пользователях, которые (и я в том числе) до сих пор под Win 98 юзают US0.22? Большинство людей предпочитают переходить на новую версию эмуля только пропустив 2- версии. Таким образом более стрые версии эмуля все еще актуальны и для них нужен конфигуратор.Цитата:
Сообщение от SMT
А вообще, основная ценность программы - возможность переносить настройки из старой версии эмуля в новую, тем самым облегчая переход на новые версии Unreal Speccy и стимулируя закачки новых версий.
Вот подправленная версия UConfig 1.1 без глюков Resize и доступным флажком "Заполнить значениями из базы". Приношу свои извинения за предоставленные неудобства и выражаю благодарность SMT за обнаруженные глюки!
Хе-хе, те люди ещё в школу не пошли;) Которые всю жизнь-то.Цитата:
Те люди, которые всю жизнь вручную редактируют настройки Unreal Speccy
Что за слово такое - 'насторйка'? Вот копирайтище зелёный влепить - это первым делом;)
По существу пока ничего не скажу, кроме одного - неудобно. Хрен редьки получился не слаще. Подумаю, позже внесу предложения...
Здесь всю жизнь = время работы с Unreal Speccy.Цитата:
Сообщение от Shiru
Это, наверное, по-польски, но я думаю смысл понятен - подправлю :)Цитата:
Сообщение от Shiru
Ну так, на первых порах без этого просто никуда! Реклама - двигатель торговли ;)Цитата:
Сообщение от Shiru
Это говорит только об одном - ты не знаешь всех возможностей программы. Неужели придется писать полномасштабный мануал?Цитата:
Сообщение от Shiru
Скорее, это говорит о плохом дизайне интерфейса:)Цитата:
Это говорит только об одном - ты не знаешь всех возможностей программы
Вообще, в Delphi/Builder нет никаких проблем с динамическим созданием контролов - можно было-бы сделать несколько страниц (по именам разделов), на которые кидались-бы чекбоксы и комбобоксы, для выбора нужных настроек. Было-бы нагляднее. Конечно, это геморно писать...
где HTTP? чего рекламировать?
Программа написана на VB, а там про динамическое создание контролов ничего не говорится или я ничего не знаю. Практически в каждой версии эмуля в ini есть свои особенности. Как их все учесть при создании желаемого тобой интерфейса?Цитата:
Сообщение от Shiru
Ничего не понял, что ты имеешь ввиду?Цитата:
Сообщение от SMT
страница у программы есть?
посчитать число разделов, создать столько закладок. на каждой закладке динамически в столбик (может скролл форму появится) вывести чекбоксы и списки. подсказка - всплываетЦитата:
Сообщение от Dr.Lion/RSM
слабо так? :)
вот пример:Цитата:
Сообщение от Dr.Lion/RSM
если динамически не получится, то можно тупо набросать невидимых 50 чекбоксов вниз формы и брать их оттуда по мере необходимости, перемещая в нужное местоЦитата:
Сообщение от MSDN
Ребята!!! не фурычит конфигуратор, ХРsp1, ничего не грузит и не заполняет.............просто форма. Может я чегото недогрузил?
Давай поподробней! Выдаются ли какие-то сообщения? Какой вид у формы (после запуска должны быть доступны один чекбокс и кнопка Load). Как ведут себя кнопки Auto и Load?Цитата:
Сообщение от Goga
Теперь мои соображения. Я пишу программу в Visual Basic 6.0 на Win XP Proffesional SP2. Предыдущие версии откомпилированы в исполняемый код с оптимизацией по размеру. Может проблемы в самом получаемом коде, ведь VB6 писался, когда еще не было ХР! Так же Scorpion жаловался, что у него незапускается конфигуратор и выдает сообщение о проблемах с компонентом Common Dialog Control (компонент используется при выборе файла ini для загрузки). Были ли у кого-то подобные проблемы?
Сегодня я планирую выложить новую версию 1.2 в которой улучшено качество программы и исправлены мелкие неточности и глюки (возможно пополню базу записями). Я планирую откомпилировать программы в пи код, при этом она получится почти в 2 раза меньше и возможно убирутся глюки под ХР. Пи код, насколько я знаю, - это специальный код, который исполняет виртуальная машина Visual Basic, поэтому, как бы, должна быть меньшая платформозависимость. Виртуальная машина, по-идеи, входит в состав винды сразу после ее установки, по крайней мере после установки офиса она там точно есть!
Разницу между 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
Вот мыло:lion_rsm@mail.ru расталкуй, если можешь, по поводу 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