krapotkin
-
Постов
2 184 -
Зарегистрирован
-
Посещение
-
Победитель дней
209
Активность репутации
-
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
-
krapotkin получил реакцию от sulion в Скорость анимации сцены с большим количеством деталей
Удобство и универсальность ВСЕГДА противопоставлены быстродействию
Бросьте идею использовать компоненты для рисования анимации. Что вы выиграли по сравнению с простым Canvas.DrawBitmap() на PaintBox ??
Ничего.
Зато приобрели просто гигантский оверхед в виде ненужной универсальной начинки компонента TBitmap.
Потом будут еще проблемы изза того, что не вы сами управляете масштабированием картинки в компоненте.
Так игру не написать
-
krapotkin получил реакцию от sulion в Скорость анимации сцены с большим количеством деталей
нет никакой технологии, есть набор Bitmap и рисование этих битмап напрямую на Canvas
объем памяти ровно такой, что требуется для хранения этих битмапов.
скорость отрисовки - максимальная, потому что кроме отрисовки вы собсно ничего не делаете вообще)
-
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/
-
krapotkin получил реакцию от antigrav в Параллельный отладчик
а вы понимаете в котором потоке выполняется Synchronize() ?
попробуйте сначала получить ThreadId, а уже потом переходить в ГП и выводить это значение на экран
-
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 версии.
-
krapotkin отреагировална ComAlex в При нажатии на "Чужие" PUSH моё iOS-приложение закрывается аварийно!
Решено!
Если кому интересно:
При долгом нажатии на PUSH, активизируется виртуальная клавиатура!
А у меня навешено событие на OnVirtualKeyboardShown() ...
-
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.
-
krapotkin получил реакцию от antigrav в ProgressBar и потоки
не понял вопрос. мы работаем в обработчике одного из событий очереди сообщений в главном потоке.
событие отрисовки тоже стоит в очереди в главном потоке. закончим обработчик, запустится следующий, произойдет перерисовка.
-
krapotkin получил реакцию от Sergey S в Работа с web камерой
скорее всего просто нет реализации.
UI в Linux же обеспечен совершенно сторонними средствами
так что вопрос скорее к пакету FMX Linux
-
krapotkin получил реакцию от Sergey S в Создание Dockable формы
floatingTabs.zip
вот. примерно то же самое надо делать при mousedragover
-
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;
-
krapotkin получил реакцию от Sergey S в Создание Dockable формы
ничего там не из коробки.
и в хроме тоже сами писали)
TabControl в чистом виде много чего не поддерживает.
Зато поддерживает главное - можно табы убрать вообще. И над ним сделать панель, которая будет вести себя как угодно, в том числе анимированно раздвигая элементы во время Drag Over
А после дропа выстроить табы. или фреймы, или что угодно. вообще не проблема
-
krapotkin получил реакцию от Sergey S в Создание Dockable формы
я так понимаю, вопрос упирался в красивый драг, а не способ отсоединить таб от родителя ?
-
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, линкуем в проект и собираем...
Не все зависимости используются и нужны, поэтому добавляем поштучно до тех пор пока не заведется.
-
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
-
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;
И оно будет работать.
-
krapotkin получил реакцию от Hevard в Размер приложения
В RTL за годы тоже произошло 100500 изменений и добавлений. Функционал форм поменялся. Добавились стили в VCL. Все это отразилось на размере.
Но я по-прежнему не вижу проблем. Вот питонные программы тянут почти 500м самого питона. Сишарп и другие - гигабайты дотнета. И ничего, никто не морщится даже.
-
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, но оно не стабильно работает в данном случае и бывает, когда картинка стирается и не рисуется, пока не наступит надобность перерисовать клиентскую часть формы.
-
krapotkin отреагировална OnePeople в Съезжают размеры и положение контролов в Андроиде, в винде всё нормально.
У меня 11, и без него размер editа зависит от размера шрифта и ни какими свойствами не правиться
-
krapotkin получил реакцию от Hevard в Размер компилируемого файла
что за детский сад
на андроиде приложения весят 400К и при этом используют библиотеки Java на 2G
это как - маленькие или большие приложения?
то же с .NET
Приложение с пустой формой тащит за собой весь функционал, который вы можете использовать, при этом не требуя установки дополнительных run-time библиотек, чем, собсн, всегда и хороша была Делфи
mp3 файл весит 8-10 мб. а 5 сек видео "опы - 120. Не видел я чтобы кто-то плакал по этому поводу
-
krapotkin получил реакцию от Letter в Запись звука как на диктофоне
не думаю, что это сделано путем установки некоей "громкости"
когда у нас есть оцифрованный сигнал, то дальше уже идет цифровая обработка этого сигнала
например, нормализация, или компрессия https://habr.com/ru/articles/379395/
операция не очень сложная, но нужно поискать описания хороших алгоритмов и поэкспериментировать с их настройками
-
krapotkin получил реакцию от Letter в Запись звука как на диктофоне
https://docwiki.embarcadero.com/CodeExamples/Sydney/en/FMX.AudioRecPlay_Sample
-
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.
-
krapotkin получил реакцию от AngryOwl в Размер компилируемого файла
что за детский сад
на андроиде приложения весят 400К и при этом используют библиотеки Java на 2G
это как - маленькие или большие приложения?
то же с .NET
Приложение с пустой формой тащит за собой весь функционал, который вы можете использовать, при этом не требуя установки дополнительных run-time библиотек, чем, собсн, всегда и хороша была Делфи
mp3 файл весит 8-10 мб. а 5 сек видео "опы - 120. Не видел я чтобы кто-то плакал по этому поводу