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

Kitty

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

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

  • Посещение

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

    16

Активность репутации

  1. Like
    Kitty отреагировална Евгений Корепов в Как получить версию APK-файла под Win32?   
    Вот так напрямую в память:
    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;
  2. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в [Windows] Сворачивание приложение   
    А ну значит в Берлине что-то сломали, работает и отлично.
  3. Like
    Kitty отреагировална ENERGY в Как получить версию APK-файла под Win32?   
    Ну какие под 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=''
     
  4. Like
    Kitty отреагировална Alex7wrt в Загрузка аудиофайлов в MediaPlayer   
    Добрый день.
    Для воспроизведения медиа файлов необходимо чтобы они физически находились на устройстве. Нужно их "задеплоить", то есть добавить в проект в project - options - deployment. А затем в программе подгрузить с помощью TMediaPlayer.FileName.
  5. Like
    Kitty отреагировална ENERGY в Обрезание текста в TListBox   
    Установите - Stylelookup у каждого Item'a -  listboxitemnodetail или listboxitembottomdetail
    Detail - обозначает что появляется еще одна дополнителная текстовая строка, bottom detail переводится как "детали внизу". Добавить текст в нее можно через инспектор - кликните на  нужный listitem >  ItemData > Detail
    listboxitemleftdetail - содержит еще одну текстовую панельку справа, которая перекрывает  основной текст. 
    Вы можете сделать эти пункты в своем стиле - добавить туда визуальные компоненты, такие как Tswitch, кнопки итд. 
    Для этого, - Нажмите правой кнопкой мыши (ПКМ) по листбоксу - Add ListBoxitem, выберите для этого Item'a нужный стиль, в Stylelookup, на основе которого хотите сделать свой.
    Далее, ПКМ по Item - Edit Custom Style. Выделите в инспекторе ListBoxItem1Style1 - это ваш новый стиль, можете переименовать его в StyleName на нужное вам имя. Это имя потом указывайте в StyleLookup каждого item'a.
    Теперь можно переносить мышкой компоненты на этот шаблон. Имена меняйте в StyleName. По этим именам потом можно обращаться к ним таким образом:
     vItem.StylesData['descript'] := 'text';
     vItem.StylesData['details'] := 'Text';
     vItem.ImageIndex := 5;
    Чтобы отображался картинка при помощи ImageIndex в таком собственном Item е - нужно кинуть TGlyph  и назвать Stylename  как 'glyphstyle'.
     
     
    TListBox довольно медленный компонент, и нужен в основном для небольших списков (напр. настройки) или там, где используются Items  с контролами. Для динамических списков используйте TListView.
     
     
  6. Like
    Kitty отреагировална Andrey Efimov в Остановить таймер, когда приложение сворачивается   
    Вот сделал таблицу с событиями. Добавил в статью Очередь событий Delphi приложения на Android
    И получилось, что отслеживать сворачивание можно по:
    OnSaveState
    aeWillBecomeInactive
    EnteredBackground
    Разворачивание:
    WillBecomeForeground

  7. Like
    Kitty отреагировална Andrey Efimov в Остановить таймер, когда приложение сворачивается   
    Не совсем, если отслеживать все возможные варианты сворачивания приложения (включая выход из приложения), то лучше использовать:
    TApplicationEvent.EnteredBackground
    Для отслеживания разворачивания приложения достаточно:
    TApplicationEvent.WillBecomeForeground
     
    aeBecameActive и aeWillBecomeInactive отрабатывают только в определённых случаях.
     
    p.s. Надо табличку оформить, чтобы было понятно, когда и для чего могут понадобится те или иные события.
  8. Like
    Kitty отреагировална krapotkin в Остановить таймер, когда приложение сворачивается   
    https://community.embarcadero.com/blogs/entry/handling-ios-application-events-39450
  9. Like
    Kitty отреагировална Andrey Efimov в Остановить таймер, когда приложение сворачивается   
    Очередь событий Delphi приложения на Android Жизненный цикл мобильного приложения
  10. Like
    Kitty отреагировална Brovin Yaroslav в Delphi for Linux Boot Camp Replay   
    Just in case you missed the fantastic Delphi for Linux Boot Camp by Craig Chapman this week here, or you want to watch it again, here is the replay that includes Marco Cantu's Q&A at the end.
    This Boot camp covers the setup of a Linux development environment for building Linux applications with Delphi. We’ll look at hello world, debugging linux applications, deploying apache2 modules using WebBroker, and accessing a MySQL database using FireDAC. The penguins are coming, be prepared!
    Просмотр полной статьи
  11. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в TWebBrowser   
    из TWebBrowser никак вроде
    можно через THTTPClient и метод Get(url)
  12. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в Окончательная точка в вопросе расчета высоты TListViewItem (TListItemText)   
    у меня нет проблем с подсчетом высоты текста, в ModernLV есть код без костылей и без загрузки шрифта
    function getItemTextHeight(const AItem: TListItemText; const aWidth: Single = 0): Integer; // ZuBy function getItemTextButtonHeight(const AItem: TListItemTextButton; const aWidth: Single = 0): Integer; // ZuBy function getItemTextWidth(const AItem: TListItemText; const aHeight: Single = 0): Integer; // ZuBy function getItemTextButtonWidth(const AItem: TListItemTextButton; const aHeight: Single = 0): Integer; // ZuBy в нескольких проектах используется, iOS, Android, Windows
  13. Like
    Kitty получил реакцию от Vitaldj в [Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2]   
    Нет. Просто создала учётную запись и проект. На форму кинула компонент kinvey и заполнила его свойства в инспекторе объектов. 
  14. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в [Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2]   
    Токен - это идентификатор который отправил сервер (APNs/GCM), он используется для связи приложения и серверной части. Кинвей на своей стороне хранит ваши токены, чтобы по ним отправить пуш. Иначе другого варианта нет. Это классно, если у вам не требуется делать выборку по определенным критериям.
    Я такие сервисы не использую, т.к. часто в пушах присылаю техническую информацию, которая обычным (не всем) пользователям не должна быть показана. А для того чтобы сделать подобное, нужна своя база с токенами и другой инфой о владельце девайса.
    Отослать пуши по критерию:
    Обновление приложения на определенной платформе Техническая информация по типу учетной записи (админ, модер, пользователь и тд..) Поздравление с днем рождения, предоставление скидок Уведомление о недостаточном балансе и тд.. примеров масса Я слабо представляю такую реализацию через сервис кинвей и подобным которые предоставляются из коробки в RAD.
    Статья была написана, чтобы показать именно НАСТРОЙКУ через сервис Firebase, и никак не претендует на полное описание работы с пушами в целом.
    Код на делфи был показан, чтобы убрать зависимость от сервисов из коробки
    Код на PHP был показан, чтобы можно было реализовать функционал на своём сервере
    Пару слов было сказано о правильном сохранении в БД, а вот бизнес логика уже у каждого приложения своя.
     
  15. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в [Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2]   
    Принцип работы Push на разных ОС не отличается
    если коротко, не обращаем внимание на OS и термины (для ознакомления прошу сюда)
    Описание технологии GCM и APNs  хорошо расписаны на хабре, гораздо более профессионально. Я уж точно ничего нового не внесу.
  16. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в [Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2]   
    описание терминов и работы пуш уведомлении разжован в интернете чуть более чем полностью) и это не совсем относится к FMX, так что я не стал тратить на это время, увы его не так много как хотелось бы)
  17. Like
    Kitty отреагировална ENERGY в [Статья] Как конвертировать растровую картинку в векторный TPath Firemonkey. How to convert a bitmap image (png, jpeg, bmp) into a Firemonkey vector TPath.   
    Как конвертировать растровую картинку в векторный TPath Firemonkey.
    How to convert a bitmap image (png, jpeg, bmp) into a Firemonkey vector TPath. Manual.

    Плюсы векторных изображений: 
    Можно изменять размер избражения в любую сторону, уменьшать и увеличивать, без потери качества. Картинка всегда будет с четкими краями, без размытия по краям и квадратиков. Можно легко изменять в RunTime цвет заливки и обводной рамки, изменяя цвета в полях Fill и Stroke компонента TPath. Заливка как правило одна - это цвет из свойства Fill Color. Но ... цвет может быть и градиентом из множества цветов, который можно указать в диспетчере объектов, там же можно загрузить и Bitmap как текстуру в качестве заливки.  Можно анимировать изображение, изменяя вышеуказанные свойства, а также направление градиента, размер, толщину обводной линии итд. Тоже можно менять и для Stroke свойства - обводной рамки.
    Минусы:
    Получаемое изображение упрощенное. Т.к. оно может содержать только один путь (Path) и одну плоскость.
    Возможно получиться скомбинировать множества TPath, положив их друг на друга с прозрачностью. 
    Векторное изображение вычисляется и рисуется "в живую", поэтому потребуется больше ресурсов, чем при отрисовке обычных растровых картинок png, jpg, bitmap.
    Что означает нагрузку на аппаратную часть, замедление работы программы и более быструю разрядку мобильного устройства.
    Поэтому если и использовать подобные векторные изображения, то в случае если нужно отобразить большие картинки-символы на разных экранах (не иконки) - например на маленьком экране телефона, и на большом планшете и на еще большем Desktop экране. 
    Хотя в примере \Samples\Object Pascal\Multi-Device Samples\User Interface\CustomListBox\CustomListBox.dproj используется векторная иконка\чекбокс очень простая. 
     
    Преимущества векторного изображения наглядно:

     
    Ингредиенты: 
    1. Векторный редактор, я взял бесплатный inkscape, который можно скачать здесь . 
    2. Картинка. Желательно чтобы картинка была с большим разрешением, от 300px и больше. Если взять изображение маленького размера, например 48x48 или 64x64, то контуры получатся не такими точными. И хотя inkscape все равно применит сглаживание контуров, и квадратиков вы не увидите, обводные линии могут получиться другой формы, к примеру более жирными или могут слиться с другими линиями.
    Исходное изображение лучше брать в формате PNG, т.к. JPEG оставляет артефакты в виде точек, в итоге программа при трассировке может захватить и их, что не желательно. Конечно же если другого исходника нету, то смысла конвертировать jpg в png нет - качество не улучшится.
    Основной метод конвертации - это трассировка изображения, - когда алгоритм ищет края и обводные линии, и на основе их рисует свои. Потому качественные результаты получаться если брать изображение с одной плоскостью, без теней, градиентов и деталей, в стиле Windows 8\10 или Android. Т.н. Flat (плоский) icon. 
    3. IDE RAD Studio Delphi или С++

    Приступим. 
    Запускаем incscape. 
    Размер исходной png картинки 668x720.

    1. Меню File > Open - указываем путь. Иконка загрузилась.
    2. Нажимаем левой кнопкой мыши на картинку, чтобы она выделилась.
    3. Меню Path > Trace Bitmap. Сразу выберите чекбокс Live Preview (см скриншот).
    Здесь есть разные методы, но нам нужна секция Single Scan: Creates a Path. Методы нужно подбирать визуально, "на глаз". 
    Можно также использовать и секцию Multiply Scans, а затем скомбинировать пути в один (Path > Combine), т.к. нам нужен один путь, и один набор. Путь (Path) это набор инструкций о том как и сколько рисовать линий-векторов. Для нашего конкретного случая, этой конкретной иконки, оптимальный вариант Color Quantization и количество цветов = 2.

     
    4. Нажимаем OK и закрываем окно. Появилось наше изображение залитое черным цветом - это и есть наша векторная картинка. 
    Стоит заметить что прямо под ним лежит наше исходного изображение. Чтобы его удалить нужно отодвинуть мышкой векторное изображение, выделить исходную картинку и удалить ее клавишей Delete.  
    5. Вы можете отредактировать пути, выбрав в левой панели инструмент Edit Paths By nodes (F2) или добавить фильтры\эффекты в меню Path > Path Effects. В данном примере я ничего не менял.
    6. File Save As > inkscape SVG .
    7. Открываем полученный SVG файл в блокноте или в Lister тотал коммандера. Ищем массив чисел, который обычно начинается со строчки "<path". Находим эту строчку, нам нужно набор символов, который идет после буквы "d=", к примеру d="m 397.33334,c -48.1 ...-0.326 -1.64129,-0.66405 z" и копируем все, что внутри кавычек в буфер.
    8. Далее в RAD IDE кидаем на форму TPath. В Object Inspector WrapMode устанавливаем в Fit, и в поле Data вставляем из буфера наш код.
    9. Меняем Fill и Stroke цвета на нужные нам значения (здесь я установил желтый цвет и увеличил толщину обводки (Stroke)). 

     
    Еще пару примеров. 
    Дерево - параметры Brightness Cutoff, Threshold 0.370 . Как видите здесь оптимальнее подходит метод Brightness Cutoff.  Здесь исходная png картинка - это дерево черного цвета, я ее распознал, и затем добавил в TPath, а в свойстве Fill указал градиент от черного до зеленого.
    Наушники - Edge Detection 0. Конечно конкретно в этом случае нужно подчищать изображение.

     

    Иногда бывает что при вставке пути в TPath, компонент его отображает некорректно, если снова зайти в DATA TPath, то окажется что часть данных потеряна. 
    Что исправить эту ситуацию, нужно путь упростить. Это значит что после шага 4, нужно выбрать в incscrape меню Path > Simplify, затем снова сохранить файл. 
    Правда Simplify в incscrape работает не очень хорошо, часто загругляет прямые участки. Лучше делать Simplify в Adobe Illustrator.
     
    Статья опубликована на сайте fire-monkey.ru и возможно будет изменяться и дополняться.
    Автор: ENRGY  
    24. 02. 17 
     
  18. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в [Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2]   
    Ссылка: http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html
    Автор: Зарипов Равиль @ZuBy
    Описание: Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2]
    В предыдущей  части , я рассказывал как сделать настройку пуш уведомления в консоли Firebase, в этой я покажу код на Delphi и серверную часть на PHP
    https://github.com/rzaripov1990/PUSHTestFCM
  19. Like
    Kitty отреагировална Rusland в Дублирование проекта на телефоне   
    Да, будет две папки
  20. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в [Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 1]   
    обязательно делать разные проекты на ios, т.к. при отправке пушей пакет указывается (два одинаковых пакета не может быть на одном устройстве)
    Для андроид возможно сделать скорей всего, но смысла не вижу никакого
  21. Like
    Kitty отреагировална Andrey Efimov в [Android] Как задать максимальный размер для главной формы.   
    На Андроиде, главная форма всегда растягивается на весь экран (если точнее, то на размеры Активити), задать ей определённый размер нельзя.
  22. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в [Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 1]   
    Это немного не в тему статьи, тут больше геопозиция
  23. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в [Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 1]   
    В ОС есть специальные сервисы которые делают "подписку" вашего приложения на уведомления.
    Нам же из проекта нужно просто дать им понять, что мы хотим получать уведомления.
    Если запущено, то уведомление сразу поступает в приложение
    Если не запущено, то отображается в шторке
  24. Like
    Kitty отреагировална Равиль Зарипов (ZuBy) в [Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 1]   
    Ссылка: http://blog.rzaripov.kz/2017/02/firebase-android-ios.html
    Автор: Зарипов Равиль @ZuBy
    Описание: Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS
  25. Like
    Kitty получил реакцию от MaratBest в krapotkin и Равиль Зарипов   
    Даже не знаю или в правильный раздел форума пишу. Я, например, хочу поблагодарить в своей теме - krapotkin и Равиль Зарипов за очень полезные ответы. Реально помогают решить вопросы. Спасибо.
    Хотя все они паскалисты, все же удается иногда получить код на С++ со стороны. Очень в этом помогает автор Indy rlebeau, например эту статью: Статья 
    он переводит в С++ тут: C++  и никто бы другой не помог. В этом плане тяжело, без него и никак вопрос не решить.
    А этот форум это симбиоз ума и решений! Спасибо Ярославу за реализацию и хоты бы одного спеца по С++ как по Дельфи и - вот оно счастье.
    Спасибо!
     
     
×
×
  • Создать...