
krapotkin
-
Постов
2 198 -
Зарегистрирован
-
Посещение
-
Победитель дней
210
Активность репутации
-
krapotkin отреагировална пост Andrey Efimov в Модальное окно позади формы приложения
Да, вот прямо сейчас проверял, модальная форма перестаёт проваливаться под основную. На всякий случай, Delphi 12.2.
-
krapotkin получил реакцию от Barbanel в Модальное окно позади формы приложения
ShowModal же, не Show. Соответственно BringToFront() не выполнится
-
krapotkin отреагировална пост Andrey Efimov в Модальное окно позади формы приложения
Увидел эту тему и не мог понять, почему я не сталкивался с такой проблемой в своём приложении, которое почти для всех форм использует режим модального окна. Решил покопаться в официальной жире. Есть там тикет (RSS-1714) с описанием похожей проблемы и демкой. В общем, там дело в использовании StyleBook. Если установить UseStyleManager = False, то проблема исчезает, правда вместе с проблемой исчезает и стилизация окна Но может как то поможет вам в решении вашей проблемы.
-
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
-
krapotkin получил реакцию от antigrav в Конфигурация сборки
в каждую конфигурацию можно прописать набор CONDITIONAL DEFINES
и в коде использовать IFDEF
-
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
Готово
-
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, но оно не стабильно работает в данном случае и бывает, когда картинка стирается и не рисуется, пока не наступит надобность перерисовать клиентскую часть формы.