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

Akad

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

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

  • Посещение

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

    2

Сообщения, опубликованные Akad

  1. 6 часов назад, S_007 сказал:

    Еще одна проблема, если редактировать нижние ячейки то появившаяся клавиатура перекрывает её

    К сожалению, это один из бесчисленных глюков FMX, тянущихся с самого начала компиляций под мобильные платформы. Сторонний компонент обычно помогает.

  2. 26 минут назад, wamaco сказал:

    TValueможно пример? как и для чего Вы переопределяете...

    В смысле для чего? Что бы значениями заполнить таблицу. Он разве работает в каком-то другом режиме? На сколько я знаю только 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. В нём может быть текст или картинка.

  3. У приложения всегда 2 SDK: минимальное, на котором запустится приложение и тагет: для которого типо пишется. Тагет, что бы гугль против не была надо выставлять максимально доступный. Иначе в магазине своём будут устроены против вас репрессии.

    Минимальное SDK - ко всем функциям api из него всегда будет предоставлен доступ.

    Тагет - если нужна функция api из более старшего SDK надо сначала проверить а доступна ли она.
     

  4. 53 минуты назад, S_007 сказал:

    печально что и в нём нельзя отредактировать через инспектор шрифт, высоту заголовка

    Переопределите 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 выдаётся цвет строки. И так далее. В общем полнейшая кастомизация всего чего можно. Ещё бы глюки поправили...
     

  5. TGrid прекрасно работает под мобильными платформами. Даёт куда больше возможностей кастомизации вывода чем TListView. Плюс не лагает в отличии от, так как лагать там нечему. Ещё бы на вью его бы посадили на мобильных платформах, и поправили проблемы с тачем, что бы пляски с бубном не устраивать каждый раз - вообще цены бы не было.
     

  6. Запустить сервис, который будет отслеживать активное активити, и если нужное закрыто, запускать его. Так же повесить на все кнопки (домой и т.д.) обработчик для перезапуска активити по новой. Хотя правильнее наверно сделать хоум скрином это приложение. Но не уверен, что на fmx это возможно...
     

  7. 47 минут назад, krapotkin сказал:

    вы вообще читаете что вам пишут? в JSON массив это [] а объект - {}

    Я это прекрасно знаю. Но зачем плодить 100500 разных классов для описания одного и того-же? Не. Кому нравится кривая архитектура пожалуйста. Есть System.JSON, который имеет как раз 100500 классов, и который эксепшенами плюётся постоянно. Но если для нормальных людей. Зачем эта кривость? Почему нельзя иметь один класс на уровень, который всё отдаст как надо? Когда нет какого-то поля то будет культурное сообщение, а не эксепшен. Когда к полю можно обратиться по имени, а можно по индексу и так далее. Это космически-недостижимые технологии?

    Почему я не хочу 100500 классов? Потому что там везде придётся прописать один и тот-же код, а при доработках моих коллег править придётся код в более чем одном месте. А парсинг там и так не простой в плане дикого количества ньюансов. Так что это  равносильно прямо пропорциональному увеличению проблем, которые начнут вылазить, например, через месяц. Причём в среднем 1 раз в месяц.

    Я бы с удовольствием остановился на tiny-json, если бы не вышеописанные проблемы с Child[].Но как я понял нормальных JSON парсеров, как не удивительно, на дельфе нет. Придётся писать велосипед. :( 
     

  8. 20 минут назад, krapotkin сказал:

    если у вас на входе то массив, то объект, вам все равно придется работать с ними по разному. не?

    У меня на входе всегда массив. Ключи ни когда не известны, так как это ID товара. Но иногда {}, а иногда [], т.е. без ключей.

    Я банально хочу, что бы к любому полю на любом уровне можно было обратиться как по имени, так и по индексу, и что бы не через задницу это делать. Это единственное требование. Не думал, что хочу слишком много. :D
     

  9. 2 часа назад, krapotkin сказал:

    если вашу мысль развить, то с т.з. php {"A":"B", "C":""D"} это тоже массив, но это не так

    JSON это стандарт. Там написано, как выглядит массив, а как - нет. Несмотря на то, что вам может что-то казаться или не нравиться.

    Был-то массив. И в JSON представить данный массив по другому нельзя. Короче вопрос не в философии, а в том, что заранее не известны ни ключи ни значения, ни скобки. Надо JSON пропарсить. Чем?

    У SuperObject - obj.AsObject так же глючен. Когда [] - у него nil, а мне случайным образом поступает то [], то {}, хотя внутри всегда массив заказов. Писать 100500 ветвлений копипастя один и тот-же код из-за того, что кому-то лень прописать в одном классе все скобки - бред. Неужели нет полноценного, не глючного JSON парсера для Delphi? Крайне не люблю велосипеды изобретать.

     

  10.  

    Делаем отдельный поток, в нём пул http клиентов (array of). Ну и добавляем запрос через lock, успешный запрос обрабатываем через Synchronize.

    Или делаем отдельный класс-наследник TThread, опять array of и запускаем в каждом экземпляре обращение к сайту в нужный момент. Возврат значения через callback или  Synchronize. Только в этом случае надо не забывать удалять ресурсы завершившихся потоков в главном.
     

  11. Изначально была такая структура:

    
    
    
    
    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 на одном уровне - это массив ключ-значение (причём ключа может не быть). Вот и нужен парсер, который это понимает, а не занимается фантазированием.


     

  12. 29 минут назад, Равиль Зарипов (ZuBy) сказал:

    правильно сработал, это не массив а объект. смотрите внимательно

    Брр. Почему не массив? Это массив элементов "0", "additional_849", "additional_851" и так далее. Они все находятся на одном уровне ведь. И выше них уровня нет.
     

  13. С недавних пор (студия 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? Если нет - что ещё посмотреть?

     

  14. 13 часа назад, krapotkin сказал:

    можно пример, чего такого он у вас не разобрал?

    Сейчас с ходу что он не распарсил не прилетело, но вот распарсил криво:

    {"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 - это массив.

    2 часа назад, Tumaso сказал:

    А меня System.JSON полностью устраивает. Ошибок парсинга валидных данных не было ни разу, скорость на нормальном уровне.

    Основная проблема стандартной библиотеки - это кривость работы с массивами [], и постоянные ассерты, когда нет элемента. Ну и общая громоздкость кода парсинга. То есть если структура JSON изначально известна и "стандартна", то проблем не будет. А если шаг влево, шаг вправо, то...

     

  15. Нашёл SuperObject, он из ~1500 JSON проглючил всего на 4-х. Хотя online парсеры эти 4 кушают без проблем. Уже результат. Но всё же хочется лучше. Не думал, что парсинг структурированного текста хоть как-то сложная задача...
     

  16. Кто поделится нормальным 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. Искать проблему в этом коде нет ни какого желания, слишком всё усложнено.

    В общем кто чем пользуется?


     

  17. http://www.fmxexpress.com/configure-android-system-settings-from-delphi-xe5-firemonkey/

    Там SCREEN_OFF_TIMEOUT, яркость по аналогии.

    P.S. Что бы перевести какой-то код с андоидовской явы на FireMonkey, я в гугле спрашиваю это словосочитание, плюс прибавляю FireMonkey. В данном случае что-то типа:

    Запрос

    Способ срабатывает в ~95%.



     

  18. Может где тему отдельную завести "исправляем ошибки в fmx сами", где наработки подобные собирать? Сегодня часа 4 убил, что бы найти ошибку разработчиков, что бы TLabel всегда выводил правильный шрифт после обновления информации в себе. Кому интересно, файл FMX.Objects.pas, procedure TText.DoSetText(const Value: string);Ищем строчку

    FLayout.LayoutCanvas := Canvas;

    после неё вставляем

    FLayout.Font := Self.Font;

     

×
×
  • Создать...