Перейти к содержанию
  • Регистрация
  • 0
willi

Особенности TGrid в Delphi 10.1 Berlin (XE10)

Вопрос

При переходе на Delphi 10.1 Berlin (FMX) с XE8  возникает много "интересных" нюансов с TGrid:

1. У меня все(!) внутренние ячейки выводятся с отступом в 3px (я перерисовываю их в событии OnDrawColumnCell)  от всех сторон - при этом внутри уже по умолчанию используется отсечка по области рисования (т.е. если задать большую область для, к примеру, FillRect - всё равно будет заполняться только с отступом 3px) - мое решение - локально создать
  var L_Rects:TClipRects;  и var L_Bounds:TRectF;
 --------->  L_Bounds:=Bounds;
  L_Bounds.Inflate(3,3); // ! - компенсировать отступ
  SetLength(L_Rects,1);
  L_Rects[0]:=L_Bounds;
  /// - далее
  with aGrid do
   try
    Canvas.BeginScene(@L_Rects); // !!

..... рисуем на Canvas

 finally Canvas.EndScene; SetLength(L_Rects,0);
end;

2. Из Published исчезло событие OnApplyStyleLookup - приходится вызывать его где-то при показе таблицы вручную...

3. Также исчезли события OnMouseUp  и OnMousDown  - похоже на прокол разработчиков - они есть в Public - их нужно прицеплять в коде выставляя их на свои методы формы (параметры методов такие же как и в XE8).

4. LiveBinding у меня не работает для полей с Blob - картинками - при вызове OnDrawColumnCell - для такого вида привязки параметр const Value: TValue  или пустой, или (в зависимости от стиля столбца) содержит строку "(Object)" - как показать в таблице blob-поле - картинку  в XE10 с помощью Livebinding я так и не понял... :(
5. Непонятно зачем нужно событие OnDrawColumnBackground - по-моему, оно никогда не срабатывает - совместимость со старыми версиями?
____________

Напишите, если кто-нибудь сталкивался с этими моментами и нашел какой-то другой ответ - хотелось бы использовать LiveBinding как в XE8 и ранних версиях...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

все вопросы к @RoschinSpb, он разработчик этого компонента

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

1. У колонки можно менять свойство Padding.
2. Grid теперь может быть и стилевым и нативным. В нативном этого события быть не может. Чтобы работать со стилями см. стилевое представление грида TStyledGrid в модуле FMX.Grid.Style.pas. 
3. По моему мнению проколом было наличие этих свойств в публичной секции. Grid это составной компонент, он неким образом самостоятельно реагирует на события мыши, если Вы будете делать что-то своё, то ваши действия могут войти в противоречие со стандартным поведением этого компонента и непредсказуемым последствиям. Поскольку грид переписан чуть менее чем полностью я посчитал, что это хороший повод убрать потенциальную уязвимость, здесь указаны все упраздненные события. В этом обсуждении я пытался объяснить что можно сделать.
4. По этому поводу трудно что-то сказать навскидку, пишите в QC, не забудьте приложить простой воспроизводимый пример.
5. Да, дело в совместимости. Фон может содержать картинку, поэтому по умолчанию все ячейки прозрачные. Но, если добавить AlternatingRowBackground в Options, то событие будет вызываться. Также оно вызывается при появлении редактора. Вообще сильно рекомендую посмотреть демку GridDemo, там можно в run-time менять настройки и смотреть в логе все приходящие события.

GridDemo.png

Еще здесь я что-то писал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Спасибо за информацию B) - я скачал демку - но там особенность в том, что картинки хранятся в TImageList  - а в качестве переменной для столбца TGrid - индекс этого списка,как я понял...  ---   меня же интересовала ситуация с Blob-картинками в полях  - например, как в старых примерах с рыбками - в XE8 та же табличка у меня с Blob работала - я постараюсь сделать отдельный воспроизводимый пример...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 14.10.2016 в 18:42, willi сказал:

Спасибо за информацию B) - я скачал демку - но там особенность в том, что картинки хранятся в TImageList  - а в качестве переменной для столбца TGrid - индекс этого списка,как я понял...  ---   меня же интересовала ситуация с Blob-картинками в полях  - например, как в старых примерах с рыбками - в XE8 та же табличка у меня с Blob работала - я постараюсь сделать отдельный воспроизводимый пример...

Как я понимаю, BlobType должно быть ftGraphic
Graphic.png

GraphicField.png

Live Binding это не мой конек.

fsBitmap.jpg

Изменено пользователем RoschinSpb
недокопировал картинку

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вот пример с блобами - как видно есть по умолчанию отступ и не работает перерисовка по событию - OnDrawColumnCell  - я привожу вариант этого обработчика как в ХЕ8  - но Value - в данном случае - это не объект - и видно только закрашенный прямоугольник...   Вверху над таблицей я добавил TImageControl - у него при проходе по таблице поле отображается корректно (привязка LIveBinding)

Min_test.zip

 

(Кстати - если не использовать обработчик - выводятся пустые ячейки столбца с блобом)

Изменено пользователем willi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

А вот какой эффект получается при добавлении в событие:
Padding=0  -->
 CoLumn.Padding.Rect:=rectF(0,0,0,0);
      Canvas.Fill.Color:=TAlphaColorRec.Green;
      Canvas.FillRect(Bounds,0,0,[],1);
      Canvas.Stroke.Color:=TAlphaColorRec.red;
      Canvas.DrawRect(Bounds,0,0,[],1);
Как видно -- все равно остается некоторое пространство вокруг ячеекSacee.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
8 часов назад, willi сказал:

в данном случае - это не объект

Вы меняли значение BlobType как я предложил в предыдущем сообщении? У меня работает

      ///  Эта часть не работает!
      ///
      if (Value.IsEmpty=false) and (Value.IsObject=true) then  
       begin
//         LB:=TBlobField(Value.AsObject); // ужос!!!
//         LB.SaveToStream(LStr);
//         LBM:=FMX.Graphics.TBitmap.CreateFromStream(LStr);
//          try
//            Canvas.DrawBitmap(LBM,RectF(0,0,LBM.Width,LBM.Height),Bounds,1);
//            finally
//            LBM.Free;
//          end;
         LBM := TBitmap(Value.AsObject);
         Canvas.DrawBitmap(LBM,RectF(0,0,LBM.Width,LBM.Height),Bounds,1);
       end;
      ///
      ///
      ///

И вообще без обработчика события тоже всё рисуется.

Цитата

Как видно -- все равно остается некоторое пространство вокруг ячеек

Это некоторое расстояние называется разделительная линия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
procedure TForm18.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
  const Column: TColumn; const Bounds: TRectF; const Row: Integer;
  const Value: TValue; const State: TGridDrawStates);
///
 var LB:TGraphicField;
     LBM:FMX.Graphics.TBitmap;
begin
  if Column.Index=1 then
   begin
     try
      Canvas.BeginScene;
      CoLumn.Padding.Rect:=rectF(0,0,0,0);
      Canvas.Fill.Color:=TAlphaColorRec.Green;
      Canvas.FillRect(Bounds,0,0,[],1);
      Canvas.Stroke.Color:=TAlphaColorRec.red;
      Canvas.DrawRect(Bounds,0,0,[],1);
      if (Value.IsEmpty=false) and (Value.IsObject=true) then
       begin
         LB:=TGraphicField(Value.AsObject);
          LBM:=FMX.Graphics.TBitmap.Create;
          try
            LBM.Assign(LB);
            Canvas.DrawBitmap(LBM,RectF(0,0,LBM.Width,LBM.Height),Bounds,1);
            finally
            LBM.Free;
          end;
       end;
      finally
        Canvas.EndScene;
      end;
   end;
end;

Спасибо Сергею Рощину - получилось. :) Действительно, нужно обязательно указать тип поля  ftGraphic в свойстве BlobType у полей таблицы TFDMemTable   -   Причем, мне пришлось заново перезацепить LiveBinding для таблицы и чуть подправить код  события - см. выше  -у меня в старом моем варианте для поля ftGraphic выдавалась AV на чтение потока (позже посмотрю - почему).

Изменено пользователем Brovin Yaroslav
Отформатировал код

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

2. В отношении разделительных линий:

Я отключил прорисовку линий в Options   TGrid - при этом прямоугольник заполняется полностью - границ нет, однако, в этом режиме (таблица без линий) есть другая особенность: любые команды типа Canvas.DrawRect  Canvas.DrawLine  Canvas.Draw...   ничего на канву не выводят - т.е. границу так не нарисовать.    Это - если кто-то столкнется со странностями при прорисовке каких-то контуров в ячейках...    

Vitaldj  см. пункт 1 в моем первом сообщении этой темы

 

Изменено пользователем willi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
10 часов назад, willi сказал:

т.е. границу так не нарисовать. 

double_facepalm11.png А так Canvas.Stroke.Kind := TBrushKind.Solid ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Ага! - оказалось, по умолчанию - при отключенных опциях - линии просто выключены - позабыл я еще попробовать Kind=Solid -_-      В общем - пока у меня локальный вывод: при рисовании ячеек в TGrid очень желательно выставлять полностью всё перед началом вывода на Canvas:  включая также Padding=0.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 часа назад, willi сказал:

Ага! - оказалось, по умолчанию - при отключенных опциях - линии просто выключены

Нету в канве ни чего по умолчанию. Что было в предыдущем рисовании то и осталось. Т.е. в общем случае значение Kind считаем неопределенным, хотя часто бывает что Kind=Solid поэтому на него обычно забивают, но это неправильно.

Вариант

         LBM := TBitmap(Value.AsObject);
         Canvas.DrawBitmap(LBM,RectF(0,0,LBM.Width,LBM.Height),Bounds,1);

у вас не работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От x0k
      Berlin android 4.2.2

      После заполнения edit'а каретка смещается на пару символов влево, хотя стоит в конце строки, HorzAlign = Trailing.
      Как можно исправить или чем лучше заменить edit ?
    • От zekelive
      Кто работал с DS, подскажите, как реализовать автоматическое переподключение к серверу после тайм-аута? Пробовал кучу вариантов, но не могу отловить момент отключения даже, да и тайм-аут не настраивается. Параметр есть, но реагировать на измененные значения не хочет.
    • От Alexey Shumkin
      Для работы с USB-устройствами (на девайсах с USB-хостом) нужно использовать BroadcastReceiver.
      Нашёл пример работы с ними (https://github.com/freeonterminate/delphi/tree/master/BroadcastReceiver). 
      Проверял на XE10. Долго мучался с проверкой, пока не выяснилось, что под XE7 работает, а под XE10 - нет.
      Выдаёт ошибку "Interface not supported" в момент создания JFMXBroadcastReceiver (или около того, точно непонятно).
      Для демонстрации я создал отдельный простой проект - https://github.com/ashumkin/Delphi-Android-BroadcastSample.
      В XE7 он работает (при нажатии на кнопку Register вешается слушатель, который ловит и выводит в лог (см. adb logcat) события включения/выключения экрана). А в XE10 - выдаёт вышеупомянутую ошибку "Interface not supported".
      В логах есть строки
      W/dalvikvm(31735): dvmFindClassByName rejecting 'com/embarcadero/firemonkey/broadcast/FMXBroadcastReceiverListener'
      W/dalvikvm(31735): dvmFindClassByName rejecting 'com/embarcadero/firemonkey/broadcast/FMXBroadcastReceiver'
      (но они есть и при запуске приложения, собранного в XE7)
      Пробовал по-разному: и удалял AndroidManifest.template.xml от XE7, и пересоздавал .dproj в XE10, - пофик.
      В чём засада?
    • От umkes
      Всем привет!
      Не подскажите как правильно заменять текст в Notification?
      Хочется выводить туда таймер, а оно все время всплывает.
      И еще вопрос как отключить вибрацию и сделать так чтоб нельзя было закрыть этот Notification (например как скайп, ты его тянешь, а он не тянется ) 
    • От beklexx
      Подскажите пожалуйста, почему свойство onChangeRepainted у ListView не работает на XE10?
      Надо изменить какое свойство, или это баг?
       
      PS. На XE5 нормально отрабатывало после прорисовки анимации нажатия на итем, а сейчас печаль.
    • От alexbirukov
      И так, пока русскоязычная и англоязычная части интернета молчат по поводу работы в новой Delphi XE10 Seattle в связке с xCode 7, а компании представители описывают, какое замечательное вышло обновление, пользователи столкнулись с проблемой, что приложения, сделанные на XE10 Seattle, xCode 7 + SDK9, не запускаются на предыдущих платформах.
      Не совсем понятно, почему в упомянутых сегментах интернета нет совершенно никакой информации по данному поводу. Опять впереди планеты все Китай.
      Пользователь блога подробно описывает конфигурацию, на которой он тестировал запуск приложения и описание проблемы. Несколько реальных устройств на разных прошивках, разные версии ПО и пр.
      Коротко о главном. Если вы хотите, как можно скорей перейти на новую Delphi XE10 Seattle с целью писать свежие приложения\обновления для iOS, спешу вас разочаровать. Ваши программы перестанут работать на предыдущих версиях iOS. Статистика испытаний такова, что приложения собранные на XE10 Seattle, xCode 7 + SDK9 будут работать только на устройствах под управлением iOS9.
      Вторая проблема, состоит в том, что недавнего времени AppStore при проверке приложений стала проверять их именно на iOS 9, а приложения собранные на XE8.1 такую проверку не проходят, так как зависают на стартовой заставке приложения и как следствие их отклоняют. Вот так то. Прошла уже целая неделя, а интернет по данному поводу ничего сказать нам особо не может.
      На днях появилась статья от Сарины Дю Понт, о том, как всё же запустить приложение сделанные в XE8.1 на iOS9.
      В результате изысканий Китайских друзей, получаем на данный момент такую картину:
      XE8 + iOS 6 = полёт нормальный
      XE8 + iOS 7 = полёт нормальный
      XE8 + iOS 8 = полёт нормальный
      XE8 + iOS 9 = зависание на экране заставки (если не воспользоваться советом Сарины)
      XE10 + iOS 6 = приложение вылетает
      XE10 + iOS 7 = приложение вылетает
      XE10 + iOS 8 = приложение вылетает
      XE10 + iOS 9 = полёт нормальный
      Таким образом в XE10 Seattle и xCode 7 можно получить на данный момент только приложение, работающее на iOS9.
      Ждём Delphi XE10 Seattle Update 1.
      P.S. А в на Android в Delphi XE10 Seattle приложение с компонентами для отправки Push не запускается в режиме Release — Application Store. Что тоже, очень и очень печально.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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