Доска почета


Popular Content

Showing most liked content since 26.02.2017 Во всех областях

  1. Доработал компонент. Добавлено: Поддержка Tint эффекта - TfgRatingBar.TintColor Автоматический размер - TfgRatingBar.AutoSize Режим только отображения - TfgRatingBar.ReadOnly Событие окончательного изменения рейтинга (отжатие пальца от экрана или кнопки мышки) - TfgRatingBar.OnChange Событие в процессе изменения рейтинга - TfgRatingBar.OnChanging
    8 likes
  2. Ссылка: http://yaroslavbrovin.ru/object_life_cycle_in_delphi_part_2_android_ios-ru/ Автор: Ярослав Бровин Продолжаем тему жизненного цикла объектов в мире Delphi, но в этой части рассматриваем эту тему в рамках мобильных платформ Android и iOS. Delphi вводит новый подход к управлению памятью в мобильных платформах. Появляется автоматический подсчет ссылок, который с одной стороны облегчает код разработчика и должен помочь ему, а с другой стороны раскладывает равномерно грабли на пути освоения новых платформ в мире Delphi.
    8 likes
  3. Вышло обновление до версии 1.5.0: - Исправлены переходы в глоссарии - Значительно уменьшен размер приложения - Настройки автоматической проверки обновлений - [Windows] Переработка приложения для Windows - [Windows] Добавлены анимации перехода - [Windows] Минимальные размеры окна ограничены 800 пикселями по ширине и 600 по высоте - [Android] Системная строка подкрашивается в "фирменный" синий во всех режимах работы приложения - [Android] Отключена анимация перетаскивания элементов бокового меню - [Android] Индикатор загрузки - [Android] Навигационная панель больше не перекрывает интерфейс приложения - [Android] Исправлена ошибка с сохранением PDF-документа - [Android] Увеличена скорость вывода информации и тестирования - [Android] Немного изменен внешний вид экрана вывода результата тестирования Ссылка на скачивание Android-версии: https://yadi.sk/d/edIZR2VuuRFce Ссылка на скачивание Windows-версии: https://yadi.sk/d/iIeC0OE8ukMoi
    7 likes
  4. var MyRect: TRectF; begin MyRect := RectF(10, 10, 30, 30); if Canvas.BeginScene then try Canvas.Fill.Color := TAlphaColorRec.Red; Canvas.Stroke.Color := TAlphaColorRec.Black; Canvas.FillEllipse(MyRect, 1); Canvas.DrawEllipse(MyRect, 1); finally Canvas.EndScene; end; end; FillEllipse - заливка DrawEllipse - обводка
    7 likes
  5. Получите от медицинского центра разрешение на использование их логотипа. Можно на русском языке. Текст произвольный - поручаем Kitty изготовление приложения и разрешаем использование логотипов, торговых марок, фирменных наименований и т.д. в приложениях. Подробнее здесь https://play.google.com/intl/ru/about/ip-deception-spam/impersonation-ip/ И отправьте скан (pdf к примеру) этого письма в гугл, подробности тут https://support.google.com/googleplay/android-developer/answer/6320428 Последнее время все сложнее публиковать приложения, правила уже балансируют на грани маразма. Одно моё приложение заблокировали по причине того что я "выдавал" себя за магазин линолиума в какой то немецкой деревушке - логотип приложения был немного искаженной зеркальной копией логотипа этого магазина, так же отличались цвета - у магазина желтый, у приложения оранжевый. Вот такие дела... Так же сильно зависит от места модерации - если повезет попасть в британский офис, то вам досконально объяснят причину блокировки, приведут примеры правильного и не правильного решения вашего вопроса. Вот пример из моей практики: Если не повезет попасть в подмосковье - то вы не получите комментариев, апелляция будет проигнорирована и относится к вам будут как к ничтожеству. Российская специфика - мальчик получивший работу в Великом Гугле, благодаря двоюродному дяде, сам становится Великим. И естественно он обязан быть гавном, так у него в должностной инструкции написано ;-)
    7 likes
  6. Вот сделал таблицу с событиями. Добавил в статью Очередь событий Delphi приложения на Android И получилось, что отслеживать сворачивание можно по: OnSaveState aeWillBecomeInactive EnteredBackground Разворачивание: WillBecomeForeground
    7 likes
  7. Hi. New tools for Delphi IDE. Using CrossVcl you focus only on your VCL application and CrossVcl makes it cross-platform. This is beta software only for testing purpose. CrossVcl on early stage of development, what are to test in this release: * Installation process (CrossVcl creates copy and patches existing on your machine Vcl and Rtl sources, all original sources stay unmodified) * Upgrading simple or new Vcl project to macOS (Right Click on Project in Project Inspector) * Compilation and deploying of simple project Please do not create bug-report if you can't compile or launch big Vcl projects or any third-party controls at this stage. Bug reports and suggestions welcome at: https://bitbucket.org/crossvcl/crossvcl/issues We help you on: http://stackoverflow.com/questions/tagged/crossvcl Google+: https://plus.google.com/109334532832375082802 Facebook: https://www.facebook.com/crossvcl Twitter: https://twitter.com/VclCross Home
    7 likes
  8. Это решается редактированием стиля. Например так: 1). Размещаете TGroupbox на форме 2). ПКМ на нем 3). в контекстном меню выбираете Edit Custom Style (или Edit Default style) 4). в открывшемся редакторе стиля указываете платформу (Android) 5). выбираете объект background (по умолчанию он белый). 6). задаете ему свойство Visible=false
    6 likes
  9. procedure LoadBitmapFromURL(const aURL: string; aBitmap: TBitmap; const aSuccess: TThreadProcedure = nil; const aError: TThreadProcedure = nil); var thread: TThread; begin thread := TThread.CreateAnonymousThread( procedure var HTTP: THTTPClient; Result: TMemoryStream; begin Result := TMemoryStream.Create; HTTP := THTTPClient.Create; try try HTTP.Get(aURL, Result); TThread.Synchronize(TThread.CurrentThread, procedure var aSourceBmp: TBitmap; begin aSourceBmp := TBitmap.Create; try aSourceBmp.LoadFromStream(Result); if not aSourceBmp.IsEmpty then begin aBitmap.SetSize(aSourceBmp.Width, aSourceBmp.Height); aBitmap.CopyFromBitmap(aSourceBmp); if Assigned(aSuccess) then aSuccess; end; finally FreeAndNil(aSourceBmp); end; end); except TThread.Synchronize(TThread.CurrentThread, procedure begin if Assigned(aError) then aError; end); end; finally FreeAndNil(Result); FreeAndNil(HTTP); end; end); thread.FreeOnTerminate := true; thread.start; end; в последнее время пользуюсь такой конструкцией
    6 likes
  10. Вот так напрямую в память: function ShellExecuteMy(CommandLine: string; AWorkDir: string = 'C:\') : String; var SA: TSecurityAttributes; SI: TStartupInfo; PI: TProcessInformation; StdOutPipeRead, StdOutPipeWrite: THandle; WasOK: Boolean; Buffer: array[0..255] of AnsiChar; BytesRead: Cardinal; WorkDir: string; Handle: Boolean; AOutputLine : String; begin with SA do begin nLength := SizeOf(SA); bInheritHandle := True; lpSecurityDescriptor := nil; end; CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0); try with SI do begin FillChar(SI, SizeOf(SI), 0); cb := SizeOf(SI); dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; wShowWindow := SW_HIDE; // wShowWindow := SW_MINIMIZE; // wShowWindow := SW_NORMAL; hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin hStdOutput := StdOutPipeWrite; hStdError := StdOutPipeWrite; end; WorkDir := AWorkDir; // Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine), Handle := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, PChar(WorkDir), SI, PI); // Result:=PI; CloseHandle(StdOutPipeWrite); finally CloseHandle(StdOutPipeRead); end; if Handle then try repeat // WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); WasOK := ReadFile(StdOutPipeRead, Buffer, 50, BytesRead, nil); if BytesRead > 0 then begin Buffer[BytesRead] := #0; AOutputLine:=StrOemToAnsi(Buffer); Result :=Result + AOutputLine; end; until not WasOK or (BytesRead = 0); WaitForSingleObject(PI.hProcess, INFINITE); finally CloseHandle(PI.hThread); CloseHandle(PI.hProcess); end; finally CloseHandle(StdOutPipeRead); end; end; Функция читает пайп вывода и помещает в строку. P.S. uses Winapi.Windows;
    6 likes
  11. Ссылка: http://delphifmandroid.blogspot.ru/2017/03/blog-post.html Автор: Ефимов Андрей Описание:
    6 likes
  12. Сделал маленький пример, как использовать Binding Expressions в Design Time. По прилагаемому снимку экрана легче ориентироваться в выборе компонент. Подробнее на эту тему здесь: http://docwiki.embarcadero.com/RADStudio/Berlin/en/Using_Custom_Format_and_Parse_Expressions_in_LiveBindings pLBExpr1.zip
    5 likes
  13. Прямая ссылка в блог: Автоматическая смена названия приложения в зависимости от языка системы Ссылка на форуме(Раздел "Статьи"): [Статья][Android] Автоматическая смена названия приложения в зависимости от языка системы и ещё есть обычные темы по этому вопросу, но прикладывать не буду. p.s. Народ совсем обленился, сложно поиском воспользоваться...
    5 likes
  14. Kitty,а вы попробуйте переустановить свое приложение.Удалить и заново поставить.Получите +1 к пушам. Было 3,станет 4.Больше переустановок,больше пушей. Когда работал с Kinvey была такая же история.В блогах на Embarcadero обсуждали даже.Если в кратце и по памяти,то при переустановке приложения,в Kinvey дублируется запись устройства на которое отправляется push.Что бы избежать этого,надо делать доп проверку на уже существующий токен для данного устройства.Повторюсь что это по памяти,но суть понятна.Можете поискать в блогах Sarina Dupont на Embarcadero. Собственно после этого я и перешел на нативные пуши. Потому как написал многоуважаемый ZuBy: Вот,нашел: https://community.embarcadero.com/blogs/entry/remote-push-notifications-on-android-with-rad-studio-xe6-795 Второй коммент. 15 раз установил,15 пушей.
    5 likes
  15. На случай "своими руками", я бы порекомендовал Вам копать в сторону WebRTC. Разумеется все зависит от конечных задач, стоящих перед Вашей программой. Судя по всему - это организация потокового видео в режиме реального времени на соответствующие сервисы. А это значит, что: - нужно организовать формирование и передачу RTMP (RTSP) потока, с чем в Delphi (если о нем речь идет) есть определенные сложности) (в ситуации с С++ будет немного проще); - нужно использовать кодеки (encoder), формат которых поддерживается теми системами, на которых вы хотите видеть воспроизведение потока. Аналогично, как и в вопросе с rtmp-потоком, ситуация с реализацией в Delphi будет сложнее (хотя тоже можно); - что касается конвертации кадров из одного формата в другой, то тут все немного проще. В интернете полно алгоритмов описывающих конвертацию битмапа из одного формата в другой. Разумеется - не все так просто. Поскольку необходимо не просто конвертировать кадры, перед тем как передать их энкодеру, но еще и правильно от энкодера получить сам поток и передать его. После энкодера, конечно, идут не просто "кадры". В зависимости от настроек энкодера, сначала идет "ключевой кадр" (и он повторяется с определенной периодичностью), а за ним последовательность "фреймов" - "описывающих" лишь изменения в "ключевом кадре". Кратко как-то так... В любом случае, я бы порекомендовал Вам сначала пошарить по ресурсу, описывающему работу с потоковым видео. Просто понять как это работает, в принципе. Ну и многое можно там же подчерпнуть. Например, просто как оптимальнее настроить энкодер для трансляции того или иного видео.
    4 likes
  16. Это касается ARC компиляторов, Android, iOS и будущего Linux. Если контейнер владелец, содержит классы, которые используют анонимный метод для общения с ним (классом владельцем), то такая конструкция порождает утечку памяти из-за появления циклической ссылки. Т.к. при присваивании анонимного метода инкрементируется счетчик ссылок и не меняется. Причем это не указано в хелпе. А дело было так - при вызове MyCore.Free класс не уничтожался - не вызывался деструктор из за того, что после вызова Free, счетчик ссылок (reference Count) был равен 1. Приходилось пользоваться DisposeOf. Решил разобраться. Для этого перекрыл виртуальные методы TObject отвечающие за изменения счетчика объекта (см. также полный пример ниже). function __ObjAddRef: Integer; override; function __ObjRelease: Integer; override; Итак TCore содержит класс TTestClass - у которого есть событие OnMyEvent. Прототип описан как анонимная процедура - TAnonymProc = reference to procedure; При указании анонимной процедуры, т.е. : procedure TCore.SetEvent; begin fTest.OnMyEvent := procedure () begin fSetFlag := true; end; end; счетчик ссылок TCore увеличивается на 1 и не изменяется при выходе из SetEvent. Теперь при вызове Free TCore - не будет вызван деструктор, который должен уничтожит классы TCore и TTestClass и произойдет утечка памяти. Решение : 1. Использовать слабые ссылки - weak, в нашем примере добавить атрибут [weak]: TTestClass = class strict private [weak]fOnMyEvent:TAnonymProc; public property OnMyEvent: TAnonymProc read fOnMyEvent write fOnMyEvent; end; При присваивании объекта в переменную со слабой ссылкой не происходит увеличение счётчика ссылок объекта на единицу. Аналогично, при очистке слабой ссылки не происходит уменьшение счётчика объекта на единицу. 2. Не использовать анонимные методы, а использовать обычные указатели на метод: Вместо TAnonymProc = reference to procedure; используем классический TAnonymProc = procedure of object; Демо пример, где можно отследить утечку прикрепил. Полный код: AnonMethodsCycle.zip
    4 likes
  17. 1 Вариант. Заменой удаления фреймов на скрытие (подправленный проект приложил). 2 Вариант. Расположить панель с кнопкой Back на главной форме, а не дублировать ее в каждом фрейме. (При необходимости саму кнопку Back можно скрывать при возврате на первый таб). 3 Вариант. Использовать отложенное удаление фрейма). ... и еще много разных вариантов. Click; FPressed := False; StartTriggerAnimation(Self, 'Pressed') Отладчик выдал ошибку в методе объекта TControl (в Вашем случае это кнопка SpeedButton1 на фрейме). В этом методе в Click вы удаляете Frame, а значит и кнопку на ней. А в строке StartTriggerAnimation(Self, 'Pressed'); вы обращаетесь к этой удаленной кнопке (Self). Здесь и происходит AV. test2.zip
    4 likes
  18. Создал 2 тестовых проекта (один VCL, другой FMX). В обоих только форма с кнопкой. Компилировал из 10 Seattle и 10 Berlin (конфигурация Debug). Запускал на win 7 и 10. Задержки в 1-2 сек не наблюдал. На глаз оба проекта запускаются с одинаковой скоростью. Конфигурация компьютера аналогична Вашей. https://www.youtube.com/watch?v=5q8ZKiYEWko
    4 likes
  19. по пушам на MIUI лучше почитать на 4pda.ru/ все описано и с картинками )
    4 likes
  20. Для работы с Sqlite можете использовать компоненты FireDAC http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FireDAC.SQLite_Sample
    4 likes
  21. Не совсем, если отслеживать все возможные варианты сворачивания приложения (включая выход из приложения), то лучше использовать: TApplicationEvent.EnteredBackground Для отслеживания разворачивания приложения достаточно: TApplicationEvent.WillBecomeForeground aeBecameActive и aeWillBecomeInactive отрабатывают только в определённых случаях. p.s. Надо табличку оформить, чтобы было понятно, когда и для чего могут понадобится те или иные события.
    4 likes
  22. Очередь событий Delphi приложения на Android Жизненный цикл мобильного приложения
    4 likes
  23. Ссылка: http://delphifmandroid.blogspot.ru/2017/03/android-studio.html Автор: Ефимов Андрей Описание:
    3 likes
  24. Ссылка: http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html Автор: Зарипов Равиль @ZuBy Описание: Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2] В предыдущей части , я рассказывал как сделать настройку пуш уведомления в консоли Firebase, в этой я покажу код на Delphi и серверную часть на PHP
    3 likes
  25. У большинства хостингов, светить портом sql сервера наружу считается ересью, что в принципе правильно. Поэтому обычная практика - ssh туннель до хостера и внутри него соединение с sql. Вот хороший пример настройки на мастерхосте https://masterhost.ru/support/hosting/work-with-data/program/#MySQL-tunnel Илья, если вы хотите из приложения коннектится по ssh и подключаться к sql, то лучше этого не делать - вам придется распространять вместе с приложением ключи (или логин с паролем) ssh,и предрекаю что через неделю ваш хостинг будет рассылать спам и майнить криптовалюту для злых хакеров.
    3 likes
  26. Запретить отключение экрана приложения в Андроид: в файл проекта (Project - View Source) добавить строки: // в uses {$IFDEF ANDROID} Androidapi.Helpers, Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText, {$ENDIF} {$R *.res} // и далее - перед Application.Initialize begin {$IFDEF ANDROID} TAndroidHelper.Activity.getWindow.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON); {$ENDIF} Application.Initialize; ...
    3 likes
  27. Увеличил количество сообщений с 20 до 30. Предложение хорошее. Сейчас количество ответов в единицу времени уже гораздо больше, чем даже год назад. Так что предложение хорошее.
    3 likes
  28. Да. constructor Create(AOwner: TComponent); override;
    3 likes
  29. Полностью согласен. panelstyle - это и есть только один TRectangle. StyleEditor не позволяет его сделать Visible=false. Но можно менять Opacity. Если нужна невидимая панель, то лучше использовать обычный TLayout, который вообще не использует стиль. Работа с background в TGroupbox зависит от платформы. Посмотрите в редакторе стилей на дефолтный groupboxstyle: - для платформы Windows: текст, используемый для заголовка группы, расположен на объекте background. Если Вы будете менять видимость или прозрачность background, то текст тоже будет невидимым/прозрачным. - для платформы Android: текст расположен на отдельном layout. В этом случае изменение видимости/прозрачности background не влияет на отображение текста заголовка.
    3 likes
  30. в FMX все делается с помощью стилей, нужно отредактировать стиль TGroupbox
    3 likes
  31. само скачивание картинки HTTPClient.Get должен быть в потоке, а при успешном скачивании нужно делать синхронизацию с главным потоком и "вставлять" картинку в нужное место
    3 likes
  32. Synchronize(LoadImage); Эта строка означает, что LoadImage выполняется в главном потоке (для каждой картинки!). Для примера посмотрите эту тему:
    3 likes
  33. Внутри TComboBox используется TListBox Cамый простой способ кинуть на форму TListBox ПКМ Add TListBoxItem выбрать нужный стиль для Item (StyleLookup) ПКМ по Item Edit Custom Style меняем что нужно в стиле и сохраняем применяем новый стиль к Item
    3 likes
  34. const aColorNames: array [0 .. 3] of string = ('Black', 'Red', 'Yellow', 'Green'); aColors: array [0 .. 3] of TAlphaColor = (TAlphaColorrec.Black, TAlphaColorrec.red, TAlphaColorrec.Yellow, TAlphaColorrec.Green); procedure TForm1.DoItemApplyStyleLookup(Sender: TObject); var ColorObj: TShape; begin if TListBoxItem(Sender).FindStyleResource<TShape>('color', ColorObj) then ColorObj.Fill.Color := aColors[TListBoxItem(Sender).Tag]; end; procedure TForm1.Button1Click(Sender: TObject); var aItem: TListBoxItem; I: Integer; begin ComboBox1.DropDownKind := TDropDownKind.Custom; // uses FMX.Pickers; for I := Low(aColorNames) to High(aColorNames) do begin aItem := TListBoxItem.Create(ComboBox1); aItem.Parent := ComboBox1; aItem.Text := aColorNames[I]; aItem.Width := aItem.DefaultSize.Width; aItem.Height := aItem.DefaultSize.Height; aItem.StyleLookup := 'colorlistboxitemstyle'; aItem.StylesData['color.Fill.Color'] := aColors[I]; aItem.OnApplyStyleLookup := DoItemApplyStyleLookup; aItem.Tag := I; end; end; как-то так
    3 likes
  35. Поправка: это самый верный способ для FMX, вне зависимости от платформы. Емнип, у TCircle нет наследников. Ну и - для использования Release не обязательно приводить тип к истинному классу объекта. Поэтому сей код можно записать так (не проверял в IDE, но если скомпилируется - значит всё нормально): for k:=Layout1.ChildrenCount-1 downto 0 do if Layout1.Children[k] is TCircle then Layout1.Children[k].Release;
    3 likes
  36. Мне это видится примерно так: Отключите автоматическое создание форм. Сначала создайте Splash-форму (эту можно оставить в автомате). Отобразите ее. Создайте вашу "главную" форму. В процедуре OnFormCreate сделайте Preload для стиля (тут на форуме это обсуждалось) - это позволит загрузить стиль, отрисовать все и только затем отобразит вашу форму (по крайней мере - отрисовка произойдет мгновенно, проверено на формах с сотнями компонентов). На OnShow вашей "главной" формы сделайте Application.MainForm := ваша_"главная"_форма и скройте Splash-форму. З.Ы. И, да - лучше оперировать фреймами и создавать их и удалять только тогда, когда они нужны. На скорость это практически не влияет, даже если у вас меню будут фреймами... Это из личного опыта - все достаточно быстро!
    3 likes
  37. для заливки используется Canvas.Fill.Color := цвет; Canvas.FillEllipse();
    3 likes
  38. На мобильных это делается с помощью TAniCalculations, в ModernLV есть метод getAniCalc if ListView1.getAniCalc <> nil then ListView1.getAniCalc.Animation := false; в момент вызова этого кода скроллинг остановится
    3 likes
  39. Сделал пример приложения для работы с Microsoft Word из приложения Delphi. Такое приложение может использоваться для обмена данными между объектами семейства Microsoft Office. Исходные коды приложения помогут вам понять, как работать с объектной моделью Microsoft Word. Чтобы лучше разобраться с нюансами Word, предлагаю ознакомиться со справочником Word VBA reference на MSDN. Проект создан в среде FireMonkey Delphi Berlin 10.1 Протестирован в MS Word 2010, 2016, Windows 7x64 и 10x64. Чтобы посмотреть пример, просто распакуйте zip-файл проекта и щелкайте по порядку кнопки на форме. Скачать Delphi Word Test WordTest.zip
    3 likes
  40. Мой вариант Broadcast Receiver, на мой взгляд наиболее оптимизирован и удачен. По сравнению с известным кодом от barisatalay . Отличия - исправлена утечка, чуть быстрее работает, за счет того что создается один фильтр в него добавляется несколько Actions и одна регистрация на него, нет лишних конвертирований с Jstring to string и обратно, адаптирован под Delphi 10 (JFMXBroadcastReceiver) , упрощена работа с классом (не нужно помнить о регистрации и вызывать ее заранее) , и самое главное - может получать getResultCode текущего ресивера (к примеру он нужен при получении статуса смс сообщения и в других случаях.). unit BroadcastReceiver; interface {$IFDEF ANDROID} uses Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText, Androidapi.helpers, Androidapi.JNIBridge, FMX.Helpers.Android, Androidapi.JNI.JavaTypes, System.Classes, System.SysUtils; type TBroadcastReceiver = class; TListener = class(TJavaLocal, JFMXBroadcastReceiverListener) private fOwner: TBroadcastReceiver; fReceiver: JFMXBroadcastReceiver; public constructor Create(aOwner: TBroadcastReceiver); destructor Destroy; override; procedure onReceive(context: JContext; intent: JIntent); cdecl; end; TOnReceive = procedure (aContext: JContext; aIntent: JIntent; aResultCode: integer) of object; TBroadcastReceiver = class private fListener : TListener; fRegistered: boolean; fOnReceive: TOnReceive; public constructor Create(aOnReceiveProc: TOnReceive); destructor Destroy; override; procedure AddActions(const Args: array of JString); procedure SendBroadcast(const aValue: string); end; {$ENDIF} implementation {$IFDEF ANDROID} { TBroadcastReceiver } constructor TBroadcastReceiver.Create(aOnReceiveProc: TOnReceive); begin inherited Create; fListener := TListener.Create(Self); fOnReceive := aOnReceiveProc; end; destructor TBroadcastReceiver.Destroy; begin fListener.Free; inherited; end; procedure TBroadcastReceiver.AddActions(const Args: array of JString); var vFilter: JIntentFilter; i: Integer; begin if fRegistered then TAndroidHelper.context.getApplicationContext.UnregisterReceiver(fListener.fReceiver); vFilter := TJIntentFilter.JavaClass.init; for i := 0 to High(Args) do vFilter.addAction(Args[i]); TAndroidHelper.context.getApplicationContext.registerReceiver(fListener.fReceiver, vFilter); fRegistered := true; end; procedure TBroadcastReceiver.SendBroadcast(const aValue: string); var Inx: JIntent; begin Inx := TJIntent.Create; Inx.setAction(StringToJString(aValue)); TAndroidHelper.Context.sendBroadcast(Inx); end; constructor TListener.Create(aOwner: TBroadcastReceiver); begin inherited Create; fOwner := aOwner; fReceiver := TJFMXBroadcastReceiver.JavaClass.init(Self); end; destructor TListener.Destroy; begin TAndroidHelper.context.getApplicationContext.unregisterReceiver(fReceiver); inherited; end; // usually android call it from "UI thread" - it's not main Delphi thread procedure TListener.onReceive(context: JContext; intent: JIntent); begin if Assigned(fOwner.fOnReceive) then fOwner.fOnReceive(Context, Intent, fReceiver.getResultCode); end; {$ENDIF} end. Как использовать // указывать нужно сразу все нужные вам Actions в Add через запятую, не по одной. fBroadcast := TBroadcastReceiver.Create(OnReceiveBroadcast); fBroadcast.AddActions([StringToJString(SENT_ACTION)]); << Custom action ------------- // или например сразу несколько Actions fBroadcast.AddActions([TJIntent.JavaClass.ACTION_SCREEN_OFF, TJIntent.JavaClass.ACTION_SCREEN_ON]);
    3 likes
  41. Например так: procedure CreateArhivTables(CreateDatabaseName: string); var TableToCreate: TFDQuery; begin TableToCreate := TFDQuery.Create(nil); TableToCreate.ConnectionName := CreateDatabaseName; try TableToCreate.SQL.Clear; TableToCreate.SQL.Add('create table if not exists Marks(' +' Mark text primary key, ' +' CheckData text);'); TableToCreate.ExecSQL; end;
    3 likes
  42. дополню нужно в OnKeyUp главной формы (не первой) обработать vkHardwareBack и сделать Application.Terminate; чтобы при кнопке Назад, не вернуться на форму загрузки (первую форму)
    3 likes
  43. первая форма - это главная форма приложения только по архитектуре, а совсем не по смыслу поэтому смело делайте первую форму проще некуда и как только загрузится, сразу можно идти с нее на логин, на основную форму, на регистрацию, рекламу показать, куда угодно....
    3 likes
  44. Remote Path неправильно заполнен, должно быть assets\internal
    3 likes
  45. Добрый день. Для воспроизведения медиа файлов необходимо чтобы они физически находились на устройстве. Нужно их "задеплоить", то есть добавить в проект в project - options - deployment. А затем в программе подгрузить с помощью TMediaPlayer.FileName.
    3 likes
  46. 3 likes
  47. кто-то в чатике просил сделать подобное, вот что получилось FMX.AppMinimized.zip сворачивание/разворачивание делается, только после разворота не делается активация формы (не было времени с этим разбираться у меня)
    3 likes
  48. Ну какие под Windows могут быть стандартные средства для чтения файла из другой ОС? Конечно их нету. Делается элементарно. 1. apk - это обычный zip файл. Распаковываете его (в Delphi встроенная поддержка zip - uses System.Zip > TZipFile ), и читаете все что надо. В Total Commander в такие архивы проще заходить без переименования расширения - нажав Ctrl + PgDown 2. Еще проще aapt dump badging myapp.apk Выведет детальную информацию об apk. aapt лежит где то в c:\Users\<user>\Documents\Embarcadero\Studio\18.0\PlatformSDKs\android-sdk-windows\build-tools\25.0.0\aapt.exe Например чтобы сохранил результат в файл: aapt dump badging myapp.apk > mytextfile.txt В первой строчке и будет искомое: package: name='com.embarcadero.MyApp' versionCode='1' versionName='1.0.0' platformBuildVersionName=''
    3 likes
  49. 3 likes
  50. Добрый день! Коллеги, хочу озвучить одну из причин, из-за которой может возникать ситуация " Иногда бывает что при вставке пути в TPath, компонент его отображает некорректно" Дело в том, что существуют сокращения в представлении данных и не все из низ TPath понимает, вот с чем столкнулся: Есть команда 'c' - рисование кривой. не буду вдаваться в подробности, можно найти в интернете описание, скажу только то, что данная команда содержит 6 чисел. В идеале должно быть: сX1 X2 X3 X4 X5 X6 Но очень часто (например в иконках Material Design) можно встретить: c-1.1 0-1.99.9-1.99 2 И на этой строчке парсер TPath падает с ошибкой, так как пытается сконвертировать '-1.99.9' в число, что не верно. В реальности данная запись соответствует двум числам -1.99 и 0.9. Для обхода проблемы я загружаю SVG в рантайме, и сроку пропускаю через корректор: function CorrectSVG(const Value: String): String; var SB : TStringBuilder; I: Integer; C : Char; begin SB := TStringBuilder.Create; try I := 0; for C in Value do begin if C='.' then Inc(I) else if not CharInSet(C, ['0'..'9']) then I := 0; if I=2 then begin SB.Append(' 0.'); I := 0; end else SB.Append(C); end; Result := SB.ToString; finally FreeAndNil(SB); end; end;
    3 likes
This leaderboard is set to Москва/GMT+03:00