|
|
|||||
listener
|
Запрет на запуск второго экземпляра приложения 1
//заставляем окно приложения реагировать // на системные сообщения mdm.Application.doEvents(); mdm.Application.enableExitHandler(); mdm.Application.onAppExit = exit; mdm.Forms.MainForm.title = "form"; hwnd = mdm.System.Registry.load("AppHwnd"); if (hwnd && hwnd != "none") { // шлем WM_SYSCOMMAND с wParam = SC_RESTORE и lParam = 1 mdm.System.sendMessage(hwnd, 0x0112, 0xF120, 1); // ставим фокус mdm.System.setWindowFocus(hwnd); flag = false; exit(); } else { var wList = mdm.System.getWindowList(); var i = 0; while (wList[i][0] != "form") { i++; } mdm.System.Registry.save("AppHwnd", wList[i][1]); flag = true; } function exit() { if (flag) { mdm.System.Registry.save("AppHwnd", "none"); } mdm.Application.exit(); } Конечно, сохранять хэндл необязательно в реестр, просто это в данной ситуации удобно. В случае нештатного завершения работы приложения эта схема не работает. ПОЭТОМУ ДРУГОЙ ПРИМЕР. Запрет на запуск второго экземпляра приложения 2 mdm.Application.doEvents(); formTitle = mdm.Forms.MainForm.title = "form"; appTitle = mdm.Application.title = "app"; var wList = mdm.System.getWindowList(); var appList:Array = new Array(); var i = 0; while (wList[i][1]) { if (wList[i][0] == formTitle || wList[i][0] == appTitle) { appList.push(wList[i][1]); } i++; } hwnd = appList[1]; if (hwnd) { mdm.System.sendMessage(hwnd, 0x0112, 0xF120, 1); mdm.System.setWindowFocus(hwnd); mdm.Application.exit(); } FormTitle и ApplicationTitle можно указать статически в самом компиляторе. Но в этом случае к ним не получишь доступ так просто. И придется писать в условии сравнения титлов сам титл. Не поручусь, что это всегда работает, особенно когда титл русский или необычные символы там есть. Поэтому, лучше назначать их динамически в коде. Последний раз редактировалось alexcon314; 29.11.2007 в 09:20. |
|
|||||
listener
|
Zinc: Access violation at ...
Ошибка при запуске приложения
Иногда при разработке приложения на Zinc возникает такая ситуация, что приложение при запуске выдает ошибку вида и, соответственно, стартовать не хочет. возможны варианты, когда в сообщении об ошибке ntdll.dll не упоминается. Данная проблема может возникнуть при попытке переноса приложение на другой компьютер простым копированием исполняемого файла, а так же при запуске с 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 значение: "D:\\Start.exe"="WIN98" 4. судя по трэйсам, стоп с ошибкой происходит на стадии обращения к системной библиотеке ntdll.dll, которая подключается при запуске, как раз перед первой прорисовкой окна приложения. Официальное описание проблемы http://www.multidmedia.com/support/t...n=detail&id=19 Последний раз редактировалось alexcon314; 20.06.2008 в 14:39. |
|
|||||
listener
|
Подгрузка внешних .swf
Можно ли использовать {mdm}Script во внешних .swf, подгружаемых в основное приложение?
Да, можно. mdm-классы инициализируются в основном приложении, точнее в мувике основного приложения при компиляции в цинке. К ним можно обращаться из подгружаемых мувиков точно так же как к обычным AS-классам. Пример. // основной клип main.swf, компилируемый в цинке this.createEmptyMovieClip('cont',0); var mc:MovieClipLoader= new MovieClipLoader(); mc.loadClip('loaded.swf',cont); // подгружаемый клип loaded.swf. это обычный .swf, скомпилированный // во Flash IDE, без какого-либо участия цинка. mdm.prompt("Swf is loaded and says 'Hello!'"); Тем не менее, при использовании ActiveX, mdm.FileExplorer и т.п., окна этих элементов все равно будут привязываться к окну основного приложения. ... в загружемом клипе не будет выполняться mdm-скрипт, если он загружен c урл, начинающегося как "http://". т.е. такая схема сработает только при локалной загрузке. оно и хорошо. ... Последний раз редактировалось alexcon314; 04.05.2008 в 11:55. |
|
|||||
listener
|
Универсальная схема цинк-приложения.
вырисовывается интересная схема построения цинк-приложения:
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 |
|
|||||
listener
|
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). Последний раз редактировалось alexcon314; 17.09.2009 в 17:29. |
|
|||||
Регистрация: Jan 2006
Сообщений: 72
|
Скорее всего, дело не в цинке. Такая же проблема (без отображения сообщения) появляется и с использованинем стандартного прожектора на 8-м флеше. Решается запуском в режиме совместимости с предыдущими версиями windows.
|
|
|||||
Экспорт в Excel из .mdb базы
Основываясь на примере alexcon314 делал себе программу которая выгружает не из фоеша а из базы... Это полезно тем что мы можем не заморачиваясь с кодировкай Юникода выгружат в Excel русские слова... var telephoneDBUrl:String="\\\\10.23.123.11\Folder\base.mdb"// Адрес нашей базы , расположенной на нашем сервере 10.23.123.11 var SQLString:String="Select * from table1"// SQL запрос // Создаем строковую переменную vbs и вписываем туда команды var vbs=""; vbs+="Option Explicit\r" vbs+="Dim ZAGOLOVOK\r" vbs+="ZAGOLOVOK=\"GENSER | Kotlas\"\r" vbs+="Dim SQLZAPROS\r" vbs+="SQLZAPROS = \""+SQLString+"\"\r" vbs+="Dim MDBADRESS\r" vbs+="MDBADRESS=\""+telephoneDBUrl+"\"\r" vbs+="Dim mcn\r" vbs+="Set mcn = CreateObject(\"ADODB.Connection\")\r" vbs+="mcn.CursorLocation = 3 'adUseClient\r" vbs+="mcn.CommandTimeout = 300\r" vbs+="mcn.ConnectionString = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"&MDBADRESS&\";Persist Security Info=False\"\r" vbs+="mcn.Open\r" vbs+="Dim rs\r" vbs+="Set rs = mcn.Execute(SQLZAPROS)\r" vbs+="Dim ddd\r" vbs+="Dim i\r" vbs+="i=0\r" vbs+="DIM objExcel\r" vbs+="DIM objDoc\r" vbs+="DIM oSheet\r" vbs+=" Set objExcel = CreateObject(\"Excel.Application\")\r" vbs+=" objExcel.Visible = True\r" vbs+=" Set objDoc = objExcel.Workbooks.Add()\r" vbs+=" Set oSheet = objExcel.ActiveSheet\r" vbs+=" \r" vbs+=" objExcel.Caption = ZAGOLOVOK\r" vbs+="Do While Not rs.EOF\r" vbs+=" objDoc.Sheets(1).Range(\"A\" & (i + 1)).Value= rs.fields(\"Dates\")\r" vbs+=" objDoc.Sheets(1).Range(\"B\" & (i + 1)).Value= rs.fields(\"Type\")\r" vbs+=" objDoc.Sheets(1).Range(\"C\" & (i + 1)).Value= rs.fields(\"Manager\")\r" vbs+=" objDoc.Sheets(1).Range(\"D\" & (i + 1)).Value= rs.fields(\"Istok\")\r" vbs+=" objDoc.Sheets(1).Range(\"E\" & (i + 1)).Value= rs.fields(\"Marka\")\r" vbs+=" objDoc.Sheets(1).Range(\"F\" & (i + 1)).Value= rs.fields(\"Model\")\r" vbs+=" objDoc.Sheets(1).Range(\"G\" & (i + 1)).Value= rs.fields(\"Adder\")\r" vbs+="i=i+1\r" vbs+="rs.MoveNext\r" vbs+="Loop\r" vbs+=" objDoc.Sheets(1).Columns(1).ColumnWidth = 20\r"// ширины колонок vbs+=" objDoc.Sheets(1).Columns(2).ColumnWidth = 20\r" vbs+=" objDoc.Sheets(1).Columns(3).ColumnWidth = 20\r" vbs+=" objDoc.Sheets(1).Columns(4).ColumnWidth = 20\r" vbs+=" objDoc.Sheets(1).Columns(5).ColumnWidth = 20\r" vbs+=" objDoc.Sheets(1).Columns(6).ColumnWidth = 20\r" vbs+=" objDoc.Sheets(1).Columns(7).ColumnWidth = 20\r" vbs+=" With oSheet.Range(\"A1\", \"A1111\")\r" vbs+=" .Font.Bold = True\r" //жирность vbs+=" .NumberFormat = \"dd/mm/yyyy\"\r" // формат даты vbs+=" End With\r" vbs+="mcn.Close\r" vbs+="Set mcn = Nothing\r" mdm.FileSystem.saveFileUnicode(mdm.System.Paths.appData + "toExcel.vbs", vbs);// сохраняем файл mdm.System.exec(mdm.System.Paths.appData + "toExcel.vbs");// запускаем файл
__________________
------------------------------- FLASH FLASH FLASH FLASH FLASH Последний раз редактировалось Azo; 13.01.2011 в 14:21. |
Часовой пояс GMT +4, время: 07:13. |
|
« Предыдущая тема | Следующая тема » |
|
|