Перейти к содержанию
Fire Monkey от А до Я

Евгений Корепов

Пользователи
  • Постов

    738
  • Зарегистрирован

  • Посещение

  • Победитель дней

    100

Весь контент Евгений Корепов

  1. А мне принцип подписки нравится. Да и цены не такие уж большие. Не забывайте что скорость и эффективность разработки выше на порядок, чем у большинства инструментов. Я в этом году потратил чуть больше тысячи долларов на обновления, наконец то купил Mobile Addon (давно хотелось попробовать мобильные платформы освоить). Результат не заставил себя ждать - только одно приложение под андроид, на которое я потратил 2 недели не рабочего времени (около 50 часов), приносит сейчас около $10 ежедневно. За месяц 25% затрат отбил. По скорости и эффективности приведу яркий пример - коллеги пишут приложение на java уже больше 10 лет (вдумайтесь в эти цифры), результат вот http://www.netup.ru/UTM5/utm5_tray.php . Довольно убогий, скажу прямо, результат. Полтора месяца, потраченные мной на написание того же инструмента, выглядят так http://www.netup.ru/phpbb/viewtopic.php?t=9846 К тому же Embarcadeo довольно милая контора. К моей лояльности добавилось 500 пунктов после того как купил обновление с XE5 на XE7 за неделю до выхода XE8, а 30 апреля этого года получил приятный сюрприз: Your purchase of RAD Studio, Delphi or C++Builder XE7 earlier this year qualified you for a free XE8 license. YOUR FREE XE8 LICENSE IS ONLY AVAILABLE UNTIL APRIL 30, 2015. DOWNLOAD YOUR LICENSE TODAY! Вот еще бы компилятор под никсы, тогда счастью моему не будет предела, да и деньгам тоже ;-)
  2. Если структура JSON не меняется, то можно так: TUserData = record ID : Integer; VNAME : String; VPASSWORD : String; ... end; TUserDataArray = TArray<TUserData>; И написать функции добавления, удаления, поиска и еще чего надо, для массива это по паре строк кода на функцию. Можно это все в отдельный класс завернуть. Я обычно так поступаю для временного хранения и обработки данных разумных размеров. Быстро, удобно и не надо тащить в приложение мегабайты кода дополнительных компонентов.
  3. Delphi XE8 Столкнулся с странным глюком. TCPClient.IOHandler.Write(SendBuffer,SendBufferLength) ничего не отсылает при запуске на Android 4.1. На Android 5 этот же самый код работает нормально. Трассировка показала что на Android 5 выполнение приводит к TIdStackBSDBase.WSSend(ASocket: TIdStackSocketHandle; const ABuffer; const ABufferLength, AFlags: Integer): Integer; virtual; abstract; а на Android 4.1 к TIdStackVCLPosix.WSSend(ASocket: TIdStackSocketHandle; const ABuffer; const ABufferLength, AFlags: Integer): Integer; Во втором случае снифер не обнаруживает никакой сетевой активности от приложения, хотя процедура вроде как выполняется и исключений не возбуждает. Кто нибудь сталкивался с такой проблемой?
  4. Набрел на хабре на интересную статью о новом сервисе Appodeal (Внимание! Ссылка реферальная, вам все равно, а мне приятно ;-) ). Если крато, то это агрегатор/оптимизатор рекламы в мобильных приложениях, с гибкими выплатами на Яндекс.Деньги, WebMoney и т.п. Но SDK только Java. Самостоятельно интеграцию не осилю. А их заинтересовать в создании компонентов для Delphi в одиночку не могу. Если кому интересно, пните их вопросом о интеграции с Delphi, или напишите ее сами ;-) Готов даже заплатить разумную сумму за готовый компонент. P.S. Не сочтите за рекламу, к Appodeal никакого отношения не имею.
  5. Так с TPath.GetCachePath работает без разрешения на чтение/запись внешнего хранилища? Или все таки глючит? P.S. Зачем вообще сохранять эту картинку? Ради этого глюка приходится давать лишние разрешения приложению и терять параноидальную часть аудитории :-( Вот кстати и картинка:
  6. TPath.Combine (http://docwiki.embarcadero.com/Libraries/XE8/en/System.IOUtils.TPath.Combine) как раз этим и занимается в моем исправлении. В первом варианте не я определяю такой путь сохранения файла, а программисты Embarcadero.
  7. [Delphi XE8, Android] Ошибка в Studio\16.0\source\fmx\FMX.Graphics.Android.pas и соответственно в Studio\16.0\lib\android\release\FMX.Graphics.Android.o и Studio\16.0\lib\android\debug\FMX.Graphics.Android.o Строка 258 function GetTmpFileName: String; Выглядит так: function GetTmpFileName: String; begin Result := TPath.GetTempPath + 'TmpBitmapStream' end; Подозреваю что выглядеть должна вот так: function GetTmpFileName: String; begin Result := TPath.Combine(TPath.GetTempPath, 'TmpBitmapStream'); end; Из за этой ошибки временный файл создается не в '/storage/emulated/0/Android/data/<application ID>/files/tmp' (TPath.GetTempPath), а в '/storage/emulated/0/Android/data/<application ID>/files' (TPath.GetSharedDocumentsPath).
  8. Обнаружил еще одну странность TTetheringManager - не хочет работать через мобильный интернет. procedure TForm1.Button2Click(Sender: TObject); Var DiscoverTimeOut : Integer; ATargetList: TTetheringTargetHosts; begin SetLength(ATargetList,3); ATargetList[0]:='195.22.104.70'; ATargetList[1]:='195.22.104.71'; ATargetList[2]:='195.22.104.72'; DiscoverTimeOut:=5000; TM.DiscoverManagers(10000,ATargetList); end; Этот код не имеет никакого эффекта.
  9. Вот полный код приложения: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,System.Tether.Manager, System.Tether.AppProfile, IPPeerClient, IPPeerServer, FMX.Controls.Presentation, FMX.StdCtrls, IdStack; type TForm1 = class(TForm) TM: TTetheringManager; TAP: TTetheringAppProfile; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); begin try TM.Enabled:=True; except on E : EIdSocketError do ShowMessage(E.Message) ; end; if TM.Enabled then TAP.Enabled:=True; end; end. Пробовал перехватывать с помощью Application.OnException, но тоже безрезультатно. Судя по исходникам, авторы компонентов не посчитали нужным обрабатывать сетевые ошибки Добавил свои проверки на доступность Wi-Fi и мобильного интернета...
  10. Delphi XE8, Android. Не могу перехватить исключение при попытке активировать TTetheringManager, при отладке появляется EIdSocketError "Socket Error #101 Network is unreachable". Если игнорировать или запускать приложение отдельно - глухой висяк. Код простой: procedure TForm1.Button1Click(Sender: TObject); begin try TM.Enabled:=True; except on E : EIdSocketError do ShowMessage(E.Message) ; end; if TM.Enabled then TAP.Enabled:=True; end; Исключение не перехватывается. Возникает судя по всему уже в отдельном потоке и приводит к неработоспособности приложения при попытке запустить с выключенным wifi или интернетом. Конечно можно обвесить каждое телодвижение внешними проверками на наличие связи, но подозреваю есть путь проще. Буду благодарен за помощь
  11. Я вот так у себя сделал: procedure TFormMain.CButtonScanClick(Sender: TObject); begin If IsAppInstalled('com.google.zxing.client.android')Then TKRBarCodeScanner.Scan Else OpenURL('https://play.google.com/store/apps/details?id=com.google.zxing.client.android&hl=ru'); end; function TFormMain.IsAppInstalled(const AAppName: string): Boolean; var PackageManager: JPackageManager; begin PackageManager := SharedActivity.getPackageManager; try PackageManager.getPackageInfo(StringToJString(AAppName), TJPackageManager.JavaClass.GET_ACTIVITIES); Result := True; except on Ex: Exception do Result := False; end; end; procedure TFormMain.OpenURL(const AUrl: string); {$IFDEF ANDROID} var Uri: Jnet_Uri; OpenLinkIntent: JIntent; {$ENDIF ANDROID} begin {$IFDEF MSWINDOWS} ShellExecute(0, 'open', PChar(AUrl), nil, nil, SW_SHOWNORMAL); {$ENDIF MSWINDOWS} {$IFDEF ANDROID} Uri := StrToJURI(AUrl); OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri); SharedActivity.startActivity(OpenLinkIntent); {$ENDIF ANDROID} end;
  12. Оно и не пытается запускаться, OS вызывает экземпляр "мертвого" приложения. С портированием на C++ помочь к сожалению не могу. Возможно поможет откомпилированный в Delphi uVedroProcess.o? Не знаю совместимы ли они...
  13. Приложение на FireMonkey с некоторой вероятностью зависает при нажатии кнопки назад, причем это поведение наблюдается даже на пустых приложениях без единой строчки кода. Вероятность зависания прямо пропорциональна количеству контролов на форме. Такая же ситуация в процессе отладки - нажатие на кнопку стоп IDE не гарантирует завершение приложения и следующий запуск отладки может привести к черному экрану (хотя это уже мистика). Мне очень помогло решение от Руслана, в теме . За что ему огромное спасибо. Запуск, кнопка назад и повторный запуск - пол сотни раз, полет нормальный.
  14. Есть приложение с TBannerAd. Реклама показывается, на сайте Admob регистрируются показы. Но на сайте Admob, в разделе Аналитика тишина, все по нолям. Правильно ли я понимаю что так и должно быть? Без реализации Google Analytics в приложении работать аналитика не будет?
  15. Как вариант, объект положить в Frame, а его уже в ListBox? Хотя не знаю точно как работает Frame... Или создать наследника объекта, вместо parent сделать parentList и переписать create и destroy для контроля списка родителей и удаления последнего экземпляра объекта.
  16. <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14" /> - работает хорошо, на новых устройствах кнопки нет.
  17. А если не стоит https://play.google.com/store/apps/details?id=com.google.zxing.client.android&hl=ru, разве андроид не должен предлагать ее установить? У меня не предлагает :-( Пришлось сделать linkedlabel рядом с кнопкой сканирования, с предложением скачать. Или надо самому определять наличие программы и вместо запуска сканирования открывать ссылку на приложение? P.S. Если Barcode scanner удалить, то запускается Google Now, сканирует нормально, но результат не возвращается. Как понимаю, строка (com.google.zxing.client.android.SCAN) для него нужна иная?
  18. Ура! "screenSize" в сочетании с android:minSdkVersion="9" android:targetSdkVersion="14" помогло! Все работает отлично. Всем огромное спасибо. Привожу измененных темплейт манифеста, вдруг кому пригодится. <?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="%package%" android:versionCode="%versionCode%" android:versionName="%versionName%"> <!-- This is the platform API where NativeActivity was introduced. --> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14" /> <%uses-permission%> <application android:persistent="%persistent%" android:restoreAnyVersion="%restoreAnyVersion%" android:label="%label%" android:installLocation="%installLocation%" android:debuggable="%debuggable%" android:largeHeap="%largeHeap%" android:icon="%icon%" android:theme="%theme%" android:hardwareAccelerated="%hardwareAccelerated%"> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="%activityLabel%" android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <%activity%> <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" /> <%receivers%> </application> </manifest> <!-- END_INCLUDE(manifest) -->
  19. Этот досадный глюк наблюдался в версиях XE5-XE6, в версии XE7 он помоему исправлен (правда сам не проверял). В любом случае где-то в инете встречал обход этой проблемы, но ссылки к сожалению дать не могу. Кстати она встречается начиная с версии minAPI 13, на 12 все нормально. Попробуйте, может в 12 версии не будет кнопки меню. Благодарю за совет, но не помогло. Delphi XE7 Update1, поведение следующее: 12 - кнопка не исчезает, смена ориентации проходит нормально 13 - кнопка не исчезает, смена ориентации приводит к закрытию приложения 14 - кнопка исчезает, смена ориентации приводит к закрытию приложения Видимо надо смириться...
  20. Все отлично сработало, спасибо! Но появился не приятный побочный эффект - при повороте экрана приложение вылетает. Т.е. Поворачиваю экран, ориентация начинает менятся и тут же приложение закрывается. Попробовал на чистом примере из "Samples\Object Pascal\Mobile Samples\User Interface\MultiView", изменил манифест - вылет присутствует.
  21. Как узнать версию приложения под Android? Под Windows все просто, GetVersion(ParamStr(0)), а под Android не могу найти function TFormMain.GetVersion(filename:String): string; Var VerInfoSize: DWORD; VerInfo: Pointer; VerValueSize: DWORD; VerValue: PVSFixedFileInfo; Dummy: DWORD; begin VerInfoSize := GetFileVersionInfoSize(PChar(filename), Dummy); GetMem(VerInfo, VerInfoSize); GetFileVersionInfo(PChar(filename), 0, VerInfoSize, VerInfo); VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize); with VerValue^ do begin Result := IntToStr(dwFileVersionMS shr 16); Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF); Result := Result + '.' + IntToStr(dwFileVersionLS shr 16); Result := Result + '.' + IntToStr(dwFileVersionLS and $FFFF); end; FreeMem(VerInfo, VerInfoSize); end;
×
×
  • Создать...