Страница 1 из 1

TDBGrid Свойства и методы

Добавлено: 05 сен 2019, 13:15
Frost
Для реализации творческих идей при создании дизайна таблицы (class TDBGrid) у нас есть почти все необходимое. Мы можем управлять цветом областей таблицы (ячеек) в разных состояниях; можем манипулировать вертикальными и горизонтальными линиями сетки таблицы в нефиксированной области - задавать их цвет, стиль и вообще видимость (GridLineColor, GridLineStyle, Options[dgColLines, dgRowLines] и др.). Но у нас нет доступа к линиям сетки в первой фиксированной строке (заголовок таблицы) например goFixedVertLine, goFixedHorzLine (https://wiki.freepascal.org/Grids_Reference_Page/ru#.D0.9F.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D1.8B_Options). Можно ли в будущих обновлениях получить такую возможность?

Кстати обнаружен баг, связанный с таблицей: https://forum.mydataexpress.ru/viewtopic.php?f=59&t=2998

P.S. Проблему пришлось "обойти", но это не является приемлемым решением. Вот, кстати, что получилось:

Скриншот 05-09-2019 122704.png
Скриншот 05-09-2019 122704.png (5.47 КБ) 1834 просмотра

TDBGrid Свойства и методы

Добавлено: 05 сен 2019, 21:41
admin
Пока не знаю. Надо посмотреть.

TDBGrid Свойства и методы

Добавлено: 05 сен 2019, 21:57
Develop-Soft
Frost писал(а):Проблему пришлось "обойти", но это не является приемлемым решением. Вот, кстати, что получилось:

А что это вы такое намудрили, можете код показать..?

TDBGrid Свойства и методы

Добавлено: 06 сен 2019, 10:19
Frost
Кода получилось на чуть более ста строк (чего только не сделаешь для достижения поставленной цели). Вместо этой "простыни" я, пожалуй, лучше опишу саму идею.

Итак, как я уже говорил, нам не доступны разделительные линии в фиксированной области (в области заголовка). По дефолту у меня на Win7 они рисуются черным цветом толщиной в 1px. Эта маленькая "визуальная деталь" вносит диссонанс в общий дизайн таблицы, выполненый в пастельных желтоватых тонах. Раз мы не можем влиять на заголовок - скроем его. Но нет... При скрытии заголовка возникает трабла с открытием записи из первой строки таблицы (см мой пост в начале). Хорошо, тогда просто накроем заголовок панелью и уже на ней нарисуем то что нам нужно (линии нужного вида и текст заголовков колонок). Выглядит отлично. Но топерь сложно манипулировать геометрическими размерами полученной таблицы, так как она состоит из двух элементов (TFormView и TPanel). Ок. Разместим их внутри еще одной панели TPanel (я назвал ее Substrate, что переводится как подложка). Теперь мы легко можем менять позицию таблицы и ее размеры. В результате этих манипуляций мы получили желаемый вид таблицы, но потеряли два важных свойства, а именно возможность менять ширину колонок перетаскиванием их границ мышью, а так же возможность смены сортировки, кликом по заголовку. Если первое свойство еще как то можно попробовать реализовать через свойство TPanel.OnMouseMove, то сортировку программно не реализовать вообще (см. ответ разработчика).

Позитивные мысли и идеи по предложенной теме приветствуются. С уважением, Frost.

TDBGrid Свойства и методы

Добавлено: 02 дек 2019, 15:36
Иван
Develop-Soft писал(а):
Frost писал(а):Проблему пришлось "обойти", но это не является приемлемым решением. Вот, кстати, что получилось:

А что это вы такое намудрили, можете код показать..?


Использовал подобную идею для вывода по 100 строк в подчиненную таблицу на форме выбора номенклатуры (вместо запроса), формированием SQL по ряду фильтров (объектов) и дереву запроса (группе и всем ее подгруппам). Выводим по 100 строк в подчиненную таблицу очень шустро. Так же кнопкой можно добавлять еще 100 записей и т.д. Осталось с той же сортировкой разобраться. Что б SQL из сортировкой и сразу этот вариант писать в таблицу.

Как вызвать событие при клике на заголовок, никак не разберусь как найти заголовок для скрипта что б использовать OnClick.

TDBGrid Свойства и методы

Добавлено: 02 дек 2019, 18:53
Develop-Soft

TDBGrid Свойства и методы

Добавлено: 08 дек 2019, 18:35
Иван
Develop-Soft писал(а):Только костылями.
Программная сортировка данных (Пост Develop-Soft #26493)


Хотел именно без сохранения данных, посмотрел, выбрал что нужно, закрыл. Придумал вариант. Если Scroll не крутить то все четко работает, так как привязка идет к "X" координате столбика. Если б понять как считать "X" ширину что увел влево Scroll можно и это обойти. В результате получаем по нажатию мышки по title событие в котором можно получать имя столбика. Это для SQL то что было нужно. По нему уже сортировка.

Код: Выделить всё

procedure gridcl (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var ArrG: array of integer; n, i: integer; TGrid: TdxGrid;
begin
 if (Button=mbLeft) and  (Y<TGrid.DefaultRowHeight) then
 begin
   TGrid:= dxGrid1;
   n:= TGrid.Columns.Count;
   SetLength(ArrG, n);

   for i:=0 to n-1 do
   if i=0 then ArrG[i] :=  TGrid.Columns[i].width else ArrG[i] :=  ArrG[i-1] + TGrid.Columns[i].width;

   for i:=0 to n-1 do
   begin
   if  i=0 then    begin if   X<ArrG[i]      then begin debug(TGrid.Columns[i].title.caption); exit; end; end else
   if  i>0 then    begin if  (X>ArrG[i-1])  and (X<ArrG[i]) then begin debug(TGrid.Columns[i].title.caption); exit; end; end else
   if  i=n-1 then begin if  (X>ArrG[i-1])  then begin debug(TGrid.Columns[i].title.caption); exit; end; end;
   end;
 end;
end; 

procedure Form_Create;
begin   
      dxGrid1.Options:=dxGrid1.Options + [dgAutoSizeColumns];
      dxGrid1.OnMouseUp:=@gridcl;   
end;