Вверх ↑
Этот топик читают: Гость
Ответов: 23
Рейтинг: 0
#1471: 2017-04-03 21:28:59 ЛС | профиль | цитата
Да я представляю что есть объекты которые не представить строкой, ну чтож пусть они будут, ведь в этом случае прослеживается пользователем будет прослеживаться логика - один компонент создает объект, другой использует, тут незачем придумывать интерфейсы - они уже придуманы, стримы, канвы присутствуют во многих прикладных языках, наверно потому что они связаны не с алгоритмами а с платформами. Стримы это получается унифицированный интерфейс обмена данными с устройствами памяти, канвы и всякие битмапы - логический интерфейс работы с двумерной графикой, типа как работа с openGL что в си, что в питоне, что в яве, паскале и т.д. будет похожа, свои обертки будут, но методы и терминология и принципы использования не изменяться. В случае же с hFile и hFileReadWrite фактически только эти компоненты и используют свои спец типы, т.е. точку File фактически может использовать только hFile, Environment вполне может обойтись строкой, причем его точки могут быть использованы и вообще без применения hFile в программе (например показать пути пользователю, записать их куда-то через hFileReadWrite или в какую-то БД и т.п.), т.е. он логически независим от hFile, а вы их связали, и пришлось изменять StrCat, а он вроде и не причем тут. Вот выведена точка RandomFileAccess и где я смогу ее еще использовать? Вот например передал бы я ее компоненту битмап чтобы он сохранил туда картинку, но нет тут правильней и логичней передать стрим... Чтобы создать папку (повседневное можно сказать действие куда без него в большинстве программ) - нужно на скрытую точку завести путь, потом вызвать doOpen, а только потом doMakeDir, теперь этот экземпляр будет хранить в mfile файловую переменную с путем к созданной папке и где мы его сможем использовать? - только для удаления папки, а это может понадобиться очень не скоро, сразу только если пользователь ошибся, а скорее всего через часы и дни, а для того чтобы воспользоваться этим же компонентом для создания файла нужно снова заводить путь+файл и doOpen и DoCreateFile, либо использовать еще один hFile, т.е. новый экземпляр.... Так это все равно что выполнить по точке doMakeDir создание экземпляра File и создать папку по нему, вы тут не добиваетесь никакого ускорения. На экземплярах имеет смысл экономить когда они большие, когда при создании копируются большие области данных уникальные для каждого экземпляра класса.
А что до слабых устройств - то концепция ведь в том что языки становятся проще и мееедленнее, а количество ядер и памяти растет, народ покупает новые более мощные игрушки и вроде все довольны, сейчас главное скорость разработки и низкий порог вхождения.
Вот Dilma уже ответил как знаток концепции объектно-ориентированного программирования, жаль что я не очень понимаю что он имел ввиду, хоть и прочитал уже его сообщение пять раз... ))
карма: 0

0
Администрация
Ответов: 15294
Рейтинг: 1518
#1472: 2017-04-03 22:10:08 ЛС | профиль | цитата
Alex35567 писал(а):
то концепция ведь в том что языки становятся проще и мееедленнее

Языки проще и медленнее не становятся

Alex35567 писал(а):
сейчас главное скорость разработки и низкий порог вхождения.

Не везде. Для простого человека - да (мы именно эту задачу тут и решаем разработкой сред графического программирования), а для более серьезных задач - нет. Все как всегда зависит от потребностей - если вам надо собрать простое приложение для мобильного телефона, то конечно же нет никакого резона учить Java и осваивать особенности программирования на нем под Android.

Alex35567 писал(а):
жаль что я не очень понимаю что он имел ввиду, хоть и прочитал уже его сообщение пять раз...

Это было написано больше для разработчиков. А речь там все о том же: много типов - плохо. Но и один тоже не хорошо. Лучшая стратегия это не избавление от типов, а организация их совместимости в разумных пределах.
карма: 26
0
Ответов: 1821
Рейтинг: 168
#1473: 2017-04-03 22:22:38 ЛС | профиль | цитата
Dilma писал(а):
все же лучше писать классы обертки

Говоря об слиянии Canvas/Bitmap или IOStreams, я имел ввиду как раз классы-обёртки, в которых, по сути, будет заложена логика (пример такой логики я описал выше для Canvas/Bitmap).
А что можете сказать о слиянии Streams? У нас в пакете живут как I/O streams, так и byte array, которые фактически являются результатами выполнения неких операций над стримами. Есть ли вообще смысл делать слияние для них?
карма: 5

0
Ответов: 4621
Рейтинг: 746
#1474: 2017-04-04 11:54:59 ЛС | профиль | цитата
Dilma писал(а):
отправлять "наверх" информацию о том, какой именно интерфейс требуется от точки
Я тоже думал об этом. Смысл такой: у нас реализован механизм передачи любого типа между компонентами так, что верхняя точка может узнать тип поданных на неё данных при компиляции. И если она может принимать несколько типов данных, то для каждого может сгенерировать специфичный код. Нижняя же точка может выдавать несколько различных типов данных, и для того, чтобы узнать, какой тип она должна выдать, может и пригодиться, чтобы верхняя точка послала "вверх" перечень принимаемых типов, а нижняя точка приняля решение какой тип выдать. Но я так и не додумал этого. Просто в некоторых компонентах автор схемы сам с помощью свойства указывает какой тип ему нужен на выходе.

sаmakacd писал(а):
У нас в пакете живут как I/O streams
По поводу Stream. Вообще, хоть этот тип и очень распространен в коде, но чисто практически для автора схемы он может использоваться разве что для работы с файлами. А вот использовать в схеме механизм стрима для работы, например, с сетевым сокетом - вообще нет необходимости: в этом и даже в стандартном пакетах TCP клиент/сервер полностью скрывают его от автора схемы, тогда как в коде именно стримы и используются.

Массив байтов удобно использовать как универсальный тип для передачи любых данных между компонентами (как в стандартном пакете часто используется MemoryStream). Достаточно в каждом компоненте, где необходимо, реализовать его обработку. Та же передача RAW-данных через TCP.
Хотя при наличии достаточного инструментария в компонентах (работы с форматами файлов, сетевыми протоколами) его использование и ограничивается реализацией работы с пользовательскими типами файлов или протоколами.

В общем, при достаточно активном развитии пакета, система типов будет упрощаться самостоятельно: более нужные/незаменимые типы будут оставаться, остальные будут отбрасываться. Даже просто по мере "укрупнения" компонентов, когда реализация компонента будет подниматься с более примитивного уровня до более обобщенного.

Alex35567 писал(а):
точку File фактически может использовать только hFile
Я согласен, что можно отдать приоритет строковым путям перед объектом File. Тогда в соответствующую точку можно добавить определение поданого типа, и в случае строки самостоятельно создавать/освобождать File.

Редактировалось 2 раз(а), последний 2017-04-05 10:39:25
карма: 26

0
Ответов: 1821
Рейтинг: 168
#1475: 2017-04-04 12:13:46 ЛС | профиль | цитата
Стримы, как я вижу, пока могут использоваться в тех случаях, когда нужно специфическое управление принимаемыми данными (например, указывать позицию считывания). Но использование такой возможности я пока вижу только при работе с файлами. Есть сомнения, что при работе с сокетами есть смысл тягать наружу эти стримы.

Таки да, есть смысл оставить только массив байтов

Редактировалось 2 раз(а), последний 2017-04-04 12:15:35
карма: 5

0
Администрация
Ответов: 15294
Рейтинг: 1518
#1476: 2017-04-04 18:47:36 ЛС | профиль | цитата
Чтобы вам самим понятнее стало, составьте такой граф:



Ноды это типы(точки) или источники(элементы) данных, стрелками показано, что во что может быть так или иначе преобразовано. Когда есть такой граф очень хорошо видно, чего не хватает или наоборот - что лишнее. Так на картинке выше необходимость типа Blob под сомнением, т.к. он ни где не используется напрямую. Или отсутствие стрелок к блоку "Файлы" сразу показывает, что отсутствует возможность записывать данные в файл.
карма: 26
0
Разработчик
Ответов: 4697
Рейтинг: 426
#1477: 2017-04-05 02:37:59 ЛС | профиль | цитата
Dilma писал(а):
отправлять "наверх" информацию о том, какой именно интерфейс требуется от точки

А может лучше для упрощения реализации подсказок среды о несовместимости типов и улучшения видимости использовать специальные вертикальные компоненты-адаптеры? Суть адаптеров простая: сверху у точки один тип, снизу - другой. И код преобразования интерфейсов выносится именно в адаптер. Можно даже внешне на схеме их по-другому рисовать. Итого и наглядно, и просто.

Редактировалось 2 раз(а), последний 2017-04-05 02:38:39
карма: 10
0
Ответов: 4621
Рейтинг: 746
#1478: 2017-04-05 10:44:53 ЛС | профиль | цитата
Dilma писал(а):
составьте такой граф
Выглядит довольно понятно. Просто, по-моему, ещё недостаточно компонентов, чтобы было возможно рисовать такую диаграмму (по мере добавления компонентов+типов граф постоянно приходилось бы корректировать). Если будет большое количество готовых компонентов, можно будет приступить к такой оптимизации.
Assasin писал(а):
использовать специальные вертикальные компоненты-адаптеры
Оно-то, возможно, наглядно, но насколько это увеличит трудоемкость составления схемы (при ручной расстановке). В стандартном пакете об этом как-то и не задумываемся (вероятно, из-за небольшого количества типов и автоматической конвертации). С помощью FTCG мы выводим сообщения о неправильных типах в "Отладку". Было бы, конечно, удобнее, если бы по команде из кодогенератора можно было подсвечивать некорректные связи и компоненты, возможно даже с всплывающими подсказками возле них.

Редактировалось 2 раз(а), последний 2017-04-05 10:49:22
карма: 26

0
Администрация
Ответов: 15294
Рейтинг: 1518
#1479: 2017-04-05 13:16:57 ЛС | профиль | цитата
Assasin писал(а):
улучшения видимости использовать специальные вертикальные компоненты-адаптеры?

Такие преобразования если они возможны и корректны должны делаться без участия пользователя и дополнительных элементов, так же как на преобразования Number - String чаще всего никакой обвязки доп элементами не требуется.

Netspirit писал(а):
Если будет большое количество готовых компонентов, можно будет приступить к такой оптимизации.

Только фишка в том, что нужно сначала составлять граф(продумывать архитектуру), а потом делать элементы, а не наоборот - это лишняя работа.

Netspirit писал(а):
Было бы, конечно, удобнее, если бы по команде из кодогенератора можно было подсвечивать некорректные связи и компоненты, возможно даже с всплывающими подсказками возле них.

Это не командами кодогенератора должно быть сделано, а разбором ошибок от него самой средой, чтобы пользователь тыкал по ошибкам, а в схеме ему сразу подсвечивался элемент, связь, точка, свойство или что-то еще.

Редактировалось 1 раз(а), последний 2017-04-05 13:18:17
карма: 26
0
Ответов: 4621
Рейтинг: 746
#1480: 2017-04-05 14:09:23 ЛС | профиль | цитата
Dilma писал(а):
сначала составлять граф(продумывать архитектуру)
Это да, но проблема в том, что я абсолютно не знаю Android. Тогда я последовательно читаю документацию, и то, что понял - реализую. При этом, не имея полной картины, понимания всей будущей структуры пакета.
карма: 26

0
Ответов: 23
Рейтинг: 0
#1481: 2017-04-07 18:29:24 ЛС | профиль | цитата
Попробовал Genymotion и Memu, последний больше понравился версия 4.2.2 работает быстрее bluestack и бесплатный, без всякого шантажа. Немного доработал launcher под него, сильно не старался с красотой - как говорится лишь бы работало (там проблема в том что нельзя останавливать adb запущенный при старте эмулятора, иначе потом не дает установить приложение - пишет device offline). А можно ли как то залить сюда его exe-ник? Или только ссылкой со стороннего ресурса?
Вот текст измененного launchera (использован компонент EnvVars из альтернативной сборки, хотя наверно можно без него, после долгих танцев с бубном подумал что надежней использовать adb из папки эмулятора), вдруг кому пригодиться.
emulauncher.sha:
Add(MainForm,2953706,56,196)
{
Width=471
Height=391
Caption="Запуск в эмуляторе"
BorderStyle=1
Icon=[ZIPEE3A000078DACD7A07585447F73EA889B1C5868820BD2DBBECB28DBEC082F40ED20595A2540DBD2A4B071594AA486F8228A2B1C45EB1C4A8D1186BF4B3448D8951A3B11BEE9CDFCC65313EF98CF1FBC7983FCFF33EB3DCBD77EF7B66CE397366DE91919195192AC3E5CAE0564D66B5B68C8C918C8C8C9A9AF4FF71323257F0B571E306FE8F1A262353846F60E07BF02332B36506AE93BF1C6D997FE44F23C24B5623DC93C65FDDAB1DE6294B20F3FFC99FB2AFDDF0511A4A5346B1D40D46315418A335A78E52F2B21EFAC7FB949C45C346A9298E1DADA1A4395A5D4945CE843D423372FA907F8BB76EF24CD9495CDDF17236C27C7E5AD8F969C5094F1C8B13EFB3425C7B47284FB6560FF518FA1AF791E38D58D1C28C883EEFDA9C9F7C57E4DC644778778E549D22C6360CFD37F8AB043A0E5571B1F4D72D8D7FCCA94EEB37A84C41C2F26464901BF5728ABFEDDE0942E6A7E43EF519CE43941DCCC43A59613F0BCA12FBCDAAD391E5F24C4AB838FEA54A8447DF4413F6F87F83BF5EA0CB4851C6DC46CDE56948A72615E955A502B32C0134B3239052B83B3541A8A7AF16EC2CAB2D36FED8C4DB699162422052974420BD9279C05A341FB4F3A3905A723092B73536510F75FFE0F1A017E432DA3C2BB2530BF3D7AD4E43CC8A64602E9E0F1A69334131C4094D36E70A74C3BD64B91E76C3CDFCDC2AE4E77A2095E410A49B1309CC8218D096CC41EAF18148C1D154AC15E6F1C1F9B3825CC698A7CFE9D2AC4A413AE5494817F7A9CEC2085089F402796F314CB6E0099931FEB2C240B711A6BEAE2BC77A59A129A1AE48333E0874526781465230528D9E8E141C4CC5BA73A77F78FE21EE63CC92C2BAD54BE7238DC218A4913E1BD4A27D40D1CF0EE45CCC608AB5D0503F31648851A8CF48531F97BA31F646480EDBA01CE20C6AE11EA01CE181A6CE72A1FB9F11EBFFC1F9736383C659A4446C54480C420A733C91829F2D4C76B782494E6630D1CE08C98B0581932DF84693B5D5455C77BB75A3ADF9688283099AEC61098A5ED6A0E025460ADED684BF352371C607E5CF480B95E546074E309F13B069ACAF0D92F3B3456A611EC09A170846E91160B1301AD948622F3B14C45F702D4EBAE85D9671DF65710A722C4E42D6B97160941A0A5AE19E48C9CF0E8D61AABB8FE3E97EA21D1FF4416CD09C3B7DC8441E436E928019C78C0DB8C2CE9E0BB64BD3C0BB360FBCEBF2C1AD36079C6A25E0B4320739D7E7526E0D7994676301F2692A8480E622086A2A86C0C62298BE2207D92F4D43828CF0AB2ADE36F563D95A020567D127FF34FFF1DAAA93349D2CF2B51684FD82F32032ABC904B395D960549F0D860D1210346683A04902C2E61C306CCE05E3963C30C1AD594B2E88702BC2F758D46583797506982E4D0661611CC55E10F19BCA2CD743A355A7D86BC6F8FE6373329E738730ED4569C2B2A4C7BA2BD229565336E8B7E501BBA3000C561582416721706914016F10F83A0D7C0FBF3D1F78F87E1EB6C5A051029CBA2C60E17983B1F833A49119DA3F35DCFDFC58AE8EE2FBE0AAE86D43EA9591A335A67E3A464B79B86E52C810791BC38FBDAB2487780DD914B3594273E760BE065D45C0ED2AC628A2C1C39F09F8F8338D4E8242E0133B880D843F1E234EC34260AFC80056450AE82DFE8CD24A99492978587969E378D6C039491DD7476AE19E43D4FE87F94137234C56DE983D613C9F91A61DE4BC9335CBE32B5507B3F6317AEAC69F6A2ACB0775945DE735E550ACB6DC817EC7FC0C5663EEDD25347852F00781BF1310744AEDC0CF9031E062FF32C0BEC6A9CD04361E03565902D2CE0A43F2CEE6890AEE56C3874F9EC09CC4D4F45160EB848C519D62896363B446B4EF5FDAA111E6F191A68775984E51EC237D5CAF3017CDA358D973287917F3EDF2E3C79BB83416DEE634662316E97BE23383DCD72C029E14FCD720C0DFD1181C0FE918705BA563B0320BD8D5E9C02A25FCC3D1589E6EC60805393E7B5ED0618FBADC9F3C1AF2EE1B4AA22E8FD1D78C54F4B219F557FC39B1819F9AE5C5F568B5642346D342A4877D54B732999A9A18745755432D5C589DF113B361211AF41D9AFB5ACC7BED621A7C29048320360CDAB1BA841E03120FAFF8D72D18E0BF241E692F8C4072C6FA054A1EE2D5AC860508C71245A0DF2CF94D3D75E6771A9F05F075B2C2DF3A06BCD4B0F116A5C95B745A2508FB3862D62F005C9B512A4933EE2B6BA947F2AAD27F623662FEED79037E8FB9737B30F79E2534F8520868BC6EC3C0380C8E01B72D1F0CB00F71EA1702A706F3C731AC953D074DB1362A550B71DD4FDECDED2E46BCEE6260B7E5525A9239B7C69B1B58E11AE5ADFC850B22E52C2B3376E8B6E520566B2ED2C73ECAAC49A3549283EF296BAACDA1F9376523DAF7B1EFF008F77598736FE92B085E83107F2724B648EDE00F8E017E9E1E83061C03CB3306FA1FF357B236AA540D76D9C7C2FC796B4A10F1414E473EA59D1BF9D308B529F67FE53F4605F32659D52CD8CD68CBC53E8EF93711FEE9A4FFEFA86AAA87F3AB33EE339B2488BD0AF327B18AF9F108EFF56534048320DC0741DB201D0B694CF33A880FE50DF05F9139E0FFB8269D6C29289FEA67BF5BBF25877047023CBE061D05944E7E14E6AFE8F857FC4DCA92275BD566EF67B4E7611FC947D8F780B52283E6AFAEAD1921A8C97CC8C2BFCD26BE4FFC5ECA5DF0F952106C1880F075E0EF6848EDA0C780D82D8D633A06700ED227F927672E52B01296AB06380EF05FBB18111F345885F917C4DC1BA9AEE4F136EEFCFA6C59B3CA8C29E286DC3EBD55F9A08FC798DD9203ACDA4CE23F773474B5227852FE1CE2FBF8B7E97E27BC3F5F4643B811E37329F075431AAFF127F14DF89379A25D1A03B559987F22D2C989448AD646D5EA81CEBBC93B30779A3F8961DDA2D87B2335DECE5FD094236B5693A564D5987B08F3C73E52086CECA3AC9599946A72F08F1ADA9AA1DC9A8C87242E3852DFA1B913CE1BCB41B8690086041BA5C076D0908E011DD7741C140FE421320F901CBA3409E9E44611FE756A018EBBF4F13B04EB9620F20C9E1329DD92790F466A4EF57B2BFF965C59F3BA6C15ABD6822FF5BA0A681FE1E03CC3AACBA2949366DCD2663343792BB29EB2B05F19905CBF1EFB0EF11BC27BF320F70A30DC5C316003695FD9F1FB38903E7DC59FCCC5380711FEBA7951485EC4AB55F29EB685F0C7F722E27BDCD5C594EEA2790F31FFC0B7F26FCBC7FC252A96983F737511ED2338F641BF7E01F1FF5B7A0283307EED82E7D8AF9001F103CC4740FA1DF3146EA904C3D7603408FC9D11B1098F91A1341E0464DCBA17D1F5111DC33847B3972563FED1387EF9B52AD36D37E3F985704742FC0E9C47294669FCA3915ACA216FCD9DED05B2A2A65C0DCB8EE2E3CCEE228AE4171C3BA0DFB010F30FBEC5147243F92B173EC7E382B88403F1F941EE5F1054D1307A1DAF6C28A76DA0639A8C018E7D3EA999E81C84E780F264C4288826F1DBA4EA6BBF85E40EE1E74B1119379247F5CAE29F8CD2560E7F1B7FC3D525B2A2D6024D8B8EA213AC352514F1115253D2FC1382BED7356005F3EAB39F73F0BCC225BE43F8607EC2AD98F7D66A301AC4B66A3026D84A5005C6C48E411B5EF197FA10896192432B5210A33016E1355BCB544F9BF5EC8E7C84ED45C4F7F0BC8EF4962662FE2A6FE56FDABB54D6725589B64567F149FDB5983FC95DD887D84DD9944A62D07596997036AF31A79F83FB83477C87F43DE1BE6D80B3D1F61A1AC604B40DD2762B198B8171207C884F0CF810CE01ED781EC3B5B441652AD22B8AC5FECF6D9EEA215E8BE71784638880CC9188599EF47C34432DE66DFC2D3656C95A779732445D8B4EEBF72CA2487EC4B183F94B30FF19D73862B3501C238883E38A4FE215F7AFE18EE560B46B050DE35DB560B25B0AF2995CDB8981EF213691B1A1E3037322731C9FCCDD9D0331CC257B30C571689225BF45C5CB662DF1511CFF04C0C779885991FC62949EDABCB7F1B7DC5443F337EF2A39ADBF6E31C5ED5D82EBCA1260374B28E584C0FFE88B4D8285AB4B1017F70B1FF7AB70E77230DCB3128CF6D581495F03981D6E06D19116B03CDA0A5647DB06F0652B581E6E018B834D60BEAF9EB6898C15C9B7A4D620EB04031203CBD3915EC97C2467C9EBC4EBFB4E0ECE1F865B2A08C87D885999F262144BE3ADFCC55B56C88A7BCB75CC36969FE2EEACEE37DCB59C8E4183EEE27ED5ACD08B3A3626DED6875BFB6D2EAC43D32EAC07DBB3EBC0F64417D81F6E07879D8D60BF6905D8F554C0B4AE5210B7168355633E9837E48071DD423024C07E2EC0BE22C07CE9B518A98348FD8D5B36AEC91955296892AD518B928F6D33676D09C27E89C898E13906E11AECC528B666DC5FD50F163D6513DC8F77AFF3B97B909A75F730E57D630765F5F52A4AA72C7E877642B066E4A59D17FD36ACA0D87141A0EE260605731EE0F50E4CC29037E1C064110FA6580A608AB52128D91801AEC740117F56B412C214D1C0BD72023D98C8D181896C2D90E33240C1940BBAD31D103F2608A9CC708AD52B88293239D24C395EE8A5ECBE5D8BCC0E35F6EB77163C19CDD599F557FC6D7636C8FAEC5E2D1F7FE64443DE933B47A31F9F3B1670B27795F9AA62153557F1188D19CE554695E9BF9AB61721A3DE3230C5FE60DED704A2AFDAC0E27807589C5805965F7762E0967C3EBE0A2C8E758008FB12F12DF3838D6046FC88C403C9BFB88EC6351518E6C622EDD9EEDFC999B045864B9234227F3EF1656EFF9DC711FD172987FB7B1FF27754D70B3A8A26BFCB1AD2667B9DAC5DEBB291EE5BDBD43C77B5ABBB76978F16F52E93E5C6CD5071DAD7F8AB615F03323ADC04265FB68029F675330C73CC9FB601C392E0681B1D07164730B0FF8BB0FF9BED6F00D3BD75749C933C25C4BE49E66F5207E23A17E92E4D40E36D848BD5E74CFFD8715D8D66C8CE75819F5D3C96E4B0ADD1DBB0B364E2FFBA86B7E858246BB9A66C88D5FA0A7ACDA0ED6933D6E670CBF72627DA9129EE5FF3939D203AD50596185618E26F5683CD37DD300DB7D34E619CEC021B3C16D6780CACBE6A074B6C8BA88FD8518F6D580186DBABE9DA89AC21709D8534CBE2917A527032BF5E3284BB3CEBBDEF671957660C151F6A3E60737E1D657E762D589C5B0B96E77A407CB6076CF0FFB6E7D681FDF95E703CBF1E03B7F87F87333D607F7A0DD8625B881D96381F99E3B120E36082732B5D27915CBAAA1069972761FE216E82C69C7F6C2F8ED7949DE9776BE74BEB6B9B91D5D58DE0707923445FDA09AE173F07C72B9BC1EDFBADE0F9FD36F0BC8E716D2B78906B97378133CE57C4161B6C87C5B1769CB3DA20706F3BC9EDB40DC2EE4594F6B284DBBA092172FF1477C7831DB2E66B4ACD67FE7CE09AEFFD0394F5ED6D90F5E35770E7F9635873FF3BF0FA6117F8DCD90B7E3FEF8300823BFBC0EFF61EF0B9B983B6C515DBE170AE172CB0DF6DF8F102DCFAF51770D9B41C0CBEA820FB0094466174BBA86BC93FBA0F3A6D4FE308F7533D8B93A88BC8F3C91194F2F8145CE97F04875FFC0CB31F1D859067C760D6F313104AF0F438CC7E8CAF3D388CEDD90FD3B17DAE57B780D3850D70E5E92F70EDE90370FA72157077D450FAED79FF51F4B333F9107BB8EC943095F46757BE8FA02EF487F57F0B29BF9D83C4976760F66FA72094FA1622D13988A6711622FB4F43F8CB931082EDF0BFDF071ED806FBAB9B21E4D236F03FB7090C8F3421DEAEE5145EE7E58ABA978CF810FC03BED924EB7EBCD759F2F8872B31E81A958C6EA079700532E00624C3F79008D72081C655980797200ACE4368FF29087AFA1578DEDB0F4E3FEC009BAB9BC002CFE3C65FB5927ABC4777AEEFC71F52039871FA8B4F669EDAED97FFDB834719E82E4A473F61FE77A00E5E603C850AF895462ADC8448F80E66A16F21E0E571707FD8070E777681F8FA1624FAAE97C2EBE50D860D12AD695B6A3EB806137171AFACEF17ABA7CD39DD7721A1FF2E25810754363C4495F01CB5C36FA813FA2117EEC14CB884FCE05BE4D17F82727C7A18393CC0B17F7513C5ABCD5C675A9335D2714FD3BFA2C7879DDF3B44DDCBCE9053B7E0B4DFE99D078A9FDCBF50801E537940F008E5C1AF281C6E51EE7011B9C159E489CE50812F4E3D0DB9B967B3DDD75D27B432427732E282C6D9ED69FCE0FCFD8F6F965577B119AF5796B0D578F78A938E1BEAC787EDDE384A72F3B2EBC2AF8F15E4DDBAB6B9E4D1BDFDC54FEE1DCC7970734FFAF56F9B93EF9E9F3F77FF7A4D8FDDADC39C562D13D97EB3E68A9C8B682133277ACC87E62FAE2B19AA3ADB3DC4E460C30DE783AB7DA22F1D958DBB725C76DE8D5343620F6D1F9A74E5E4A759F7AE28481E5C57CCF8E9825CD4C583C367DD3A32C4F7BB9DB21EA737CA3A1F5FFB89E7E5AD99DCAEC2CBF22E22CB0FCDDF6DFB2AD9E06F76FB5B6F6F8C75DFD2F6D19BEE49F9F5AA6CF2A32B43E21F5E7AA37F9864277E1478E560994EDC0CE37FC3FFFDB7AD1D1AB077C3B0BFD50FBB577F2C5E5FFDFFECFF00CB1E019076E83EBAED97CD910CB43203AD8C8CD5BBB4CF65645449FB404666ACB41D4EDA6B036D3F7999958CCC03D28EFD433BFC0FEDD8FF6EAFBDE7F68FBFFF9CB4AA3232889CAB92F21EFA063B5ED9F7FCF75655DA0F748BA4FD81FEACBF2C2D07BE970069C9392D723A4BFCFA39AD717FCFAF54839D87A904398E500D70F82FDF52F3B51BA6E6EFF0B1C62CB77F24674EB133515571B52CE5CC74DFAEE9285A2267C153A175B1101759792B8140CFDFB1C664AE5FB78A93286CAAAFED7BAD5734433D86EAC6FAD731AB52FAC97E16BB30B65FCEC164A532B659C3D56A8256ACDF318325F19471452A62E5463D917730F57DAFE70A667B7E2228883BA0539346F69B403B3B02C9BB8A0E6804398FE0DB5BA969C4FADDD3C80C45CCC218D05A188E94A6DB64BFD7333DA19E23F839D187B49725229DBC28508D9E0E136D84077523BC4798F8B86829FADA3E540C75435AF141A036DF1F297A8973DE6B5D1B1738929B167654292108298638C364774B986061704C75FA3416C3D2D846C159F448CE5584947CA6C1143F5BA4E06AF15EDFAFE96D27CF0CF33EAD3AC70B19A6868338771ED815253C735E9272D37359E66DEFCA0594E7B20CE450940082A49948D9DDAA534EC455D188FAFBE7F8E40DF5D5D443DDB7718AE27EB3AC590016751230ADCF06930609326DCA41A2E65C246ECE039BA65C9886BF13576520E3A2F92F75E6F95F1A67A0E38E39FC4FF1A812E4248BE378A826394F393F7088C9FC905E063993D09203B4B646F6D6A578FD1C02BDEF4574BFC66CD05F9E018C9279486D7EC05D0517D13B9F3B500974FC44CE94336BAAD8B074228F113C41C094F3685B745BAF59AAEB913D35297852F0073578C2A32DFF9576AD5F9E0CBAB991D4146F6B2739B16092A2955034C984C3550E72FCD3F500C3DFD14FB73CE9058E314A3B2BECD9641DF5B9A2FA9C5F685D6B5093FE83963EA03F0F68E8B4F6D9920B9CFA05A05F9142BF7F0C432D422BD2679B7D73FE43E365C977268A05B17FF67EF3855179BA2D12C46C58083AA5F148D98CB794B33CE301D15C68DB892E48349A575AF2A08E3CA05DD2FA716BDEC0F989CA54D0C1EF57B41416EB5624F7F3BA8B11A73D8F52FB2C708FFA9F9C65B12C495CCCA0B55509E82E4D44CAA6BC52CEF2CC874433E10EEA627FD08269EDAE47AA017749F7FD1B25C0AE4EC3F64721DCEF65BA952914D14C0D561522D538BF238A3EB66FAC4DAC96A52FD323FA28F635DD654948C58CBFC8A036EB09D10CB8E41C007937D9A3A7F5D0B2DF35D075A5BFEB8744BF6EC6BE5A930EBAF9D1688A057F0903BF9F6886DCAE22E293C714031CDE58D789972FA862AECA0736EE434645325233172CE290F77716A2579AE0A09629D53307B527D20FC41F68ED09FB009BC440410CC2BE5CCEA84AED279A1FF657A49E10F4B562B0D31B7DD0BA3EB796D95980C7291F1895C994BA85B010AF619E73F0733CA26F9177BEAE456EFA5DC3A3F52FE21B52ED8868D78CC218A460CA5DC6A84A7949343BA217A927057F8BDFFFC6F358E2C6BC7A16D1E770ACE955A5505AD3CC0A0D1AB25F1AE0B1A3F5C43FE871831A96A154FF11E0712063C0C5FC89F6AC571447BF5FAF3AF585704319E2AD5D843452679E570A711EF9C6F7B716B4E8638E44DBC1CF509AD626B9DCA69C975CDC77B49649B4B4579A54D500A41A14ADDF903E2063407C60E50260E21CA4606250A55793F68C684E44EFD04C9FFD9DD24C97D16FF4BFF6A20E76CF22CAA0BB18F033948EA3651EB72D9FE2AE2F430262F3F6012D89D65DA4DACB80FE423854627F584AEBC0241F12ED949C43C3F9BB82B93CFD89E1E67244F40ACDCCD0AB2A115E9FBE31FE3A8A3BD9445FC136E82DC7EF77B65A48E286FF4525229A8AD19E9560B2BF1ECC0E3681E85033586088FA1AC11C5F33257BC7B85F486C90734A240F92B3177246FA55CCDACC4778BC108E19A4B520FC9A5A8CDFD837EB3C954DA6479A298BBE263C0685FDEABE7651AEA7D7BDB03EDA8ECC375781496B011895A783B0F033E02D8C0283F408D04F9D0D7AC9B38091361B1899E124E781DEA2F9C05C9644CE2D23791BC3029CBF7E31DDB31209B75621ADBCC8AB1A71016FB4DF6D57AB41FC8F670FCD7B7CFEB2635F6B272369D614CBC5C9BB8D0AE623A62412F497C48301F66B3E39C387C7D810C79A1186617B01081AB2C1A02A15F40BE38091320B58D101C099ED755F35C8C9D4E378CF86794F2EBC70BABDEB19A7AB68B94165FA9F9E4DB7EBAE1AE5B4B95EC1B6A7FC63BE247ABC4D5FD363A323CDC8F4AB36303FD60E220CCBE31D6075AC6360EFFB681BBD8F6F7EA0114C88E685FD81F82AC9D7E47C93C2F46933CC5B8BC7796F69B771F87CA58551D7A277AE4D8D96A60C131F6BBF64FE6D37129D59035618D618B6E77AC0E1ECC01EB6DDE93530EDEB2E101F6DA7F7AF4D76AFA46393E40206F6619C83CDFE4EFD61BE61698DDB0F3B90F8DA26C8FDFE30045ED9066E37B681D7CD1DE07D633B785EFD02DC2E6DA4F9589D5805D1273782FB9695243F22FCFE9BBCD2A4BF558BDBF5B50AA29E9E7CE0F6E0003AFDF217E87E7215FC7E3D4CEF5BCE7A7414827F3904FE3FEDA5F7C6C91EFFF5670F21E7EC6EE06EA940EA69B3247F7B3FE050E730BF036B0AA3A84BBFC5F75F44F3FBCF43047516A2D10588C588A2CEC0ECE727C0EF7E1F38DDD80ABE97BE00D1F10EC46C911C356D2F927F1FF567E0A9CD9FC6DF3CDB918EEEF427A35B500A0F317E8162B80BF17015C2D019F07B7A149C7EDE0D56573722E3BE860B868DB9ECF7BAAFF9D5A64F3CD737AF4D7C76FB91043DA496C133540F2F503CFC807CE02C72EB3F41B93C3CF85874A4E5277EC9673C875D0DEF751DA81F13CCE2AE2E3AEEBFAFD72AF3DA85B49CEF2F7F51F0E4EE9994E7B7CFC5DCBF7028E6DEB7158187D788ED77D497A8C6F82E316ACE7F6FFBBE0E3DB543848D79D5E26D75B362BE3B2A3BEFDAD7B2F3CF1C1E9676EFF2D8CC0757C6C7DD38313CE4FA41DA5EA7235D72969B977FA11EEBFF7EFB7FFFE6C9017BD77FF48E7B3772A2554B86BFD33ECD8D2300FB8702E4FC113264DB46F200836C514831F45D41B637900CBDD5436FF7D0C89105D82745CE7880932F80EC538C93EE550CEE5388DF71E74AD5DF5E5FD3CFDE47C5DF61B8AA9FFD1846908BB75AA0A3D2BB3CAB33D76728AB28EE1C13CFD14A9ED6413A412E99FAC571486DAED7E7EFB4268EF11FA6973DF786CA1C2F5072B34CD076155729053B21A500FBBDEFF2BC9A9FBD889D11FEABF99224B2667BEA589BFDDCA12A0BF153436F2B798ABDDFB80E8DF61DA2E46C215272B35236AA48BB49CE6A0E9EABA6CF5E92BAAB6E01E8E645BD50F4B25699EA6EA5A4F9DAD9624E6AA81159CBA90539EDE036663F2375CEE0D95AFAFC23FE0D5237903E510E70586DDC9CF304DBE7F26A3E2A4BB667B6E6208D08EF839C46C98BC1737E82C1FA97D47EB8F664E2BA433DCAE720A97795C3DC235F9DE3A997B8E8E35A1EAF870E705A725F925A9E3E5FB7515A3F92DA09DBC42A4B24CF1F22E7149523BD5F9D8D306B2BF060E31A5E27D67F9F4147413F99675F9DAB22B529FE3D62035EFB21F5C8E90705EB4B914A8C6FE22BDD7B4DE9740EAE41753F9BB187D7B30419EEA8A1E76CB3BD7560BABB96FE1D3E5E63B1ABD290EA5CEF3E3287A927CC487BA5116E5B29F0BDB8E336B72C7191784DD95D7E6D1608AAD241509E0AF81AE897CC07BDDC28606584BFD4CF8B5DE17466C36F7A8B3F0B7D7D0C6D7BAB3F31AFCF1D6EF155DB23D1C94E109FEAA23575A24193F30EE40C0C1BAF7759F9714CABF65235B39E656F5CABB99FE9ED4DFFF9188ABE730802EEEE079F5B3BC101CF7F4567F600AB71E179419DE4AD7B0F3E477B74E29FFDE78714EA3A64A21B30B7FF2C78DCDD0736A7D73C31EA289CF64EE721DACB62126E9D5F53FAE4FEF5E817577EF0FFB16F836143CE12ABDEF277CAFDCE5B5A6C499B70F3CC470977CFD3F9DA616F9B09BF3AEBBF748BE7AA32320F0681AB57A2C4FF19F6613C183E70DF738C971E3232FF07AB1EBE25]
Point(doPlaceInTaskBar)
Point(onClose)
link(onCreate,3667046:doEvent1,[])
}
Add(LineBreakEx,12702891,889,203)
{
Caption="old"
Type=2
}
Add(InfoTip,6457482,532,119)
{
Info=#26:Проверка на существование |17:переданного файла|
Width=330
Height=193
}
Add(Label,14355720,21,301)
{
Left=10
Top=10
Width=51
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="Проект:"
}
Add(Label,1432533,889,238)
{
Left=65
Top=10
Width=176
Height=17
Caption="Файл для запуска не указан!"
link(Text,12702891:getVar,[])
}
Add(Application,4627526,350,168)
{
}
Add(ArrayRW,674651,357,217)
{
Index=Integer(0)
link(onRead,7029895:doWork2,[])
link(Array,4627526:Params,[])
}
Add(FileTools,6107905,553,196)
{
link(onEnd,8296051:doEvent,[])
link(FileName,7687892:getVar,[])
}
Add(IndexToChanel,8296051,623,196)
{
link(onEvent1,758451:doWork,[])
link(onEvent2,440353:doEvent1,[(671,209)(671,244)])
}
Add(Hub,440353,693,238)
{
link(onEvent1,1432533:doText,[])
link(onEvent2,11263820:doData,[])
}
Add(Dir,4212597,301,168)
{
}
Add(DoData,3575993,245,168)
{
link(onEventData,4212597:doCurrentDir,[(289,174)(289,181)])
link(Data,4212597:CurrentDir,[(251,156)(285,156)(285,211)(307,211)])
}
Add(InfoTip,11304338,105,518)
{
Info=#56:Загрузка списка виртуальных устройств и запуск эмулятора|
Width=176
Height=116
}
Add(Hub,3667046,182,210)
{
OutCount=4
link(onEvent1,10501311:doWork,[])
link(onEvent2,3575993:doData,[(220,223)(220,174)])
link(onEvent3,674651:doRead,[(276,230)(276,223)])
}
Add(LineBreakEx,7687892,553,161)
{
Caption="old"
Type=2
}
Add(LineBreakEx,14064077,448,273)
{
Caption="old"
Type=3
link(_Data,11343212:Value,[])
}
Add(InfoTip,9844055,77,7)
{
Info=#16:Запуск эмулятора|7:ANDROID|
Font=[MS Sans Serif,10,1,0,1]
Width=281
Height=60
}
Add(ChildGroupBox,2011158,217,567)
{
}
BEGIN_SDK
Add(EditMulti,12955385,21,21)
{
WorkCount=1
Width=895
Height=536
link(doWork1,8009109:doEvent1,[(81,27)(81,153)])
}
Add(GroupBox,13538456,35,406)
{
Left=10
Top=35
Width=207
Height=187
Font=[MS Sans Serif,8,1,0,1]
Caption="1) Выберите эмулятор:"
}
Add(ListBox,2723447,455,147)
{
Left=30
Top=25
Width=150
Point(String)
Point(onSelect)
}
Add(Button,8654158,427,259)
{
Left=30
Top=120
Width=150
Height=30
Caption="Запустить"
Data=Integer(0)
link(onClick,2360100:doCompare,[])
}
Add(FileSearch,7308239,210,147)
{
Ext="*.ini"
SubDir=1
FullName=1
link(onSearch,6196361:doPart,[])
}
Add(InlineCode,13151070,154,147)
{
@Hint=#61:Компонент позволяет развернуть переменные окружения в строке.|69:Например: %WINDIR%\explorer.exe превратится в c:\windows\explorer.exe|
WorkPoints=#8:doExpand|
EventPoints=#8:onResult|
DataPoints=#3:Str|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|19: Str: THI_Event;|24: onResult: THI_Event;|52: procedure doExpand(var _Data:TData; Index:word);|0:|5: end;|0:|14:implementation|0:|0:|31:procedure THiAsmClass.doExpand;|13:var Sz:Dword;|15: Src:string;|15: Dst:string;|5:begin|34: Src:=ReadString(_Data, Str,'');|50: Sz:=ExpandEnvironmentStrings(PChar(Src),nil,0);|22: SetLength(Dst, Sz);|56: ExpandEnvironmentStrings(PChar(Src), PChar(Dst), Sz);|42: SetLength(Dst, StrLen(PAnsiChar(Dst)));|20: //Dst[Sz-1]:=#0; |19: //_debug(Dst); |33: _hi_OnEvent(onResult, Dst); |4:end;|0:|4:end.|
link(onResult,7308239:doSearch,[])
link(Str,13284369:Value,[])
}
Add(Memory,13284369,154,105)
{
Default=String(%USERPROFILE%\\.android\\avd)
}
Add(FilePartElm,6196361,259,147)
{
Mode=2
link(onPart,4147192:doWork2,[])
}
Add(FormatStr,14253456,476,448)
{
Mask="-avd %1 %2"
link(onFString,13026998:doExec,[])
link(Str1,2360100:Var2,[])
link(Str2,13407560:State,[(489,390)(678,390)])
}
Add(WinExec,13026998,539,448)
{
FileName="tools\\emulator.exe"
Point(doConsoleExec)
}
Add(Hub,8009109,91,147)
{
link(onEvent1,13151070:doExpand,[])
link(onEvent2,4577011:doExistsValue,[(124,160)(124,293)])
}
Add(HubEx,4147192,315,147)
{
link(onEvent,2723447:doAdd,[])
}
Add(MultiElementEx,2360100,476,259)
{
@Hint=#10:BlueStacks|
link(onFalse,14253456:doString,[(520,265)(520,314)(464,314)(464,454)])
link(Data,2723447:String,[])
AddHint(51,-25,69,13,@Hint)
}
BEGIN_SDK
Add(EditMultiEx,12375838,21,21)
{
WorkCount=#9:doCompare|
EventCount=#7:onFalse|
VarCount=#4:Var2|
DataCount=#4:Data|
Width=517
link(doCompare,13998200:doCompare,[(35,27)(35,90)])
link(Var2,5539327:Var2,[(27,139)(97,139)])
}
Add(If_else,13998200,49,84)
{
@Hint=#28:Проверка на выбор BlueStacks|
Op1=String(BlueStacks)
link(onTrue,9652265:doRead,[(145,90)(145,48)])
link(onFalse,12375838:onFalse,[(492,97)(492,27)])
link(Op2,5539327:Var1,[(62,54)])
AddHint(4,75,172,13,@Hint)
}
Add(GetDataEx,5539327,91,49)
{
link(Data,12375838:Data,[(97,35)(27,35)])
}
Add(Registry,9652265,210,42)
{
@Hint=#30:Читаем путь к папке BlueStacks|
HKey=2
Key="SOFTWARE\BlueStacks"
Value="InstallDir"
NotEmpty=1
link(onRead,1690861:doTrim,[])
AddHint(-39,70,178,13,@Hint)
}
Add(Trim,1690861,266,42)
{
Char="\"
Mode=2
link(onTrim,5803461:doStrCat,[])
}
Add(StrCat,5803461,322,42)
{
Str2="\HD-StartLauncher.exe"
link(onStrCat,15675157:doExec,[])
}
Add(WinExec,15675157,385,42)
{
}
END_SDK
Add(CheckBox,8861828,560,329)
{
Left=30
Top=160
Width=150
Hint="Запустить эмулятор с поддержкой GPU ускорения. Функция экспериментальная, поэтому может работать некорректно."
Caption="GPU acceleration"
link(onCheck,12990577:doEvent,[])
}
Add(Switch,13407560,672,322)
{
DataOn=String(-gpu on)
DataOff=String()
Point(doOn)
Point(State)
}
Add(IndexToChanel,12990577,616,329)
{
link(onEvent1,13407560:doReset,[])
link(onEvent2,13407560:doOn,[])
}
Add(InfoTip,6579903,546,301)
{
Info=#16:GPU acceleration|
Width=176
Height=74
}
Add(Registry,4577011,168,273)
{
HKey=2
Key="SOFTWARE\BlueStacks"
Value="InstallDir"
NotEmpty=1
Point(doExistsValue)
Point(onExistsValue)
link(onExistsValue,476959:doEvent,[])
}
Add(IndexToChanel,476959,217,280)
{
Data=String(BlueStacks)
link(onEvent2,4147192:doWork3,[(319,293)])
}
Add(InfoTip,5175045,133,70)
{
Info=#21:Перебор доступных AVD|28:в %userprofile%\.android\avd|
Width=176
Height=123
}
Add(InfoTip,11441577,133,224)
{
Info=#30:Проверка на наличие BlueStacks|21:и добавление в список|
Width=176
Height=123
}
Add(InfoTip,397732,441,420)
{
Info=#19:Запуск обычного AVD|
HAlign=2
Width=176
Height=81
}
END_SDK
Add(ChildGroupBox,16468327,399,581)
{
link(Data1,6096484:getVar,[])
}
BEGIN_SDK
Add(EditMulti,9208103,7,28)
{
WorkCount=1
DataCount=1
Width=846
Height=508
VOffset=140
HOffset=105
link(doWork1,15865215:doEnabled,[(56,174)(56,188)])
}
Add(GroupBox,16242362,35,378)
{
Left=240
Top=35
Width=207
Height=187
Font=[MS Sans Serif,8,1,0,1]
Caption="2) Установите приложение:"
}
Add(Button,15865215,105,182)
{
Left=30
Top=70
Width=150
Height=30
Enabled=1
Caption="Установить"
Data=Integer(0)
Point(doEnabled)
link(onClick,4173187:doEvent1,[])
}
Add(Edit,9079454,546,112)
{
Left=135
Top=25
Text="5554"
}
Add(Label,15329598,35,336)
{
Left=20
Top=20
Width=114
Height=32
Caption="Номер запущенного эмулятора:"
AutoSize=1
}
Add(WinExec,8945808,616,189)
{
FileName="platform-tools\\adb.exe"
RunEvent=1
}
Add(FormatStr,7493520,546,189)
{
Mask=" install "temp\\temp.apk""
link(onFString,8945808:doExec,[])
link(Str1,15595032:Var2,[])
}
Add(GetDataEx,15595032,546,161)
{
link(Data,9079454:Text,[])
}
Add(LineBreakEx,3147916,231,231)
{
Caption="new"
Type=3
link(_Data,15353367:Var1,[])
}
Add(LineBreakEx,13394824,231,154)
{
Caption="old"
Type=2
}
Add(MultiElement,15353367,231,182)
{
link(onEvent1,7273132:doEvent1,[])
link(Data1,13394824:getVar,[])
}
BEGIN_SDK
Add(EditMulti,2736915,21,21)
{
EventCount=1
WorkCount=1
DataCount=1
VarCount=1
Width=608
Height=536
VOffset=42
HOffset=42
link(doWork1,8724615:doSearch,[(35,69)(35,188)])
link(Var1,521521:getVar,[])
}
Add(LineBreakEx,15613977,63,35)
{
Caption="old"
Type=3
link(_Data,2736915:Data1,[])
}
Add(FileTools,6325264,399,196)
{
link(onEnd,2736915:onEvent1,[(581,202)(581,69)])
link(FileName,11158272:getVar,[])
link(NewFileName,9029499:Value,[])
}
Add(LineBreakEx,11158272,399,126)
{
Caption="old"
Type=2
}
Add(InfoTip,6052736,287,84)
{
Info=#8:Копируем|40:%source%\%filename%.apk в temp\temp.apk |
Width=260
Height=165
}
Add(FileSearch,8724615,91,182)
{
Ext="*.apk"
Dir="temp"
SubDir=1
link(onSearch,4488763:doDelete,[])
link(onEndSearch,6325264:doCopy,[(144,195)(144,209)(303,209)(303,209)])
}
Add(FileTools,4488763,182,168)
{
DelToRecycle=1
}
Add(InfoTip,12532134,77,112)
{
Info=#23:Удаляем все файлы *.apk|15:из папки temp\ |
Width=176
Height=137
}
Add(LineBreakEx,521521,63,511)
{
Caption="new"
Type=2
}
Add(LineBreakEx,15147164,322,364)
{
Caption="old"
Type=2
}
Add(FileTools,9463932,504,392)
{
link(FileName,6984329:getVar,[])
}
Add(StrCat,5615120,434,399)
{
Str1="temp\"
link(onStrCat,9463932:doCopy,[])
}
Add(FilePartElm,11874550,322,399)
{
link(onPart,12128759:doValue,[])
link(FileName,15147164:getVar,[])
}
Add(LineBreakEx,6984329,504,364)
{
Caption="old"
Type=2
}
Add(InfoTip,10676683,308,315)
{
Info=#8:Копируем|46:%source%\%filename%.apk в temp\%filename%.apk |
Width=260
Height=165
}
Add(LineBreakEx,11492103,378,448)
{
Caption="new"
Type=3
link(_Data,12128759:Value,[])
}
Add(Memory,12128759,378,399)
{
Default=String()
link(onData,5615120:doStrCat,[])
}
Add(Memory,9029499,406,147)
{
Default=String(temp\\temp.apk)
}
END_SDK
Add(InfoTip,15950121,154,84)
{
Info=#26:Копирование файлов *.apk |34:в папку temp\ потому, что эмулятор|32:не может запускать файлы, в пути|29:к которым есть русские буквы |
Width=211
Height=186
}
Add(LineBreakEx,14001435,112,49)
{
Caption="old"
Type=3
link(_Data,9208103:Data1,[])
}
Add(Button,12603513,350,371)
{
Left=30
Top=150
Width=150
Height=25
Caption="Деинсталлировать"
link(onClick,13075612:doEvent2,[])
}
Add(WinExec,12524676,588,364)
{
FileName="platform-tools\\adb.exe"
RunEvent=1
}
Add(FormatStr,9849945,518,364)
{
Mask=" uninstall %2"
Point(FString)
link(onFString,12524676:doExec,[])
link(Str1,15595032:Var1,[(524,166)])
link(Str2,9665390:Text,[])
}
Add(Edit,9665390,525,308)
{
Left=15
Top=120
Width=175
Hint="Внутреннее название приложения для удаления"
Text="hiasm.hiasmproject"
}
Add(Hub,7273132,378,182)
{
link(onEvent1,13075612:doEvent1,[(420,188)(420,370)])
link(onEvent2,7493520:doString,[])
}
Add(Hub,13075612,448,364)
{
InCount=2
OutCount=1
link(onEvent1,9849945:doString,[])
}
Add(InfoTip,506815,504,84)
{
Info=#9:Установка|
Width=162
Height=165
}
Add(InfoTip,5520048,483,273)
{
Info=#8:Удаление|
Width=162
Height=158
}
Add(WinExec,15828492,210,301)
{
Param="kill-server"
FileName="platform-tools\\adb.exe"
Mode=0
Point(doConsoleExec)
AddHint(-17,42,59,13,Param)
}
Add(Hub,4173187,161,182)
{
link(onEvent1,15353367:doWork1,[])
link(onEvent2,15828492:doExec,[(179,195)(179,307)])
}
END_SDK
Add(LineBreakEx,11942768,119,567)
{
Caption="init"
Type=1
link(OnEvent,1328493:doEvent1,[])
}
Add(InfoTip,14689810,301,518)
{
Info=#43:Установка приложения на ЗАПУЩЕННЫЙ эмулятор|
Width=176
Height=116
}
Add(LineBreakEx,6096484,399,553)
{
Caption="old"
Type=2
}
Add(LineBreakEx,758451,770,196)
{
Caption="disable"
}
Add(LineBreakEx,10501311,231,210)
{
Caption="init"
}
Add(Memory,11343212,448,217)
{
link(onData,6107905:doFileExists,[])
}
Add(DropFile,10707601,357,259)
{
link(onDropFile,7029895:doWork3,[(410,265)])
}
Add(HubEx,7029895,406,217)
{
link(onEvent,11343212:doValue,[])
}
Add(LineBreakEx,6466564,777,245)
{
Caption="disable"
}
Add(DoData,11263820,728,245)
{
Data=Integer(1)
link(onEventData,6466564:doWork,[])
}
Add(LineBreakEx,7118871,301,581)
{
Caption="disable"
Type=1
link(OnEvent,12453169:doEvent1,[])
}
Add(ChildGroupBox,8425417,651,588)
{
link(Data1,14955061:getVar,[])
}
BEGIN_SDK
Add(EditMulti,1199884,7,28)
{
WorkCount=2
DataCount=1
Width=846
Height=508
VOffset=140
HOffset=105
link(doWork1,10943519:doEvent1,[(56,174)(56,188)])
link(doWork2,13649641:doEvent1,[])
}
Add(GroupBox,5658346,35,378)
{
Left=10
Top=235
Width=437
Height=119
Font=[MS Sans Serif,8,1,0,1]
Caption="3) Установите приложение на Memu:"
}
Add(Button,1209717,266,189)
{
Left=30
Top=85
Width=70
Height=25
Enabled=1
Caption="Установить"
Data=Integer(0)
Point(doEnabled)
link(onClick,15061656:doWork2,[])
}
Add(Edit,14529071,546,112)
{
Left=125
Top=30
Width=305
Text=""
}
Add(Label,2172391,37,322)
{
Left=4
Top=33
Width=114
Height=12
Caption="Путь к папке Memu:"
AutoSize=1
}
Add(WinExec,10816739,616,189)
{
RunEvent=1
link(FileName,9507813:Var3,[(622,155)])
link(Params,1660355:FString,[(629,177)(591,177)(591,233)(552,233)])
}
Add(FormatStr,1660355,546,189)
{
Mask=" install -r "temp\\temp.apk""
Point(FString)
link(onFString,10816739:doExec,[])
link(Str1,7630819:Var2,[])
}
Add(GetDataEx,7630819,546,161)
{
link(Data,14529071:Text,[])
}
Add(LineBreakEx,6383450,196,224)
{
Caption="new"
Type=3
link(_Data,4686037:Var1,[])
}
Add(LineBreakEx,10147025,196,154)
{
Caption="old"
Type=2
}
Add(MultiElement,4686037,196,182)
{
link(Data1,10147025:getVar,[])
}
BEGIN_SDK
Add(EditMulti,16320528,21,21)
{
EventCount=1
WorkCount=1
DataCount=1
VarCount=1
Width=608
Height=536
VOffset=42
HOffset=42
link(doWork1,11479096:doSearch,[(35,69)(35,188)])
link(Var1,2938422:getVar,[])
}
Add(LineBreakEx,8267278,63,35)
{
Caption="old"
Type=3
link(_Data,16320528:Data1,[])
}
Add(FileTools,6863737,399,196)
{
link(onEnd,16320528:onEvent1,[(581,202)(581,69)])
link(FileName,15365077:getVar,[])
link(NewFileName,5947415:Value,[])
}
Add(LineBreakEx,15365077,399,126)
{
Caption="old"
Type=2
}
Add(InfoTip,663541,287,84)
{
Info=#8:Копируем|40:%source%\%filename%.apk в temp\temp.apk |
Width=260
Height=165
}
Add(FileSearch,11479096,91,182)
{
Ext="*.apk"
Dir="temp"
SubDir=1
link(onSearch,11156411:doDelete,[])
link(onEndSearch,6863737:doCopy,[(144,195)(144,209)])
}
Add(FileTools,11156411,182,168)
{
DelToRecycle=1
}
Add(InfoTip,12451916,77,112)
{
Info=#23:Удаляем все файлы *.apk|15:из папки temp\ |
Width=176
Height=137
}
Add(LineBreakEx,2938422,63,511)
{
Caption="new"
Type=2
}
Add(LineBreakEx,12144426,322,364)
{
Caption="old"
Type=2
}
Add(FileTools,6468837,504,392)
{
link(FileName,1128193:getVar,[])
}
Add(StrCat,8826449,434,399)
{
Str1="temp\"
link(onStrCat,6468837:doCopy,[])
}
Add(FilePartElm,14191933,322,399)
{
link(onPart,15224504:doValue,[])
link(FileName,12144426:getVar,[])
}
Add(LineBreakEx,1128193,504,364)
{
Caption="old"
Type=2
}
Add(InfoTip,3646341,308,315)
{
Info=#8:Копируем|46:%source%\%filename%.apk в temp\%filename%.apk |
Width=260
Height=165
}
Add(LineBreakEx,1580192,378,448)
{
Caption="new"
Type=3
link(_Data,15224504:Value,[])
}
Add(Memory,15224504,378,399)
{
Default=String()
link(onData,8826449:doStrCat,[])
}
Add(Memory,5947415,406,147)
{
Default=String(temp\\temp.apk)
}
END_SDK
Add(InfoTip,15456614,154,63)
{
Info=#26:Копирование файлов *.apk |34:в папку temp\ потому, что эмулятор|32:не может запускать файлы, в пути|29:к которым есть русские буквы |
Width=211
Height=186
}
Add(LineBreakEx,13472821,112,49)
{
Caption="old"
Type=3
link(_Data,1199884:Data1,[])
}
Add(Button,10909586,350,371)
{
Left=309
Top=85
Width=120
Height=25
Caption="Деинсталлировать"
link(onClick,12383413:doEvent2,[])
}
Add(WinExec,5466890,588,364)
{
RunEvent=1
link(FileName,9507813:Var2,[])
link(Params,6506900:FString,[(601,352)(563,352)(563,408)(524,408)])
}
Add(FormatStr,6506900,518,364)
{
Mask=" uninstall %2"
Point(FString)
link(onFString,5466890:doExec,[])
link(Str1,7630819:Var1,[(524,166)])
link(Str2,13435980:Text,[])
}
Add(Edit,13435980,525,308)
{
Left=295
Top=55
Width=135
Hint="Внутреннее название приложения для удаления"
Text="hiasm.hiasmproject"
}
Add(Hub,762872,378,189)
{
OutCount=3
link(onEvent2,12383413:doEvent1,[(420,202)(420,370)])
link(onEvent3,1660355:doString,[(469,209)(469,195)])
}
Add(Hub,12383413,448,364)
{
InCount=2
OutCount=1
link(onEvent1,6506900:doString,[])
}
Add(InfoTip,11015260,504,84)
{
Info=#9:Установка|
Width=162
Height=165
}
Add(InfoTip,5258850,483,273)
{
Info=#8:Удаление|
Width=162
Height=158
}
Add(EnvVars,15467680,399,112)
{
String="%MEmu_Path%"
link(onExpand,11845673:doStrCat,[])
}
Add(StrCat,11845673,448,112)
{
Str2="\\memu\\adb.exe"
link(onStrCat,14529071:doText,[])
}
Add(GetDataEx,9507813,588,150)
{
Angle=3
link(Data,11845673:Result,[(454,155)])
}
Add(CheckBox,11828085,217,294)
{
Left=10
Top=57
Width=105
Caption="Автоустановка"
link(onCheck,3664316:doWrite,[(266,300)(266,340)(107,340)(107,307)])
}
Add(Ini,3664316,119,294)
{
FileName="opt_launcher"
Section="Memu"
Key="Autoinstall"
link(onResult,11828085:doCheck,[])
}
Add(Hub,13649641,14,175)
{
link(onEvent1,15467680:doExpand,[(48,181)(48,118)])
link(onEvent2,3664316:doRead,[(45,188)(45,300)])
}
Add(If_else,7464964,217,371)
{
Op2=Integer(1)
link(onTrue,15061656:doWork3,[(326,377)])
link(Op1,11828085:Checked,[])
}
Add(Hub,10943519,70,182)
{
OutCount=3
link(onEvent1,4686037:doWork1,[])
link(onEvent2,1209717:doEnabled,[])
link(onEvent3,15443106:doData,[(130,202)(130,377)])
}
Add(DoData,15443106,175,371)
{
link(onEventData,7464964:doCompare,[])
}
Add(HubEx,15061656,322,189)
{
link(onEvent,762872:doEvent1,[])
}
END_SDK
Add(InfoTip,1891157,553,525)
{
Info=#39:Установка приложения на ЗАПУЩЕННЫЙ Memu|
Width=176
Height=116
}
Add(LineBreakEx,14955061,651,560)
{
Caption="old"
Type=2
}
Add(Hub,12453169,364,581)
{
link(onEvent1,16468327:doWork1,[])
link(onEvent2,8425417:doWork1,[])
}
Add(Hub,1328493,175,567)
{
link(onEvent1,2011158:doWork1,[])
link(onEvent2,8425417:doWork2,[(201,580)(201,601)])
}


Редактировалось 5 раз(а), последний 2017-04-11 12:25:16
карма: 0

0
Ответов: 23
Рейтинг: 0
#1482: 2017-04-11 07:37:23 ЛС | профиль | цитата
Netspirit подскажи как подключить стороннюю библиотеку в виде jar файла?
Хочу в inlinecode использовать библиотеку GraphView, в ilinecode вписал import com.jjoe64.graphview.GraphView;
Скопировал саму библиотеку в \HiAsm\compiler\Android\Java\lib и дописал путь к самому jar файлу в build.bat по аналогии как там вписан tools.jar (добавил в хвост -
-cp .;..\..\..\..\compiler\Android\Java\lib\tools.jar;..\..\..\..\compiler\Android\Java\lib\GraphView-4.2.1.jar;)
Но все равно ругается при компилировании, куда еще нужно дописать чтоб он увидел класс GraphView?
карма: 0

0
Ответов: 4621
Рейтинг: 746
#1483: 2017-04-11 11:26:32 ЛС | профиль | цитата
Alex35567 писал(а):
Вот текст измененного launchera
Схему в тег code помести.

Alex35567 писал(а):
куда еще нужно дописать чтоб он увидел класс GraphView?
У нас предусмотрено так:
- кладёшь *.jar файл в папку HiAsm\Elements\Android\code\include\
- подключаешь в коде компонента так:
includeLibrary('имя_библиотеки(без .jar)')

- прописываешь импорт

Так работает, например, компонент Pop3 и MathParse.

Редактировалось 1 раз(а), последний 2017-04-11 11:28:34
карма: 26

0
Ответов: 23
Рейтинг: 0
#1484: 2017-04-11 13:14:12 ЛС | профиль | цитата
Но получается в код самого inlinecode includeLibrary('GraphView-4.2.1') не вставишь это ведь команда не java (хотя я все равно попробовал ), так что вставил в исходник inlinecode в функцию init, но это ничего не изменило, javac не видит класс.
Или надо тогда компонент писать для использования библиотеки (не хочется это делать сейчас, т.к. непонятно вообще подойдет ли библиотека для решаемой задачи, нужно проверить по быстрому будет ли работать в составе кода генерируемого hiasm). Что вообще делает includeLibrary?

--- Добавлено в 2017-04-11 14:08:56

Спасибо библиотеку подключить удалось, то что javac не видел части классов это я затупил - использовал пример для более старой версии библиотеки, хотя остается непонятным как штатно использовать includeLibrary с inlinecode, так чтобы не менять исходник inlinecode.

Редактировалось 1 раз(а), последний 2017-04-11 14:08:56
карма: 0

0
Ответов: 4621
Рейтинг: 746
#1485: 2017-04-11 14:39:34 ЛС | профиль | цитата
Alex35567 писал(а):
как штатно использовать includeLibrary с inlinecode
Тут была идея реализовать InlineCode для FTCG, но так и не получилось. Можно в компонент добавить свойство, типа, "список библиотек" (а также "список разрешений", "список классов" и т.п.)
карма: 26

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)