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

Лидеры

  1. Brovin Yaroslav

    Brovin Yaroslav

    Администраторы


    • Баллы

      15

    • Постов

      2 124


  2. Равиль Зарипов (ZuBy)

    Равиль Зарипов (ZuBy)

    Модераторы


    • Баллы

      2

    • Постов

      2 517


  3. AngryOwl

    AngryOwl

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


    • Баллы

      2

    • Постов

      394


  4. zairkz

    zairkz

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


    • Баллы

      1

    • Постов

      135


Популярный контент

Показан контент с высокой репутацией 17.06.2015 во всех областях

  1. Приступил к разработке клиента с использованием FireMonkey для форума. В будущем код будет открытым и каждый сможет посмотреть, как реализованы те или иные вещи. А пока пара скриншотов:
    9 баллов
  2. Сталкивались. По началу очень много)) Приложение, активно использующее GUI, то бишь всякие прогресс-бары, видео, большое кол-во элементов с картинками и т.д. и т.п., требует обязательного использования TThread.Synchronize. Иначе вы можете сначала ничего не заметить, может не быть никаких глюков и т.п.. А потом они могут так же внезапно появиться. Может быть такое, что у Вас их не будет (глюков), а на другом компе - будут. Может зависеть от множества факторов. НО! Стоит отметить, что если тот или иной элемент интерфейса не требует именно "моментального" отображения информации (например простое отображение нового значения TLabel), и в данный момент у Вас не происходит ничего активного на форме приложения (например - вывод видео или частая смена картинок и т.п.), то, конечно, делать синхронизацию не обязательно. Однако, это может привести в дальнейшем к непониманию возникновения багов, в том случае если ваш код изменится и появится что-то "тяжелое" для отрисовки. Эти баги могут быть не явными. Т.е. вы, например, делаете обновление TLabel при "загрузке" чего-либо и обновлении TProgressBar, а текст (новое значение) не отображается. А вот если сделать обновление TLabel и TProgressBar в TThread.Synchronize, то все будет ок. Тут есть еще одно НО ))) Оно заключается в том, чтобы процесс "обновления" был оптимизирован. Это как слишком частый вызов Application.ProcessMessage в процедуре выполняющий вычисления - будут приличные тормоза! Пишите код оптимально. Не делайте лишних вызовов TThread.Synchronize, но и не забывайте о них... Как-то так)
    2 балла
  3. Под андроидом нужно понимать, что есть следующие потоки: Main Thread - поток в Delphi, в котором все выполняется. Он же UI Thread в Delphi, в котором происходит отрисовка. UI Thread Java - поток на стороне Java, в котором выполняется отрисовка и работа со всеми нативными контролами. UI Thread Java <> UI Thread Delphi. То есть, если вы работаете с нативными контролами из Java, то вам нужно с ними работать из Java UI Thread. Для это нужно использовать методы из FMX.Helpers.Android: procedure CallInUIThread(AMethod: TMethodCallback); overload; procedure CallInUIThread(AMethod: TCallBack); overload; procedure CallInUIThreadAndWaitFinishing(AMethod: TMethodCallback); overload; procedure CallInUIThreadAndWaitFinishing(AMethod: TCallBack); overload; Если же вы работаете с FMX графикой, до достаточно выполнять обычный TThread.Synchronize и Queen
    2 балла
  4. Модифицируйте на здоровье. Мне не жалко :-)
    2 балла
  5. Выходит, если мы рисуем на одной канве из двух потоков и у нас одновременно открыты в каждом Canvas.BeginScene, то после прорисовки по Canvas.EndScene на канве отобразиться суммарная картинка? Исходя из реализации TCanvasGpu: function TCanvasGpu.DoBeginScene(const AClipRects: PClipRects; AContextHandle: THandle): Boolean; begin if FGlobalBeginScene = 0 then begin FCanvasHelper.SetContext(Context); FCanvasHelper.BeginRender; TTextLayoutNG.BeginRender; end else begin FCanvasHelper.Flush; FCanvasHelper.SetContext(Context); FContext.SetMatrix(TMatrix3D.Identity); FContext.SetContextState(TContextState.cs2DScene); FContext.SetContextState(TContextState.csAllFace); FContext.SetContextState(TContextState.csZWriteOff); FContext.SetContextState(TContextState.csZTestOff); end; Inc(FGlobalBeginScene); FSaveCanvas := FCurrentCanvas; if Assigned(FSaveCanvas) and FSaveCanvas.FClippingEnabled then FSavedScissorRect := FCanvasHelper.ScissorRect; FCurrentCanvas := Self; Result := inherited DoBeginScene(AClipRects) and Assigned(FContext) and FContext.BeginScene; if Result then begin FClippingEnabled := False; FCurrentClipRect := TRect.Create(0, 0, Width, Height); FCanvasHelper.ResetScissorRect; FCanvasHelper.UpdateDrawingMode; end; end; В частности из условия второго и последующих вхождений в DoBeginScene: if FGlobalBeginScene = 0 then ... else ... выходит, что если вошли второй раз, то происходит какой-то FCanvasHelper.Flush куда-то. Возможно и суммарная картинка отобразится. Надо пробовать. Но скорее всего сначала все-таки промелькнет первая отрисованная сцена, а за ней вторая, но уже без изменений в первой сцене. Да, для одновременного рисования на одной канве наверное нужны методы блокировки части изображения. По-моему такие то ли в winapi, то ли в gdi видел.
    1 балл
  6. Ну вам выше вроде ответили, если не хотите лагов интерфейса то используюте синхронизацию
    1 балл
  7. Пока план такой. Сделать нормальный настольный клиент. А потом адаптировать под мобильный версии. Но адаптация скорее всего будет написание отдельного UI. Так как идеалогии разные. Но для iOS и Android скорее всего клиент будет один.
    1 балл
  8. zairkz

    argument out of range

    Что то я по описанию не увидел проблему, сделал проект такой же все работает TestLV Вызываю очищение и добавления ListView по нажатию ListBoxItem'a. while ListView1.ItemCount>0 do ListView1.Items.Delete(0); ListView1.BeginUpdate; for i := 0 to 50 do ListView1.Items.Insert(0).Text:='Text - '+i.ToString; ListView1.EndUpdate; На счет удаления из ListView компонента по нажатию, то есть из самого себя, есть проблемка, не сбрасывается ссылка на Item, пришлось обходить её через таймер (1 мс) Сохраняю Aitem.index в глобальную переменную и по таймеру удаляю Итем по индексу, потом выключаем таймер. Незнаю на сколько это правильно, но все работает и меня устраивает. В проекте выше есть
    1 балл
  9. Равиль Зарипов (ZuBy)

    [fmx] XML RPC API

    XML RPC API - модуль для работы с форумом fire-monkey.ru Реализованы все методы (спасибо Ярославу Бровину) модуль кроссплатформенный, для Windows можно использовать MSXML, также поддерживается OXml для мобильных платформ XML RPC API.zip
    1 балл
  10. В FMX работа с канвой принципиально отличается от работы в VCL. В VCL канва была у каждого оконного контрола своя. В FMX одна канва на все контролы в одной форме. Несколько важных фактов, которые помогут вам: Канва одна на всю форму и на все контролы формы. Из пункта 1 следует - Значит каждый контрол рисует себя на одной общей канве При передачи управления на отрисовку контролу, канве задаются настройки (матрица трансформации, кисти и тд) таким образом, чтобы отрисовка выполнялась в локальных координатах контрола. Значит если вы рисуете в другом месте, то отрисовка выполняется в глобальных координатах формы. По этому отрисовку нужно выполнять в абсолютных координатах (координатах формы) Прямую отрисовку на форме нельзя выполнять по нажатию на кнопку. Так как в FMX есть четкая последовательность фаз отрисовки. Места отведенные для рисования - это событие OnPaint. В противном случае, не гарантируется корректная отрисовка на всех платформах.
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...