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

krapotkin

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

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

  • Посещение

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

    209

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

  1. Like
    krapotkin получил реакцию от sulion в Скорость анимации сцены с большим количеством деталей   
    Удобство и универсальность ВСЕГДА противопоставлены быстродействию
    Бросьте идею использовать компоненты для рисования анимации. Что вы выиграли по сравнению с простым Canvas.DrawBitmap()  на PaintBox ??
    Ничего.
    Зато приобрели просто гигантский оверхед в виде ненужной универсальной начинки компонента TBitmap.
    Потом будут еще проблемы изза того, что не вы сами управляете масштабированием картинки в компоненте.
    Так игру не написать
  2. Like
    krapotkin получил реакцию от sulion в Скорость анимации сцены с большим количеством деталей   
    нет никакой технологии, есть набор Bitmap и рисование этих битмап напрямую на Canvas
    объем памяти ровно такой, что требуется для хранения этих битмапов.
    скорость отрисовки - максимальная, потому что кроме отрисовки вы собсно ничего не делаете вообще)
  3. Thanks
    krapotkin получил реакцию от Саша в Потоки на андроид   
    каждый начинающий разработчик всегда пытается сделать из приложения трекер
    ОС прибьет его в любом случае
    https://habr.com/ru/companies/broadcast/articles/734236/
    https://habr.com/ru/companies/tinkoff/articles/693094/
    https://habr.com/ru/companies/cleverpumpkin/articles/681804/
  4. Like
    krapotkin получил реакцию от antigrav в Параллельный отладчик   
    а вы понимаете в котором потоке выполняется Synchronize() ?
    попробуйте сначала получить ThreadId, а уже потом переходить в ГП и выводить это значение на экран
  5. Like
    krapotkin отреагировална Vladimir Gaivoronsky в ShoesMaster   
    Программа для администрирования обувного цеха. Переписана с VCL на FMX.
    Проверена и оттестирована на Windows (10) Linux (ubunti 21 - 23, openSuse) MacOS (10, 11 intel) на silicon негде проверять и нет SDK.
    Работает с Firebird версии 3 и 5.
    Поддерживает сканеры штрих кодов. 
    Позволяет отследить весь процесс производства: от приемки заказа до отправки в магазин (продажей занимается другая программа) Написана с использованием TMS.FNC. В программе есть несколько тем оформления ( в основном темные, но есть и светлые). Пока еще происходит обкат в нескольких цехах, но скоро  можно будет "пощупать" всем желающим. Также чуть позже будет версия на Android. Требует внешний сервер БД (для MacOS и Android). В макинтоше запустить и настроить firebird очень нетривиально, например сортировка по названиям без учета регистра не реализовано в 3 версии.












  6. Like
    krapotkin отреагировална ComAlex в При нажатии на "Чужие" PUSH моё iOS-приложение закрывается аварийно!   
    Решено!
    Если кому интересно:
    При долгом нажатии на PUSH, активизируется виртуальная клавиатура!
    А у меня навешено событие на OnVirtualKeyboardShown() ...
  7. Like
    krapotkin получил реакцию от antigrav в Параллельный отладчик   
    https://bitbucket.org/vkrapotkin/commonapi/src/master/UVKCommonLog.pas
    log.log('TrqdAttributes LoadFromFolder (' + Attributes.Count.ToString + ')'); в логе
    14:15:13.463 (000013D8) TrqdAttributes LoadFromFolder (5)
    или
    14:15:12.504 (main) Login successful.
  8. Thanks
    krapotkin получил реакцию от antigrav в ProgressBar и потоки   
    не понял вопрос. мы работаем в обработчике одного из событий очереди сообщений в главном потоке.
    событие отрисовки тоже стоит в очереди в главном потоке. закончим обработчик, запустится следующий, произойдет перерисовка.
     
     
  9. Like
    krapotkin получил реакцию от Sergey S в Работа с web камерой   
    скорее всего просто нет реализации.
    UI в Linux же обеспечен совершенно сторонними средствами
    так что вопрос скорее к пакету FMX Linux
     
  10. Like
    krapotkin получил реакцию от Sergey S в Создание Dockable формы   
    floatingTabs.zip
    вот.  примерно то же самое надо делать при mousedragover
  11. Like
    krapotkin получил реакцию от Sergey S в как отловить перемещение формы по экрану, Windows   
    TForm1 = class(TForm)
      private
      public
        procedure SetBoundsF(const ALeft: Single; const ATop: Single; const AWidth: Single; const AHeight: Single); override;
      end;
  12. Like
    krapotkin получил реакцию от Sergey S в Создание Dockable формы   
    ничего там не из коробки.
    и в хроме тоже сами писали) 
    TabControl в чистом виде много чего не поддерживает.
    Зато поддерживает главное - можно табы убрать вообще. И над ним сделать панель, которая будет вести себя как угодно, в том числе анимированно раздвигая элементы во время Drag Over
    А после дропа выстроить табы. или фреймы, или что угодно. вообще не проблема
  13. Like
    krapotkin получил реакцию от Sergey S в Создание Dockable формы   
    я так понимаю, вопрос упирался в красивый драг, а не способ отсоединить таб от родителя ?
  14. Like
    krapotkin отреагировална Slym в Линковка Kotlin (Котлин) библиотек в Delphi   
    Линковка Kotlin (Котлин) библиотек в Delphi, как делаю:
    Хедеры линкуемых библиотек обычно громадны описанием всех типов...
    Я обычно делаю свой jar на java в нем линкую зависимости и наружу для дельфи оставляю один объект с простыми функциями.
    Хедер дельфи получается компактным и понятным:
    package com.MyCompany.evotor; public interface J2DCallback { void Log(String str); String Trans(String str); String GetValue(String name); void SetValue(String name, String value); Activity GetActivity(); Context GetContext(); } public class FiscalCoreConnection { final private Global Instance; public FiscalCoreConnection(J2DCallback aj2d) throws NullPointerException { Instance = new Global(aj2d); } public String SendJSON(String JSON){ try{ return Instance.SendJson(JSON); } catch (Exception e) { return FiscalCoreException.MakeJson(e); } } } type J2DCallbackClass = interface(IJavaClass) ['{856654D5-7939-44DF-ACD5-E2EF8C6D3AA4}'] end; [JavaSignature('com/MyCompany/evotor/J2DCallback')] J2DCallbackIntf = interface(IJavaInstance) ['{025B14E9-C041-4105-9E85-83CC127CC340}'] procedure Log(str:JString); cdecl; function Trans(str:JString):JString; cdecl; function GetValue(name:JString):JString; cdecl; procedure SetValue(name:JString; value:JString); cdecl; function GetActivity():JActivity; cdecl; function GetContext():JContext; cdecl; end; TJ2DCallbackImp = class(TJavaGenericImport<J2DCallbackClass, J2DCallbackIntf>) end; [JavaSignature('com/MyCompany/evotor/FiscalCoreConnection')] JFiscalCoreConnection = interface(JObject) ['{5797747D-D61D-4EF6-94F7-5E8994545CC2}'] function SendJSON(JSON:JString):JString; cdecl; end; JFiscalCoreConnectionClass = interface(JObjectClass) ['{81782882-DFCF-4FA9-BD37-02CCCF2409EA}'] function init(j2d : J2DCallbackIntf) : JFiscalCoreConnection; cdecl; end; TJFiscalCoreConnection = class(TJavaGenericImport<JFiscalCoreConnectionClass, JFiscalCoreConnection>) end; TJ2DCallback = class(TJavaLocal, J2DCallbackIntf) public procedure Log(str:JString); cdecl; function Trans(str:JString):JString; cdecl; function GetValue(name:JString):JString; cdecl; procedure SetValue(name:JString; value:JString); cdecl; function GetActivity():JActivity; cdecl; function GetContext():JContext; cdecl; end; Все зависимости в build.gradle:
    dependencies { implementation 'com.github.evotor:integration-library:v0.4.50' implementation 'com.google.zxing:core:3.4.0' } В Дереве External Libraries забираем jarы зависимостей

    ПКМ Show in Explorer. Копируем в папку своего проекта и даем осознанное имя.
    Там же забираем kotlin-stdlib

    ПКМ Show in Explorer. Копируем в папку своего проекта и даем осознанное имя.
    Но в kotlin-stdlib.jar есть "лишний" файл kotlin-stdlib-1.5.10.jar\META-INF\versions\9\module-info.class
    Открываем архиватором и удаляем файл или всю папку versions

    Почти все готово... Но котлин еще и посыпан сахаром и не хочет Дельфей dexится, хочет -min-sdk-version=26
    Поможем Delphi:
    Ищем CodeGear.Common.Targets, у меня он в "C:\Program Files (x86)\Embarcadero\Studio\21.0\bin"\
    Ищем в нем --output, и перед ним вставим все про sdk. У меня получилось так:
        <DxCmd>PATH $(JDKPath)\bin;$(PATH); %26 set JAVA_HOME=$(JDKPath)%26 "$(JavaDxPath)" --dex --min-sdk-version=26 --output=</DxCmd>
    Далее цепляем все jar в проект

    Либа производителя, Либа своя обертка, и котлин
    Иии собираем!

    Если есть еще зависимости делаем аналогично:
    находим jar, выпиливаем META-INF\versions\9\module-info.class, линкуем в проект и собираем...
    Не все зависимости используются и нужны, поэтому добавляем поштучно до тех пор пока не заведется.
  15. Thanks
    krapotkin получил реакцию от Саша в TLocationSensor - километраж   
    тут написано, что проблема сложная и не решается в лоб
    https://android-developers.googleblog.com/2020/12/improving-urban-gps-accuracy-for-your.html
    можно попробовать оставить только  Manifest.permission.ACCESS_FINE_LOCATION  и исключить Manifest.permission.ACCESS_COARSE_LOCATION
    чтобы попадали только данные со спутников 
    но вот тут написано, что в современных ОС вы должны это запрашивать, и не факт что получите
    https://developer.android.com/training/location/permissions
  16. Like
    krapotkin отреагировална Dmitry_4501 в Рисование на неклиентской часть окна   
    Оконные сообщения в FMX можно обрабатывать так же как и в VCL.
    Достаточно в вашу WindowProc добавить это:
    var Message: TMessage; Message.Msg := uMsg; Message.WParam := wParam; Message.LParam := lParam; Message.Result := 0; frm.Dispatch(Message); Тогда потом можно будет смело написать что-то вроде
    procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT; 
    И оно будет работать.
     
  17. Thanks
    krapotkin получил реакцию от Hevard в Размер приложения   
    В RTL за годы тоже произошло 100500 изменений и добавлений. Функционал форм поменялся. Добавились стили в VCL. Все это отразилось на размере.
    Но я по-прежнему не вижу проблем. Вот питонные программы тянут почти 500м самого питона. Сишарп и другие - гигабайты дотнета. И ничего, никто не морщится даже.
  18. Like
    krapotkin отреагировална Aptyp в Рисование на неклиентской часть окна   
    В общем рисовать как оказалось на неклиентской части формы вообще не проблема. Но я делаю форму Acrylic (Полупрозрачную с размытым фоном), и вот тут появляются проблемы. Если рисовать обычным способом, как на Canvas, то цвет получается тоже полупрозрачный. Путём экспериментов выяснил, что относительно нормально рисуется таким методом:
    uses Winapi.Windows; BitBlt( GetWindowDC( WindowHandleToPlatform( Form.Handle ).Wnd ), 0, 0, BitMap.Width, BitMap.Height, BitMap.Canvas.Handle, 0, 0, cmMergePaint ); В обычном случае последний аргумент должен быть cmSrcCopy, но с ним тоже получается полупрозрачная картинка. Помогает только cmMergePaint, НО! таким способом рисуется картинка с инвертированными цветами. То есть перед таким рисованием нужно её самому инвертировать.
    Следующий шаг – это рисовать png картинку, так как редко надо рисовать просто непрозрачную прямоугольную картинку. С 32-битным TBitMap у меня пока что-то не получилось, а вот TPngImage вполне хорошо рисуется.
    uses FMX.Platform.Win, Winapi.Windows, Vcl.Graphics, Vcl.Imaging.pngimage; function TForm1.WinHandle: HWND; begin Result := WindowHandleToPlatform( Self.Handle ).Wnd; end; procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var ACanvas: Vcl.Graphics.TCanvas; png: TPngImage; begin ACanvas := Vcl.Graphics.TCanvas.Create; ACanvas.Handle := GetWindowDC(Self.WinHandle); png := TPngImage.Create; png.LoadFromFile('C:\Image.png'); try PatBlt( ACanvas.Handle, 0, 0, png.Width, png.Height, cmBlackness ); png.Draw( ACanvas, Rect( 0, 0, png.Width, png.Height ) ); finally ReleaseDC(Self.WinHandle, ACanvas.Handle); ACanvas.Handle := 0; ACanvas.DisposeOf; png.DisposeOf; end; end; Но и тут есть подводные камни. Метод TPngImage.Draw, если заглянуть в его код становится понятно, что рисует он поверх того, что уже нарисовано и картина накладывается одна на другую быстро теряя прозрачность полупрозрачных пикселей. Поэтому перед её рисованием нужно стереть, что было до этого, с чем отлично справляется функция Winapi.Windows.PatBlt. Но таким образом появляется мерцание.
    А так же я ещё не нашёл, как отловить в FireMonkey отловить у формы событие WM_NCPAINT. Пока что навесил рисование на событие формы OnPaint, но оно не стабильно работает в данном случае и бывает, когда картинка стирается и не рисуется, пока не наступит надобность перерисовать клиентскую часть формы.
  19. Like
    krapotkin отреагировална OnePeople в Съезжают размеры и положение контролов в Андроиде, в винде всё нормально.   
    У меня 11, и без него размер editа зависит от размера шрифта и ни какими свойствами не правиться
  20. Like
    krapotkin получил реакцию от Hevard в Размер компилируемого файла   
    что за детский сад
    на андроиде приложения весят 400К и при этом используют библиотеки Java на 2G
    это как - маленькие или большие приложения?
    то же с .NET
    Приложение с пустой формой тащит за собой весь функционал, который вы можете использовать, при этом не требуя установки дополнительных run-time библиотек, чем, собсн, всегда и хороша была Делфи
    mp3 файл весит 8-10 мб. а 5 сек видео "опы - 120.  Не видел я чтобы кто-то плакал по этому поводу
  21. Like
    krapotkin получил реакцию от Letter в Запись звука как на диктофоне   
    не думаю, что это сделано путем установки некоей "громкости"
    когда у нас есть оцифрованный сигнал, то дальше уже идет цифровая обработка этого сигнала
    например, нормализация, или компрессия https://habr.com/ru/articles/379395/
    операция не очень сложная, но нужно поискать описания хороших алгоритмов и поэкспериментировать с их настройками 
     
  22. Like
    krapotkin получил реакцию от Letter в Запись звука как на диктофоне   
    https://docwiki.embarcadero.com/CodeExamples/Sydney/en/FMX.AudioRecPlay_Sample
     
  23. Like
    krapotkin отреагировална Martifan в анимация не анимирует по андроидом   
    Ваши проблемы с анимацией могут быть связаны с несколькими вещами.
    Во-первых, стоит отметить, что метод AnimateFloatWait помечен как устаревший, и рекомендуется использовать Ani.TAnimator вместо него.
    Ani.TAnimator.AnimateFloat создает и запускает объект TFloatAnimation. Он устанавливает свойства анимации и начинает анимацию. Однако стоит заметить, что если объект не видим в момент вызова этого метода, анимация не запускается: анимация создается, но не выполняется.
    Вторым фактором может быть то, как Android обрабатывает анимацию. Android может иметь разные характеристики производительности и отображения, которые влияют на то, как анимация выполняется на устройстве.
    Также, есть пример использования анимации в Delphi для Android, который может быть полезен. Get access to over 100 FireMonkey cross platform samples for Android, IOS, OSX, Windows, and Linux!
    Следовательно, я бы посоветовал начать с применения Ani.TAnimator.AnimateFloat вместо AnimateFloatWait, и убедиться, что объект, который вы пытаетесь анимировать, видим на экране во время начала анимации. Если проблема продолжает сохраняться, вам может потребоваться более детальное исследование спецификаций Android и как он обрабатывает анимацию в Delphi.
  24. Like
    krapotkin получил реакцию от AngryOwl в Размер компилируемого файла   
    что за детский сад
    на андроиде приложения весят 400К и при этом используют библиотеки Java на 2G
    это как - маленькие или большие приложения?
    то же с .NET
    Приложение с пустой формой тащит за собой весь функционал, который вы можете использовать, при этом не требуя установки дополнительных run-time библиотек, чем, собсн, всегда и хороша была Делфи
    mp3 файл весит 8-10 мб. а 5 сек видео "опы - 120.  Не видел я чтобы кто-то плакал по этому поводу
  25. Like
    krapotkin отреагировална Martifan в Как разрешить имя хоста в ip адрес на Андроиде?   
    В контексте Delphi, вы можете использовать Indy компоненты для этого. TIdStack имеет метод ResolveHost() который может быть использован для разрешения имени хоста.
     
    var GStack: TIdStack; begin GStack := TIdStack.Create; try ShowMessage(GStack.ResolveHost('localhost', Id_IPv4).ToString); finally GStack.Free; end; end; Учтите, что разрешение имени хоста в IP-адрес не гарантирует, что хост будет доступен для подключения. Если имя хоста не может быть разрешено, будет вызвано исключение UnknownHostException.
    Также обратите внимание, что операции с сетью, такие как разрешение имени хоста, могут быть медленными, и рекомендуется выполнять их в фоновом потоке, чтобы не блокировать главный поток приложения.
    По поводу вашей проблемы с локальной сетью - возможно, имя хоста, которое вы пытаетесь разрешить, не зарегистрировано в локальном DNS. В этом случае, вы можете попробовать использовать полное доменное имя (FQDN) хоста, или использовать прямой IP-адрес, если он известен.
    Если метод разрешения имен не работает для локальной сети, вероятно, проблема связана с настройками DNS в вашей локальной сети. Имена хостов в локальной сети обычно разрешаются с помощью механизма DNS, поэтому если ваш DNS сервер или файлы hosts не содержат соответствующих записей для имени хоста, который вы пытаетесь разрешить, то метод разрешения имен вернет ошибку.
    Если вы контролируете настройки DNS в вашей локальной сети, вы можете добавить соответствующие записи для всех хостов, которые вы хотите разрешать.
    Кроме того, некоторые системы поддерживают механизмы обнаружения служб на локальной сети, такие как mDNS (Multicast DNS), который используется в протоколе Zeroconf/Bonjour. Если ваши устройства и приложения поддерживают mDNS, вы можете использовать имена хостов с суффиксом .local для разрешения имён в локальной сети.
    Пожалуйста, учтите, что разрешение имён хостов в IP-адреса - это сложная область, которая зависит от многих факторов, включая конфигурацию вашей сети, настройки DNS, поддержку протоколов обнаружения служб и т.д. Если вы столкнулись с проблемами, вам может потребоваться обратиться к системному администратору или к специалисту по сетям для получения помощи.
×
×
  • Создать...