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

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


willi

Вопрос

При переходе на 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

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

Ага! - оказалось, по умолчанию - при отключенных опциях - линии просто выключены - позабыл я еще попробовать 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 эмодзи.

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

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

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

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