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

Ingalime

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

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

  • Посещение

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

    5

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

  1. Like
    Ingalime отреагировална Евгений Корепов в информация о версии консольного приложения   
    В Линуксе просто нет никаких стандартов для размещения версии внутри бинарника. Ембаркадера об этом не в курсе, но по привычке воткнула пустую заглушку ))) Забейте, и просто делайте свою константу с версией.
  2. Like
    Ingalime отреагировална krapotkin в как создать АПК без подключенного аппарата.   
    apk создается при Deploy
    соотв-но project - compile, потом project - deploy
  3. Like
    Ingalime отреагировална Max в Переезд на 10.3 Rio   
    Коллеги, добрый день!
    Спасибо, что разобрали эту тему, спасибо за примеры кода и предложенные идеи. Убил на это неделю с лишним, и на самом деле во всем инете этот форум чуть ли не единственное место, где проблема обновления визуальных компонентов поднята и подробно рассмотрена.
    Единственное, чего не хватает, это итогового примера кода. Ваш, Krapotkin, вариант (zip) не особо понятен, и в нем нет ProgressBar-а для наглядности. Восполняю этот пробел для потомков, у которых скоро кончится год отсрочки на 32битные приложения.
    SplashForm example 10.3.3.zip
  4. Like
    Ingalime отреагировална Евгений Корепов в IdTCPClient, IdTCPServer и соеденение   
    Тут все просто - нужно ждать. Ваш код работает корректно только в идеальных условиях. Но если вторая сторона не ответила мгновенно, то вы уже ничего не получите.
    Перед отправкой/получением вам надо проверить наличие соединения функцией FTCPClient.IOHandler.CheckForDisconnect()  - при отсутствии соединения она сгенерит исключение:
    try FTCPClient.IOHandler.CheckForDisconnect(); except on E: EIdException do begin LogError('TUTM5StreamProtocol.Run CheckForDisconnect ERROR ' + E.Message); Reconnect(); end; end; Читать с ожиданием данных можно несколькими способами:
    1. Задавать FTCPClient.IOHandler.ReadTimeout в надежде что в отведенное время что то придет.
    2. Использовать FTCPClient.IOHandler.ReadLnWait() для чтения строки.
    3. Или обрабатывать проверять наличие данных и читать по мере их поступления:
    if FTCPClient.IOHandler.CheckForDataOnSource(FConnectParams.Timeouts.TCPReadTimeout) then читаем....  
  5. Like
    Ingalime отреагировална ruslan в Сортировка TListViewItems   
    TListView(Sender).Items.ActiveItems.Sort(       TComparer<TListViewItem>.Construct(         function(const Left, Right: TListViewItem): Integer         var .......   TListView(Sender).Items.Changed;     p.s. ActiveItems и Changed - это хелперы к соотв-им полям\методам strict private   p.s. метод Sort - я вообще не понимаю {censored} он тут нужен. он сортирует свои внутренние объекты стиля
  6. Like
    Ingalime отреагировална Dmitry_4501 в libbass.so не загружается.   
    Держите, кому нужно. В архиве библиотеки BASS (для Windows и Android), а так же все найденные мною дополнения (У меня есть дополнения не для всех платформ. Например, какие-то дополнения я нашел только под Windows, а библиотеки каких-то дополнений BASS есть не на каждый процессор)
    ВАЖНОЕ ЗАМЕЧАНИЕ: Для дополнений у меня нет юнитов, но их не сложно сделать самому. Просто скачиваем с сайта un4seen необходимые плагины для Windows и переписываем его на динамическую загрузку (LoadLibrary, GetProcAddress и т.д.).
    Библиотеку протестировал, проверил не все функции, но основное все работало прекрасно. Проверял следующее:
    BASS_Init, BASS_StreamCreateFile, BASS_StreamCreateURL, BASS_ChannelPlay, BASS_ChannelPause, BASS_ChannelIsActive, BASS_ChannelGetAttribute, BASS_ChannelSetAttribute, BASS_ChannelGetLength, BASS_GetConfig, BASS_SetConfig, BASS_GetConfigPtr, BASS_SetConfigPtr (вроде все, может что-то упустил). Все работало на Windows и Android.
    Если нужна будет помощь с подключением библиотеки - задавайте вопросы  
     
     
     
    bass.zip
  7. Like
    Ingalime отреагировална krapotkin в Почему не очищается ImageList ?   
    главное не говорить, что за ошибка )
    а пока не говорите, могу только поинтересоваться почему Form1.ImageList1 ?
  8. Thanks
    Ingalime отреагировална gonzales в Рабочая комбинация программ для публикации в AppStore   
    Да, сработало. По крайней мере приложение скомпилилось старым XCode (10.1) с подменой SDK на версию 13.5
    Техника секса:
    1. Скачиваем свежий XCode по прямой ссылке https://developer.apple.com/download/more/ 
    2. Разархивируем скаченный архив
    3. XCode конечно не открывается, кликаем правой кнопкой, выбираем пункт "показать содержимое пакета"
    4. Идем по пути Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs, видим там папку и ярлык на SDK.
    5. Копируем эту папку и ярлык в тот же каталог рабочей версии XCode.
    6. Запускаем XCode
    7. В Делфи запускаем SDK Manager. Добавляем новый SDK для iOS, видим, что система предлагает уже измененную версию (у меня 13.5), скачиваем ее, устанавливаем SDK
    8. Проверяем компиляцию проекта
  9. Like
    Ingalime отреагировална gonzales в Рабочая комбинация программ для публикации в AppStore   
    да, по всей видимости это беда.
    надо будет попробовать подменить в пакете XCode SDK
  10. Like
    Ingalime отреагировална gonzales в Рабочая комбинация программ для публикации в AppStore   
    Очередной update.
    Обновился iphone до версии 13.5, соответственно XCode говорит что нет у него DeviceSupport файлов, соответственно Делфа не может запустить проект на телефоне, нет отладки и все такое. При попытке скачать новый XCode АппСтор говорит, хрен тебе, обнови-ка сначала MacOS до версии 10.15. Но при попытке обновить МакОсь вылезает ошибка, что мол на твою железку 10.15 поставить нельзя. И все, никаких вариантов решения не предлагается. Очередной танец с бубном привел к следующему решению такой проблемы
    1. Скачиваем свежий XCode по прямой ссылке https://developer.apple.com/download/more/ 
    2. Разархивируем скаченный архив
    3. XCode конечно не открывается, кликаем правой кнопкой, выбираем пункт "показать содержимое пакета"
    4. Идем по пути Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport, видим там папки со всеми версиями платформ.
    5. Копируем нужные версии в тот же каталог рабочей версии XCode.
    6. Запускаем XCode, подключаем телефон, убеждаемся, что XCode больше не ругается.
    7. Скаченный XCode можно удалить
     
    На данный момент опробовано для Delphi 10.3.3, XCode 10.1. Скачивал XCode версии 11.5. 
     
  11. Like
    Ingalime отреагировална gonzales в потоки в ios   
    Переделал вот так
    procedure TForm5.Button16Click(Sender: TObject); begin TTask.Run( procedure begin //действия end); end; и заработало. Странно, я всегда думал, что TTask и TThread - это одно и то же.
  12. Like
    Ingalime отреагировална Евгений Корепов в Обновление клиента по событию   
    Запоминайте в php последний номер добавленной записи (id), добавьте в api метод вроде GetLastRecordsIDs, который будет возвращать все ID нужных таблиц. Клиент пусть долбится в этот метод раз в N секунд и сверяет свои последние ID с ID сервера, при не совпадении - запрос новых данных.
    В php хранить последние идешники можно как угодно - файл, сессия, ну или memcache чтоб уж совсем быстро было. Я бы хранил в сессии, и сессию сделал в memcached.
  13. Like
    Ingalime отреагировална Евгений Корепов в export and save the contents   
    Use jsPDF https://github.com/MrRio/jsPDF
    Example https://www.codexworld.com/convert-html-to-pdf-using-javascript-jspdf/
  14. Like
    Ingalime отреагировална qz5 в RAD Studio 10.3.3 (с поддержкой Андроид 64-бит, macOS Catalina 64-bit, iOS 13)   
    Как исправить ошибку есть в этой теме :
    А вообще на этой неделе вышла версия 10.4, где эта проблема исправлена (RSP-27140)!
  15. Like
    Ingalime отреагировална slav_z в Требуется приложение на на все смартфоны   
    загружаются стили в элементы списков (по-умолчанию они загружаются когда надо в первый раз нарисовать элемент...)  попробуйте использовать BeginUpdate перед созданием и EndUpdate после... (вообще всегда используйте эти методы при создании списков на экране)
  16. Like
    Ingalime отреагировална krapotkin в slide presentation   
    No problem. Actiaully, they consists of standard Delphi's TPagecontrol, TLayout and TImage. You can simply repeat it right in code.
  17. Like
    Ingalime отреагировална krapotkin в slide presentation   
    In order to reduce a time to develop I recommend to look at https://github.com/zhaoyipeng/FMXComponents and use his slideshow component
    then you can adjust the size to achieve your target values
  18. Like
    Ingalime отреагировална Паршенко Виктор в Одновременное обращение к БД Sqlite из программы и из сервиса   
    Как же я намучился с этим одно время, нигде не нашел решение. Поделюсь, раз уж наткнулся на этот вопрос.
    Первое правило использования сервисов в под android - никаких упоминаний FMX и всего что связано с графикой, пусть вы и не используете её.
    Например: если вы упомянули в сервисе, в разделе uses FMX.Types - ваш сервис будет падать с ошибкой Segment fault.
    Также, допустим у вас есть юнит uMyUnit, и в этом юните в разделе uses есть FMX.Types - тоже будет падать с ошибкой Segment fault.
    Повторюсь, сервис никаким образом не должен знать об FMX. 

    Причина падения FireDAC это - Wait курсор. 

    Решение 1: Если вы используете designTime компонент, добавьте рядом компонент FDGUIxWaitCursor
    настройте его так:
    Property: Provide,  Value: Console
    Property: ScreenCursor, Value: gcrNone
    Решение 2: Если вы используете динамическое создание подключения:
    uses  ..., FireDAC.ConsoleUI.Wait, ...  var  FDGUIxWaitCursor: TFDGUIxWaitCursor; begin   FDGUIxWaitCursor := TFDGUIxWaitCursor.Create(nil);   FDGUIxWaitCursor.Provider := 'Console';   FDGUIxWaitCursor.ScreenCursor := TFDGUIxScreenCursor.gcrNone; end;  
  19. Like
    Ingalime отреагировална Pax Beach в Одновременное обращение к БД Sqlite из программы и из сервиса   
    Я нашел решение, к сожалению, пока только для работы с UniDAC:
    Обновил UniDAC компоненты для Berlin до последней версии (6.3.12).
    Компоненты TUniConnection и TUniQuery отлично работают с SQLite в Android Service. FireDAC в Android Service пока запустить не удалось, но у меня такой задачи нет.
    В Deployment host приложения добавляю файл базы данных, Remote Path задаю ".\assets\internal\". И спокойно из сервиса получаю к нему доступ. Мой сервис локальный в одном потоке с приложением. Если делать Intent Service или Remote — наверное, придется помещать файл в другой, доступный каталог, или общаться через намерения (Intents).
    Надеюсь мой код будет полезен для вас.
    procedure TDM.conSQLiteBeforeConnect(Sender: TObject); begin {$IF DEFINED(iOS) or DEFINED(ANDROID)} conSQLite.Database := TPath.Combine(TPath.GetDocumentsPath, 'mybase.sqlite'); {$ENDIF} end; procedure TDM.conSQLiteError(Sender: TObject; E: EDAError; var Fail: Boolean); begin Log('--- DB error: %s:', [E.Message]); Fail := False; end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin Log('+ START with Intent: ' + JStringToString(Intent.getAction.toString), []); if Intent.getAction.equalsIgnoreCase(StringToJString('StopIntent')) then begin try conSQLite.Disconnect; Log('- DB disconnected', []); except on E: Exception do Log('- can not to disconnect DB', [E.Message]); end; Log('... service to be stoped', []); JavaService.stopSelf; Result := TJService.JavaClass.START_NOT_STICKY; // don't reload service end else begin Log('... service started', []); try conSQLite.Connect; Log('+ DB connected', []); UniQuery.SQL.Text := 'select count(*) as ALLREC from orders'; UniQuery.Open; if UniQuery.RecordCount > 0 then begin UniQuery.First; Log('... record count: %s', [UniQuery.FieldByName('ALLREC').AsString]); end; UniQuery.Close; except on E: Exception do Log('- can not to connect DB: %s', [E.Message]); end; Result := TJService.JavaClass.START_STICKY; // rerun service if it stops end; end;
  20. Like
    Ingalime отреагировална krapotkin в Как задать стиль кнопки в состоянии Enabled = False?   
    кнопка в стиле имеет состояния Focused, Hot, Normal и Pressed
    поэтому состояние Disabled у нее отдельно задать не выйдет, можно только унаследоваться и поменять в коде
  21. Like
    Ingalime отреагировална krapotkin в Требуется приложение на на все смартфоны   
    про String беспокоиться возможно и не нужно
    а места TStringList.Create; и соответствующий Free я бы прологировал
  22. Like
    Ingalime отреагировална krapotkin в Фреймворк для стандартного ListView   
    пока играл с материал-тенями, порушил маленько, не заметил
    поправил демки, обновил репозитории
  23. Like
    Ingalime отреагировална krapotkin в Фреймворк для стандартного ListView   
    Ссылки на исходники
    https://bitbucket.org/vkrapotkin/vklistview/src/master/
    https://bitbucket.org/vkrapotkin/vkexpressionparser/src/master/
    https://bitbucket.org/vkrapotkin/vkshadowgenerator/src/master/
  24. Like
    Ingalime отреагировална krapotkin в Поток в Firemonkey Android для скачивания TXT   
    e THttpClient есть свойства в которых есть слово Timeout. Их можно установить, и запрос будет вываливаться по Exception
    поэтому нужно добавить обработку Try Except  вместо или дополнительно к Try Finally
    в обработчике Except можно куда-то записывать результат или так же через синхронизацию например выводить сообщение на экран
  25. Like
    Ingalime отреагировална Евгений Корепов в как ускорить обработку данных   
    Как верно подметил Дмитрий - знание SQL наше все.
    Вот к примеру я создал тестовую таблицу и наполнил ее тестовыми данными:
    CREATE TABLE `test001` ( `id` int(11) NOT NULL AUTO_INCREMENT, `TimeFrom` datetime DEFAULT NULL, `InA` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8; INSERT INTO `test001` VALUES ('1', '2020-05-17 16:14:36', '1'); INSERT INTO `test001` VALUES ('2', '2020-05-17 16:12:56', '2'); INSERT INTO `test001` VALUES ('3', '2020-05-17 16:12:56', '3'); INSERT INTO `test001` VALUES ('4', '2020-05-17 17:12:56', '4'); INSERT INTO `test001` VALUES ('5', '2020-05-17 17:12:56', '5'); INSERT INTO `test001` VALUES ('6', '2020-05-17 17:12:56', '6'); INSERT INTO `test001` VALUES ('7', '2020-05-17 18:12:56', '7'); INSERT INTO `test001` VALUES ('8', '2020-05-17 18:12:56', '8'); INSERT INTO `test001` VALUES ('9', '2020-05-17 18:12:56', '9'); INSERT INTO `test001` VALUES ('10', '2020-05-17 19:12:56', '10'); INSERT INTO `test001` VALUES ('11', '2020-05-17 19:12:56', '11'); INSERT INTO `test001` VALUES ('12', '2020-05-17 19:12:56', '12'); INSERT INTO `test001` VALUES ('13', '2020-05-17 20:12:56', '13'); INSERT INTO `test001` VALUES ('14', '2020-05-17 20:12:56', '14'); INSERT INTO `test001` VALUES ('15', '2020-05-17 20:12:56', '15'); INSERT INTO `test001` VALUES ('16', '2020-05-17 21:12:56', '16'); INSERT INTO `test001` VALUES ('17', '2020-05-17 21:12:56', '17'); INSERT INTO `test001` VALUES ('18', '2020-05-17 21:12:56', '18'); Для получения почасовых сумм по полю InA мне достаточно очень простого запроса:
    SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600), SUM(test001.InA) as SumInA FROM test001 GROUP BY FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600 Результат запроса будет выглядеть вот так:
    2020-05-17 16:00:00 6 2020-05-17 17:00:00 15 2020-05-17 18:00:00 24 2020-05-17 19:00:00 33 2020-05-17 20:00:00 42 2020-05-17 21:00:00 51 Скорость выдачи результата будет большой - при миллионах записей в исходной таблице дело нескольких секунд или десятков секунд (зависит от железа сервера). 
    Но это все равно медленно, потому что на каждую запись таблицы будет производится вычисление "FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600" - деление, округление и умножение.
    Если это разовая выборка - проблем нет. Но если вам нужно регулярно дергать из таблицы данные, то лучше добавить в таблицу поле TimeFromHour, в которое сразу записывать значение  FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600. Это можно сделать руками или триггером при вставке. Добавить Индекс по полю TimeFromHour и в запросе тоже группировать (GROUP BY) по этому полю:
    ALTER TABLE `test001` ADD INDEX `Index-TimeFromHour` (`TimeFromHour`) USING BTREE ; Тогда вы получите максимально возможное быстродействие.
    Если нужно результат вставить в другую таблицу, то используйте запрос вроде такого:
    INSERT INTO test_sum (TimeFrom, SumInA) ( SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600), SUM(test001.InA) as SumInA FROM test001 GROUP BY FLOOR(UNIX_TIMESTAMP(test001.TimeFrom) / 3600) * 3600 )  
×
×
  • Создать...