Zinc: рецепты применения.
Контроль над мышью
для реализации на цинке под WinXP пример выглядит примерно так Код:
// задействуем обработчик события onAppExit чтобы при выходе "восстановить" скорость мыши. модераторам: в это тему можно складывать удачные примеры использования цинка. |
Использование функций VBS и WSH
Для использования многих системных функций, не имеющих реализации в цинке или реализованных с какими-то косяками, можно задействовать встроенный mdm-класс mdm.System.VBScript (как вариант mdm.System.JScript). В документации сказано, что метод mdm.System.VBScript.execute() ничего не возвращает. Однако это не так. Внимание - каждую строку тела формируемого скрипта не забываем заканчивать символом переноса строки. Код:
var vbCode = 'Function MyFunc(a,b,c,d,e)\r'; Польза в том, что можно использовать vb-скрипты с обратной связью, получая от них данные. Например, задействовать встроенные в vbs функции обработки строк при помощи регулярных выражений, шелльные команды, системные и сетевые функции и т.п. Возможностей тут немало, стоит посмотреть документацию по VBS и WHS. Скачать доки по скриптам http://download.microsoft.com/downlo...scrdoc56en.exe Пример 1 Получить имя компа, юзера, домена. Эти сведения будут отражать имя пользователя ЗАПУСТИВШЕГО ПРОГРАММУ. Т.е. при использовании команды "запуск от имени...", например, будут возвращены имя и домен пользователя, от чьего имени был произведен запуск. В скриптах используются COM-объекты, такие как Shell, WScript, FileSystemObject и т.д. Код:
var vbCode = 'Function MyFunc(a,b,c,d,e)\r'; Замена символов в строке. (см. мануал по vb-функции Replace) Код:
var vbCode = 'Function MyFunc(a,b,c,d,e)\r'; Импорт текста из документа Word. В примере файл "Test line.doc" содержит несколько строк текста. Код:
var vbCode = 'Function MyFunc(a,b,c,d,e)\r'; Пример 4 Регулярные выражения. В примере в передаваемой строке ищется адрес e-mail и производится его разбор. Код:
var vbCode = 'Function MyFunc(a,b,c,d,e)\r'; Построчное чтение текстового файла. Аргументы вызова - полное имя файла и номер строки, которую нужно прочитать. Код:
var vbCode = 'Function GetLineTextFile(a,b,c,d,e)\r'; В случае, если передан номер строки, больший их общего количества в файле, возвращается номер последней строки и она сама. |
А нельзя ли сделать что-нибудь наподобие динамической библиотеки различных функци vbs?
Код:
var vbCode = 'Function MyFunc(a,b,c,d,e)\r'; оригинальный xml здесь http://flasher.ru/forum/newreply.php...reply&p=677298 Код HTML:
<?xml version="1.0"?> Происходит динамическая подгрузка этого компонента и вызывается его метод mkdir(path), который создает папку 'path'. Проверку на "already exists" в этом примере я не делал, поэтому имя папки (в примере - NewFolder) должно быть уникальным, иначе - ошибка. Т.е. происходит что-то наподобие вызова библиотечной функции. Еще один занятный пример. Пример 7 Код:
var vbCode = 'Function MyFunc(a,b,c,d,e)\r'; |
Получить список логических дисков
Код:
this.createTextField("driveList", 1, 20, 20, 200, 300); по принципу 0000000000001101 ...................DCBA 1 - соответствует наличию диска с буквой, 0 - отсутствует диск с такой буквой. В примере видно, что есть диски A, C и D. |
Программно изменить раскладку клавиатуры
Код:
// подключаем системную DLL user32.dll Параметры берутся из справки WIN API Еще о переключении раскладки. Вот так можно обойтись без подключения системных DLL. Код:
createTextField("test", 1, 20, 20, 200, 200); form - Название формы приложения (form title). Окно самому себе шлет message - запрос на изменение раскладки WM_INPUTLANGCHANGEREQUEST( численное значение 0x0050) c параметром-значением раскладки. |
Работа с реестром
C именованием методов цинка наблюдается путаница. Внесем некоторую ясность. Папки в левой панели редактора реестра regedit - разделы (или ветки 'branches'). Методы mdm.System.Registry.createKey, .getKeyNames и .deleteKey воздействуют именно на разделы. Далее, в правой панели regedit'a отображаются ключи: название, тип, значение, которые в данном разделе присутствуют. на пример Код:
var login:String = mdm.System.Registry.loadString("3", "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", "DefaultUserName"); То же относится и к .saveString(), который принимает аргументами ветку, имя ключа, значение. С удалением раздела (ветки) нет проблем. Но вот с удалением ключа или его значения - непонтно. Метод deleteValue() не работает. Да и принимает он, судя по мануалу просто ветку, имя ключа туда не вставляется. Видимо, это косяк. Здесь http://www.mdmforum.com/forum/index....hl=deletevalue изложена пара достойных идей как этот косяк спрямить. В частности, осбого внимания заслуживает использование утилиты редактирования реестра из командной строки REG DELETE. Код:
var cmdExe = "REG DELETE раздел /v ключ"; Да, еще. Методы .load() и .save() облегченный вариант всех прочих. В том смысле , что они воздействуют на определенную ветку в реестре, и ее не надо им указывать, ветка эта формируется при первом вызове .save(), точное ее местоположение огрворено в мануале: HKEY_CURRENT_USER\Software\<название формы приложения>\ . пример Код:
go.onRelease = function() { возможности vb-скрипта это позволяют. А вот так можно получить имя текущего пользователя и домена на WinXP Код:
var login:String = mdm.System.Registry.loadString("3", "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", "DefaultUserName"); Для корректной работы лучше использовать WSH-скрипт. Код:
// "голый" WSH-скрипт для работы с реестром может выглядеть так |
Экспорт в Word
пример работы с VBScript. В системе должен быть установлен Word, чтобы все работало. Код:
//каждую строку тела формируемого скрипта не забываем заканчивать |
Экспорт в Excel
Простенький пример выгрузки данных из цинк в MS Excel суть та же что и с Word, только в скрипте используется другой VBA-объект - Excel.Application Код:
//каждую строку тела формируемого скрипта не забываем заканчивать |
Запуск скринсейвера
небольшая фича, которая позволяет запустить программно скринсэйвер, установленный в системе по умолчанию Код:
// go-стандартная кнопка Далее окно само себе шлет системное сообщение на запуск скринсейвера. |
Запрет на запуск второго экземпляра приложения 1
Код:
//заставляем окно приложения реагировать Конечно, сохранять хэндл необязательно в реестр, просто это в данной ситуации удобно. В случае нештатного завершения работы приложения эта схема не работает. ПОЭТОМУ ДРУГОЙ ПРИМЕР. Запрет на запуск второго экземпляра приложения 2 Код:
mdm.Application.doEvents(); FormTitle и ApplicationTitle можно указать статически в самом компиляторе. Но в этом случае к ним не получишь доступ так просто. И придется писать в условии сравнения титлов сам титл. Не поручусь, что это всегда работает, особенно когда титл русский или необычные символы там есть. Поэтому, лучше назначать их динамически в коде. |
Zinc: Access violation at ...
Ошибка при запуске приложения
Иногда при разработке приложения на Zinc возникает такая ситуация, что приложение при запуске выдает ошибку вида Код:
"Access violation at address 7C93426D in module 'ntdll.dll. Read of address 003a0043." Данная проблема может возникнуть при попытке переноса приложение на другой компьютер простым копированием исполняемого файла, а так же при запуске с CD. И даже при переносе исполняемого файла в другую папку на той же машине, что я наблюдал сам. На mdm-форуме эта прблема обсуждалась довольно долго. http://www.mdmforum.com/forum/index.php?showtopic=13421 Кратко изложу суть обсуждения. По непонятым причинам один и тот же .ехе файл нормально запускается на одной машине и отказывается стартовать на другой. Речь шла именно о запуске с CD. Эксперименты разработчиков показали, что возникновение ошибки происходит непредсказуемо. Например, производились проверки на разных OC (семейства Windows), на разных аппаратных конфигурациях. Никакой закономерности отследить не удалось и баг был помещен в WishList. Тем не менее, было найдено несколько приемов устранения этой специфической ошибки. 1. Запуск в режиме совместимости с Win98. 2. Внесение изменений в реестр, таких, что программа принудительно стартует в режиме совместимости с Win98. 3. Сокращение имени исполняемого файла до 3-х - 4-х символов (или даже до 1-ого). В моей практике эта неприятная ситуация возникала несколько раз. Всякий раз сокращение имени файла мне помогало. Видимо, о чем свидетельствуют и сведения из указаного топика на mdm-форуме, этот прием наиболее эффективен. В целом у участников обсуждения сложилось мнение, что проблема возникает из-за внутренних политик безопасности Windows XP. В чем конкретно состоит причина выяснить не удалось. Будем надеяться, что производители Zinc смогут разрешить этот вопрос. [добавлено] М-да... сокращение имени файла не панацея, как оказалось. После некоторого количества собственных экспериментов складывается такая картина. 1. "непредсказуемость" возникновения бага обусловлена на самом деле текущим сосотоянием профиля пользователя, который пытается приложение запустить. пересоздание профиля устраняет баг. где сидит затык в профиле до конца не выяснил, но установлено, что сидит он в той его части, которая хранится на компе, не выгружается на сервак (в случае использования сетвого входа). поэтому, на одних компах баг проявляется, на других может и не проявляться. даже если установить точную причину затыка, вряд ли это будет иметь практическое значение, т.к. править профиль перед запуском все равно никто не будет. 2. баг с "хорошей" вероятностью возникает, если в Zinc IDE вручную указывать заголовок формы и приложения (поля Form Caption и Application title). Application title скорее приводит к ошибке. при этом "плохо" себя ведут символы вроде точки, пробела, русских букв, но не всегда, почему - смотри п.1. если задавать эти параметры программно, оставляя соответствующие поля в IDE пустыми, даже с использованием этих символов, баг не возникает. 3. баг не проявляется независимо от других факторов, если запускать приложение в режиме совместимости с Win98, Win2000. это может оказаться полезным при создании собственного инсталлятора приложения (см. NSIS, Inno Setup из бесплатных). В алгоритме установки можно указать команду записи в реестр ХР соответствующего ключа типа Код:
ключ: HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 4. судя по трэйсам, стоп с ошибкой происходит на стадии обращения к системной библиотеке ntdll.dll, которая подключается при запуске, как раз перед первой прорисовкой окна приложения. Официальное описание проблемы http://www.multidmedia.com/support/t...n=detail&id=19 |
Подгрузка внешних .swf
Можно ли использовать {mdm}Script во внешних .swf, подгружаемых в основное приложение?
Да, можно. mdm-классы инициализируются в основном приложении, точнее в мувике основного приложения при компиляции в цинке. К ним можно обращаться из подгружаемых мувиков точно так же как к обычным AS-классам. Пример. Код:
// основной клип main.swf, компилируемый в цинке Код:
// подгружаемый клип loaded.swf. это обычный .swf, скомпилированный Тем не менее, при использовании ActiveX, mdm.FileExplorer и т.п., окна этих элементов все равно будут привязываться к окну основного приложения. ... в загружемом клипе не будет выполняться mdm-скрипт, если он загружен c урл, начинающегося как "http://". т.е. такая схема сработает только при локалной загрузке. оно и хорошо. ... |
Универсальная схема цинк-приложения.
вырисовывается интересная схема построения цинк-приложения:
1. Основной swf, который ЕДИНОЖДЫ компилируется в цинк-IDE - это очень простой универсальный загрузчик, конфигурируемый файлом настроек (что и от куда грузить). 2. Весь основной код, включая mdm-скрипты, хранится во внешних swf-модулях, которые в свою очередь так же могут выступать в роли загрузчиков других модулей. 3. Все вышесказанное в полной мере относится к дочерним формам, которых по-сути нужна всего одна, даже если вам нужно их несколько разновидностей. просто в качестве основного swf для дочерней формы указывается все тот же простой загрузчик. (Конечно, если вы планируете ОДНОВРЕМЕННО показывать несколько дочерних форм, их количество придется увеличить) Одна тонкость. Чтобы дочерняя форма нормально инициализировалась при старте приложения и не мелькала при этом на экране - в IDE при компиляции задать ей отрицательную x- или y-координату и свойство visible=true. Дело в том, что обращаться к функциям дочерней формы из основной формы можно только после первого появления дочерней формы на экране. до этого момента ее "как бы" нет. При задании отрицательных координат при visible=true формально при старте форма будет "показана" (но не буквально), что и устраняет указанное препятствие. Далее, можно оперировать с ее координатами или с ее свойством visible из основной формы, показывая ее когда необходимо, предварительно подгрузив в нее нужный swf. 4. Приложение легко переносится, масштабируется, достраивается, дебажится. Схема опробована на верси цинка 2.5. Обсуждение можно посмотреть здесь. По поводу версии 3 тоже. http://www.flasher.ru/forum/showthread.php?t=111623 |
Zinc и flash cs3 с update 9.0.3 (AIR)
Настройка CS3 под работу с Zinc. Удачный опыт связки.
Для AS 3.0: http://flasher.ru/forum/showthread.php?t=113163 Файл mdm.swc, о котром идет речь поставляется с дистрибутивом Zinc и находится в папке (по умолчанию) "c:\Program Files\MDM\MDM Zinc 3.0\swc\cs3\" для версии 3.0 Настройка CS4 под работу с Zinc. Удачный опыт связки. http://www.flasher.ru/forum/showthread.php?t=121906 AS 2.0: Настройка CS3/4 на работу с Zinc 2.5.0.34. (Собственно, никакой настройки не требуется, главное, чтобы проект был AS 2.0 и версия плеера 8). |
Цитата:
|
Экспорт в Excel из .mdb базы
Основываясь на примере alexcon314 делал себе программу которая выгружает не из фоеша а из базы... Это полезно тем что мы можем не заморачиваясь с кодировкай Юникода выгружат в Excel русские слова... Код:
|
Часовой пояс GMT +4, время: 02:26. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.