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

Akad

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

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

  • Посещение

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

    2

Весь контент Akad

  1. Большинство этого лечится через CnPack+Ide Fix. А вот идиотская работа клавиши назад мышки и ctrl+z действительно доставляют...
  2. К сожалению, это один из бесчисленных глюков FMX, тянущихся с самого начала компиляций под мобильные платформы. Сторонний компонент обычно помогает.
  3. В смысле для чего? Что бы значениями заполнить таблицу. Он разве работает в каком-то другом режиме? На сколько я знаю только TStringGrid хранит значения в себе TGrid не умеет такого. У меня достаточно сложный код: procedure CTableElement.Grid1GetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); begin if ARow >= Length(CellValue) then begin assert(false); end; if ACol >= Length(CellValue[ARow].cols) then begin assert(false); end; if ACol = -1 then begin Value := CellValue[ARow].color; exit; end; if ACol = -2 then begin Value := CellValue[ARow].isBlinking; exit; end; Value := CellValue[ARow].cols[ACol].GetVal; end; Т.е. у меня описан цвет строки, её мигание. GetVal у меня TValue. В нём может быть текст или картинка.
  4. В шаблоне <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
  5. Если честно - хз где это в настройках. Я редактирую AndroidManifest для этих целей.
  6. У приложения всегда 2 SDK: минимальное, на котором запустится приложение и тагет: для которого типо пишется. Тагет, что бы гугль против не была надо выставлять максимально доступный. Иначе в магазине своём будут устроены против вас репрессии. Минимальное SDK - ко всем функциям api из него всегда будет предоставлен доступ. Тагет - если нужна функция api из более старшего SDK надо сначала проверить а доступна ли она.
  7. Переопределите DrawColumnCell, и без проблемы выведите что как и где надо. TGrid - это конструктор. Все данные надо хранить у себя. Переопределить прежде всего GetValue/SetValue. Затем переопределить DrawColumnCell и рисовать в тех колонках, где нужен custom. Вот образец переопределения (то как рекомендует рисовать эмбо - загон ещё тот, лучше туда вообще не смотреть) procedure CScriptRunner.StringGrid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); const HorzTextMargin = 0; VertTextMargin = 0; var TextLayout : TTextLayout; TextRect: TRectF; center : TPoint; bmp:TBitmap; Val: TValue; color : DWORD; BlinkColumn : boolean; s, s2:string; p:integer; tm : TDateTime; Bou2: TRectF; begin // Например мы не хотим рисовать в колонках с чек боксами if Column is TCheckColumn then begin exit; end; // Например хотим менять цвет для визуального отделения строк TextRect := Bounds; case Row mod 4 of 0:Canvas.Fill.Color := $FFFFFFFF; 1:Canvas.Fill.Color := $FFF8F8F8; 2:Canvas.Fill.Color := $FFFCFCFC; 3:Canvas.Fill.Color := $FFF5F5F5; end; TextRect.Left := TextRect.Left-5; TextRect.Bottom := TextRect.Bottom; TextRect.Inflate(-HorzTextMargin+12, -VertTextMargin); Canvas.FillRect(TextRect, 0, 0, AllCorners, 1); TextRect := Bounds; //выводим текст canvas.Fill.Color := color canvas.Font.Family := 'Calibri'; canvas.Font.Size := g_ProntFontSize; Canvas.FillText(TextRect,Value.ToString,false,100,[], TTextAlign.Leading,TTextAlign.Leading); end; Главное, что тут можно отрисовать картинку, обратиться например (Sender as TGrid).OnGetValue(Sender,-1,Row, val); color := val.AsUInt64; у меня на -1 выдаётся цвет строки. И так далее. В общем полнейшая кастомизация всего чего можно. Ещё бы глюки поправили...
  8. TGrid прекрасно работает под мобильными платформами. Даёт куда больше возможностей кастомизации вывода чем TListView. Плюс не лагает в отличии от, так как лагать там нечему. Ещё бы на вью его бы посадили на мобильных платформах, и поправили проблемы с тачем, что бы пляски с бубном не устраивать каждый раз - вообще цены бы не было.
  9. Я уже написал свой парсер. Тему можно закрывать.
  10. Запустить сервис, который будет отслеживать активное активити, и если нужное закрыто, запускать его. Так же повесить на все кнопки (домой и т.д.) обработчик для перезапуска активити по новой. Хотя правильнее наверно сделать хоум скрином это приложение. Но не уверен, что на fmx это возможно...
  11. Я это прекрасно знаю. Но зачем плодить 100500 разных классов для описания одного и того-же? Не. Кому нравится кривая архитектура пожалуйста. Есть System.JSON, который имеет как раз 100500 классов, и который эксепшенами плюётся постоянно. Но если для нормальных людей. Зачем эта кривость? Почему нельзя иметь один класс на уровень, который всё отдаст как надо? Когда нет какого-то поля то будет культурное сообщение, а не эксепшен. Когда к полю можно обратиться по имени, а можно по индексу и так далее. Это космически-недостижимые технологии? Почему я не хочу 100500 классов? Потому что там везде придётся прописать один и тот-же код, а при доработках моих коллег править придётся код в более чем одном месте. А парсинг там и так не простой в плане дикого количества ньюансов. Так что это равносильно прямо пропорциональному увеличению проблем, которые начнут вылазить, например, через месяц. Причём в среднем 1 раз в месяц. Я бы с удовольствием остановился на tiny-json, если бы не вышеописанные проблемы с Child[].Но как я понял нормальных JSON парсеров, как не удивительно, на дельфе нет. Придётся писать велосипед.
  12. У меня на входе всегда массив. Ключи ни когда не известны, так как это ID товара. Но иногда {}, а иногда [], т.е. без ключей. Я банально хочу, что бы к любому полю на любом уровне можно было обратиться как по имени, так и по индексу, и что бы не через задницу это делать. Это единственное требование. Не думал, что хочу слишком много.
  13. Был-то массив. И в JSON представить данный массив по другому нельзя. Короче вопрос не в философии, а в том, что заранее не известны ни ключи ни значения, ни скобки. Надо JSON пропарсить. Чем? У SuperObject - obj.AsObject так же глючен. Когда [] - у него nil, а мне случайным образом поступает то [], то {}, хотя внутри всегда массив заказов. Писать 100500 ветвлений копипастя один и тот-же код из-за того, что кому-то лень прописать в одном классе все скобки - бред. Неужели нет полноценного, не глючного JSON парсера для Delphi? Крайне не люблю велосипеды изобретать.
  14. Догадка: Wine 3 сломали DirectDraw (и с ним все гуи на системах старше XP), а так как по умолчанию там эмуляция win 7, то соответственно глюки. В 3.1 что-то починили, но не всё. А что мешает нативно под linux собрать?
  15. Делаем отдельный поток, в нём пул http клиентов (array of). Ну и добавляем запрос через lock, успешный запрос обрабатываем через Synchronize. Или делаем отдельный класс-наследник TThread, опять array of и запускаем в каждом экземпляре обращение к сайту в нужный момент. Возврат значения через callback или Synchronize. Только в этом случае надо не забывать удалять ресурсы завершившихся потоков в главном.
  16. Изначально была такая структура: a:5:{i:0;a:4:{s:10:"PRODUCT_ID";s:3:"808";s:7:"OPTIONS";N;s:6:"AMOUNT";i:1;s:10:"SECTION_ID";s:2:"35";} s:14:"additional_849";a:6:{s:6:"AMOUNT";d:3;s:4:"TYPE";s:10:"additional";s:13:"IS_ADDITIONAL";b:1;s:13:"ADDITIONAL_ID";i:849;s:2:"ID";s:14:"additional_849";s:10:"PRODUCT_ID";s:14:"additional_849";} s:14:"additional_850";a:6:{s:6:"AMOUNT";s:1:"2";s:4:"TYPE";s:10:"additional";s:13:"IS_ADDITIONAL";b:1;s:13:"ADDITIONAL_ID";i:850;s:2:"ID";s:14:"additional_850";s:10:"PRODUCT_ID";s:14:"additional_850";} s:14:"additional_851";a:6:{s:6:"AMOUNT";d:2;s:4:"TYPE";s:10:"additional";s:13:"IS_ADDITIONAL";b:1;s:13:"ADDITIONAL_ID";i:851;s:2:"ID";s:14:"additional_851";s:10:"PRODUCT_ID";s:14:"additional_851";} s:14:"additional_852";a:6:{s:6:"AMOUNT";d:2;s:4:"TYPE";s:10:"additional";s:13:"IS_ADDITIONAL";b:1;s:13:"ADDITIONAL_ID";i:852;s:2:"ID";s:14:"additional_852";s:10:"PRODUCT_ID";s:14:"additional_852";}} Т.е. массив из 5 элементов ключ-значение. Так как есть ключ, то в JSON скобки {}. Всё корректно вроде. В смысле php часть отработала правильно. Да и вообще говоря любой JSON на одном уровне - это массив ключ-значение (причём ключа может не быть). Вот и нужен парсер, который это понимает, а не занимается фантазированием.
  17. Брр. Почему не массив? Это массив элементов "0", "additional_849", "additional_851" и так далее. Они все находятся на одном уровне ведь. И выше них уровня нет.
  18. Заменил код. Сделал ребилд. Упало в этом-же месте в CheckSynchronize.
  19. С недавних пор (студия 10.2.2) программа начала падать в System.Classes в function CheckSynchronize. Конкретно кусок try if Assigned(SyncProc.SyncRec.FMethod) then SyncProc.SyncRec.FMethod() else if Assigned(SyncProc.SyncRec.FProcedure) then SyncProc.SyncRec.FProcedure(); except if not SyncProc.Queued then SyncProc.SyncRec.FSynchronizeException := AcquireExceptionObject else if Assigned(ApplicationHandleException) then ApplicationHandleException(SyncProc.SyncRec.FThread); end; И далее. Дело в том, что в SyncProc.SyncRec или nil или мусор. Ни в стеке вызовов, ни в других нитках я намёков на причину не нашёл. В стеке вызов CallNextHookEx, который дёргает StdWndProc, а та пытается синхронизироваться. Последний ассерт происходит из-за Error(reMonitorNotLocked) в function TMonitor.CheckOwningThread: TThreadID; и далее программа или работает нормально, или повисает UI намертво - когда как. Подозреваю, что пытается синхронизироваться объект, которого уже нет. У меня все формы и все компоненты на них создаются и удаляются динамически. Таблицы заполняются в других потоках через Synchronize и т.д В общем проект большой, и что иголку в стоге сена искать... Глюк плавающий, но проявляется наиболее стабильно после закрытия определённого окна. Создаю компоненты стандартно. Типа: control := TEdit.Create(parent); и удаляю тоже if assigned(control) then FreeAndNil(control); Форму создаю: BaseForm := TEmtyForm_frm.Create(Application); BaseForm.Name := 'Form'+IntToStr(Random(256)*Random(256)); if assigned(parentScRun) then BaseForm.Parent := parentScRun.BaseForm; удаляю соответственно: if assigned(BaseForm) then FreeAndNil(BaseForm); Посоветуйте куда "копать"? Может ли быть верна моя догадка, что это из-за уже разрушенного объекта? Если да - что надо синхронизировать перед FreeAndNil? Если нет - что ещё посмотреть?
  20. Сейчас с ходу что он не распарсил не прилетело, но вот распарсил криво: {"0":{"PRODUCT_ID":"808","OPTIONS":null,"AMOUNT":1,"SECTION_ID":"35"},"additional_849":{"AMOUNT":3,"TYPE":"additional","IS_ADDITIONAL":true,"ADDITIONAL_ID":849,"ID":"additional_849","PRODUCT_ID":"additional_849"},"additional_850":{"AMOUNT":"2","TYPE":"additional","IS_ADDITIONAL":true,"ADDITIONAL_ID":850,"ID":"additional_850","PRODUCT_ID":"additional_850"},"additional_851":{"AMOUNT":2,"TYPE":"additional","IS_ADDITIONAL":true,"ADDITIONAL_ID":851,"ID":"additional_851","PRODUCT_ID":"additional_851"},"additional_852":{"AMOUNT":2,"TYPE":"additional","IS_ADDITIONAL":true,"ADDITIONAL_ID":852,"ID":"additional_852","PRODUCT_ID":"additional_852"}} Obj := SO(s); Assert(obj.AsArray <> nil); Сработал assert, хотя root - это массив. Основная проблема стандартной библиотеки - это кривость работы с массивами [], и постоянные ассерты, когда нет элемента. Ну и общая громоздкость кода парсинга. То есть если структура JSON изначально известна и "стандартна", то проблем не будет. А если шаг влево, шаг вправо, то...
  21. Нашёл SuperObject, он из ~1500 JSON проглючил всего на 4-х. Хотя online парсеры эти 4 кушают без проблем. Уже результат. Но всё же хочется лучше. Не думал, что парсинг структурированного текста хоть как-то сложная задача...
  22. Кто поделится нормальным JSON парсером? Источник JSON - команда на php json_encode(unserialize($value)); То есть это просто сереализованная структура данных, которая изначально не известна (точнее их куча разных), и которую надо распарсить определённым алгоритмом. Стандартный - System.JSON - вообще хрень полная. Ничего не умеет, даже квадратные скобки если и парсит, то криво. С гитхаба есть https://github.com/thomaserlang/delphi-json - так же штука мало что умеющая, и https://github.com/tmcdos/tiny-json -это почти то, что надо. Но они слишком заморочились с хешами и вкрался каской-то глюк. На некоторых входных данных json1.Child[0] = nil, хотя json1.Count > 0. Искать проблему в этом коде нет ни какого желания, слишком всё усложнено. В общем кто чем пользуется?
  23. http://www.fmxexpress.com/configure-android-system-settings-from-delphi-xe5-firemonkey/ Там SCREEN_OFF_TIMEOUT, яркость по аналогии. P.S. Что бы перевести какой-то код с андоидовской явы на FireMonkey, я в гугле спрашиваю это словосочитание, плюс прибавляю FireMonkey. В данном случае что-то типа: Запрос Способ срабатывает в ~95%.
  24. far+f4 (или другой текстовый редактор) shift+del/ctrl+ins.
  25. Может где тему отдельную завести "исправляем ошибки в fmx сами", где наработки подобные собирать? Сегодня часа 4 убил, что бы найти ошибку разработчиков, что бы TLabel всегда выводил правильный шрифт после обновления информации в себе. Кому интересно, файл FMX.Objects.pas, procedure TText.DoSetText(const Value: string);Ищем строчку FLayout.LayoutCanvas := Canvas; после неё вставляем FLayout.Font := Self.Font;
×
×
  • Создать...