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

krapotkin

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

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

  • Посещение

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

    210

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

  1. Like
    krapotkin отреагировална пост Andrey Efimov в Модальное окно позади формы приложения   
    Да, вот прямо сейчас проверял, модальная форма перестаёт проваливаться под основную. На всякий случай, Delphi 12.2.
  2. Like
    krapotkin получил реакцию от Barbanel в Модальное окно позади формы приложения   
    ShowModal же, не Show. Соответственно BringToFront() не выполнится
  3. Like
    krapotkin отреагировална пост Andrey Efimov в Модальное окно позади формы приложения   
    Увидел эту тему и не мог понять, почему я не сталкивался с такой проблемой в своём приложении, которое почти для всех форм использует режим модального окна. Решил покопаться в официальной жире. Есть там тикет (RSS-1714) с описанием похожей проблемы и демкой. В общем, там дело в использовании StyleBook. Если установить UseStyleManager = False, то проблема исчезает, правда вместе с проблемой исчезает и стилизация окна  Но может как то поможет вам в решении вашей проблемы.
  4. Like
    krapotkin отреагировална пост pan в Как я победил TCameraComponent   
    Была задача сохранять надписи с приборов, т.е. сохраняется центральная часть фото, причём для прицеливания на экран выводится тоже только часть изображения с камеры, соответствующая видимой части экрана.
    Начитавшись форумов о тормозах, решил что CameraComponent.Quality:=TVideoCaptureQuality.LowQuality это мой вариант, но в процессе отладки заметил, что если в одной процедуре деактивировать CameraComponent и через пару действий снова активировать, тормоза пропадают и на MediumQuality.
    Потанцевал с бубном в этом направлении и получил несколько правил для комфортной работы CameraComponent:
    1. Включение камеры нужно выполнять, когда закончилась подготовка экрана. Если например включается страница TabControl, на которую выводим изображение с камеры, то в этой процедуре нельзя включать камеру, нужно перенести это действие в Application.OnIdle:
    Application.OnIdle:=CameraActivate; //CameraComponent.Active:=true;
    procedure TFormApp.CameraActivate(Sender: TObject; var Done: Boolean);
    begin
      Done:=true; Application.OnIdle:=nil; CameraComponent.Active:=true;
    end;
    2. Если включен автофокус CameraComponent.FocusMode:=TFocusMode.ContinuousAutoFocus;, после включения камере надо дать время потупить (пропустить несколько CameraComponentSampleBufferReady):
    procedure TFormApp.CameraComponentSampleBufferReady(Sender: TObject; const ATime: TMediaTime);
    begin
      TThread.Synchronize(TThread.CurrentThread, CameraComponentSampleBufferReadySync);
    end;
    procedure TFormApp.CameraComponentSampleBufferReadySync;
    begin
      if CameraActivateStep>0 then CameraActivateStep:=CameraActivateStep-1 else
      begin
        CameraComponent.SampleBufferToBitmap(CameraBitmapFull,true);
        with ImagePositionImg.Bitmap.Canvas do if BeginScene then
        try
          DrawBitmap(CameraBitmapFull,RectScreenOnCamera,RectScreenOnScreen,1,true);
          DrawRect(RectAimOnScreen,1);
        finally
          EndScene;
        end;
      end;
    end;
    Я до конца так и не понял, нужен ли этот Synchronize, в примере эмбры на паскале он был а на си нет...
    3. Если камера затупила во время работы, нужно сделать перезапуск в одной процедуре:
    CameraComponent.Active:=false; CameraComponent.Active:=true;
    Вдруг кому поможет... Это была Delphi 11.3
  5. Thanks
    krapotkin получил реакцию от antigrav в Конфигурация сборки   
    в каждую конфигурацию можно прописать набор CONDITIONAL DEFINES
    и в коде использовать IFDEF
  6. Like
    krapotkin отреагировална пост Dmitry_4501 в Ошибка сборки программы под RedOS (cannot find -lgcc_s).   
    В общем. Я решил тоже установить RedOS. Установил на виртуалку.

    Собрал SDK в Delphi. Попробовал собрать проект - не получилось
    Тогда я начал искать в сети решения. Нашел как установить gcc и прочие утилиты и библиотеки для разработки. (при помощи команды 
    dnf groupinstall "Development Tools" После установки я решил обновить SDK при помощи кнопки Update Local File Cache
    По итогу ничего не получилось. Тогда я решил при помощи Beyond Compare сравнить файлы и папки моих SDK (один для RedOS не работающий и второй для Ubuntu полностью рабочий). Я заметил различие в том что в SDK для RedOS отсутствовала папка gcc. Я полез искать эту папку в самой RedOS и нашел её, но почему-то PAServer её не передал во время создания SDK.
    Зайдя в папку я нашел причину проблемы.
    Для Ubuntu папка с gcc называется вот так - x86_64-linux-gnu
    А для RedOS папка с gcc называется вот так - x86_64-redsoft-linux
    Вот и вся причина. PAServer ничего не знает ни о какой x86_64-redsoft-linux и поэтому при создании SDK её не копирует. Отсюда и ошибка сборки проекта на стадии линковки.
    В общем, решил эту проблему самым простым способом - создал символическую ссылку
    ln -s ./x86_64-redsoft-linux ./x86_64-linux-gnu А затем ещё раз в Delphi нажал на кнопку Update Local File Cache
    После того как процесс обновления файлов SDK завершился я попробовал собрать проект и...

     
    Краткое руководство как получить рабочий SDK для RedOS.
    1. Загружаем PAServer в систему
    2. Выполняем команду 
    dnf groupinstall "Development Tools" 3. В терминале переходим по пути из / в /usr/lib/gcc
    4. Создаем символическую ссылку ln -s ./x86_64-redsoft-linux ./x86_64-linux-gnu
    5. В Delphi создаем\обновляем (при помощи Update Local File Cache) SDK для RedOS
    Готово
  7. Like
    krapotkin отреагировална пост OnePeople в Android: сканирование и подключение к WiFi   
    Так у меня его нет) Себе делал callback для поиска количества спутников. Пишите на java callback (GnssStatusCallback.rar)
    Через codex генерируете jar файл, добавляете его себе в проект в Libraries
    Пишите объявления методов (Androidapi.JNI.GnssStatusCallback.rar)
    Создаем класс
    type TGnnsStatusCallbackDelegate = class(TJavaLocal, JGnssStatusCallbackDelegate) private class var FConnectivityManager: JConnectivityManager; private FCallback: JGnssStatusCallback; protected public procedure onFirstFix(ttffMillis: Integer); cdecl; procedure onSatelliteStatusChanged(status: JGnssStatus); cdecl; procedure onStarted; cdecl; procedure onStopped; cdecl; public constructor Create(); end; constructor TGnnsStatusCallbackDelegate.Create; begin inherited Create; FCallback := TJGnssStatusCallback.JavaClass.init(TAndroidHelper.Context, Self); end; GnnsStatusCallbackDelegate := TGnnsStatusCallbackDelegate.Create; Androidapi.JNI.GnssStatusCallback.rar GnssStatusCallback.rar
  8. Like
    krapotkin получил реакцию от sulion в Скорость анимации сцены с большим количеством деталей   
    Удобство и универсальность ВСЕГДА противопоставлены быстродействию
    Бросьте идею использовать компоненты для рисования анимации. Что вы выиграли по сравнению с простым Canvas.DrawBitmap()  на PaintBox ??
    Ничего.
    Зато приобрели просто гигантский оверхед в виде ненужной универсальной начинки компонента TBitmap.
    Потом будут еще проблемы изза того, что не вы сами управляете масштабированием картинки в компоненте.
    Так игру не написать
  9. Like
    krapotkin получил реакцию от sulion в Скорость анимации сцены с большим количеством деталей   
    нет никакой технологии, есть набор Bitmap и рисование этих битмап напрямую на Canvas
    объем памяти ровно такой, что требуется для хранения этих битмапов.
    скорость отрисовки - максимальная, потому что кроме отрисовки вы собсно ничего не делаете вообще)
  10. 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/
  11. Like
    krapotkin получил реакцию от antigrav в Параллельный отладчик   
    а вы понимаете в котором потоке выполняется Synchronize() ?
    попробуйте сначала получить ThreadId, а уже потом переходить в ГП и выводить это значение на экран
  12. 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 версии.












  13. Like
    krapotkin отреагировална пост ComAlex в При нажатии на "Чужие" PUSH моё iOS-приложение закрывается аварийно!   
    Решено!
    Если кому интересно:
    При долгом нажатии на PUSH, активизируется виртуальная клавиатура!
    А у меня навешено событие на OnVirtualKeyboardShown() ...
  14. 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.
  15. Thanks
    krapotkin получил реакцию от antigrav в ProgressBar и потоки   
    не понял вопрос. мы работаем в обработчике одного из событий очереди сообщений в главном потоке.
    событие отрисовки тоже стоит в очереди в главном потоке. закончим обработчик, запустится следующий, произойдет перерисовка.
     
     
  16. Like
    krapotkin получил реакцию от Sergey S в Работа с web камерой   
    скорее всего просто нет реализации.
    UI в Linux же обеспечен совершенно сторонними средствами
    так что вопрос скорее к пакету FMX Linux
     
  17. Like
    krapotkin получил реакцию от Sergey S в Создание Dockable формы   
    floatingTabs.zip
    вот.  примерно то же самое надо делать при mousedragover
  18. 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;
  19. Like
    krapotkin получил реакцию от Sergey S в Создание Dockable формы   
    ничего там не из коробки.
    и в хроме тоже сами писали) 
    TabControl в чистом виде много чего не поддерживает.
    Зато поддерживает главное - можно табы убрать вообще. И над ним сделать панель, которая будет вести себя как угодно, в том числе анимированно раздвигая элементы во время Drag Over
    А после дропа выстроить табы. или фреймы, или что угодно. вообще не проблема
  20. Like
    krapotkin получил реакцию от Sergey S в Создание Dockable формы   
    я так понимаю, вопрос упирался в красивый драг, а не способ отсоединить таб от родителя ?
  21. 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, линкуем в проект и собираем...
    Не все зависимости используются и нужны, поэтому добавляем поштучно до тех пор пока не заведется.
  22. 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
  23. 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; 
    И оно будет работать.
     
  24. Thanks
    krapotkin получил реакцию от Hevard в Размер приложения   
    В RTL за годы тоже произошло 100500 изменений и добавлений. Функционал форм поменялся. Добавились стили в VCL. Все это отразилось на размере.
    Но я по-прежнему не вижу проблем. Вот питонные программы тянут почти 500м самого питона. Сишарп и другие - гигабайты дотнета. И ничего, никто не морщится даже.
  25. 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, но оно не стабильно работает в данном случае и бывает, когда картинка стирается и не рисуется, пока не наступит надобность перерисовать клиентскую часть формы.
×
×
  • Создать...