Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многоуровневые заголовки TDBGrid / 23 сообщений из 23, страница 1 из 1
13.07.2019, 07:45
    #39837049
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
В общем реализовал у себя рисование многоуровневых заголовков... основу взял отсюда: НеОбычный TDBGrid .

Вот основные процедуры рисования заголовков оттуда:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
  Procedure DrawSubHeader(ACol : Integer; Canvas : TCanvas);
  Var HRect : TRect;
  Begin				   
    // Получаем прямоугольник, объединяющий несколько колонок,
    // для которых рисуем сложный заголовок
    HRect:=GetHeaderRect(ACol);
    // По высоте берем только часть прямоугольника 
    // так как вторая часть — обычный заголовок
    HRect.Bottom:=RectHeight(HRect) div TITLE_SUBHEADER;
    Canvas.FillRect(HRect);

    // Вписываем текст,
    // который получаем методом GetHeaderText
    InflateRect(HRect,-1,-1);
    WriteText(Canvas, HRect, GetHeaderText(ACol) , taCenter);
	
    // Рисуем 3D-окантовку 
    Paint3dRect(Canvas.Handle,HRect);
  End; 

Function TexDBGrid.GetHeaderRect(ACol : Integer) : TRect;
Var MasterCol   : TColumn;
    Index,Shift ,
    Count,i     : Integer;
Begin		   
  // Если в опциях отключен показ сетки, это нужно учесть при расчете 
  // общего прямоугольника
  IF [dgColLines] * Options = [dgColLines] Then Shift:=1
  Else Shift:=0;

  Index:=ACol;
  Count:=1;				
  // получаем информацию для текущей колонки грида:
  // в какой объединяющий блок она входит 
  // Index — с какой колонки начинается объединяющий блок
  // Count — сколько колонок он включает
  IF Assigned(FOnGetHeaderRect) Then FOnGetHeaderRect(ACol, Index, Count);

  IF Index+Count-1 > Columns.Count-1 Then
  Begin
    Index:=ACol;
    Count:=1;
  End;
  
  // В результате нужно получить прямоугольник, состоящий из
  // всех, включенных в объединенный блок колонок
  Result:=CalcTitleRect(Columns[Index],0,MasterCol);

  For i:=Index+1 To Index + Count -1 Do
  Result.Right:=Result.Right + RectWidth(CalcTitleRect(Columns[i] ,0,MasterCol)) + Shift;

End;

Const
   GeoColumns   = 3;
   ParamColumns = 2;
...   
//----------------------------------------------------------------------------------------
// Получить для текущей колонки информацию о том, в какое объеденение колонок она попадает
//----------------------------------------------------------------------------------------
procedure TfExDBG.GetHeaderRect(ACol: Integer; var IndexStart,  Count: Integer);
begin
  IF ACol < GeoColumns
  Then Begin
         IndexStart:=0;
         Count:=GeoColumns;
       End
  Else Begin
         IndexStart:=GeoColumns;
         Count:=ParamColumns;
       End
end;


То есть заголовок рисуется с индекса колонки и количество колонок, которые туда входят, в принципе все работает. Однако есть существенный недостаток... при горизонтальном скроллинге, когда часть таблицы уходит влево, объединенный заголовок перерисовывается заново и считает, что колонка от которой должен быть старт рисования прямоугольника всегда остается у края... никуда не смещаясь за границы экрана. В итоге визуально заголовок плывет и перемещается вместе со скроллом, "оставаясь" на месте и потом пытаясь "наползти" и перерисоваться в ячейках, где он вообще не должен быть. Заголовок должен уйти за пределы отображаемого грида.

Не могу понять, как можно поправить, чтобы объединенный заголовок отрисовался нормально.
...
Рейтинг: 0 / 0
13.07.2019, 13:41
    #39837077
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
Ну... скорее всего вряд ли в этом коде, кто разбираться будет... )))
Для себя набросок как это сделать набросал... не знаю правда на сколько он грамотен.
В идеале заголовки рисуются правильно только когда они все видны и на канве можно без проблем рисовать.
Если начинаем скроллить, пошла каша... скроллинг в обычном гриде осуществляется скачками по одной колонке.
Там где скролл переписан и плавный... такое конечно не пойдет.
Соответственно можно узнать каких колонок нет, посчитать их ширину и указать TRect рисуемого прямоугольника в заголовке смещение на ширину отсутствующих колонок.
Теперь вопрос... а как определить индекс первой, визуально видимой колонки?
...
Рейтинг: 0 / 0
14.07.2019, 21:11
    #39837264
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
Возьмите нормальный грид и не морочьте себе голову. Тот же ehlib.
ДБГрид - полнейший отстой, который можно только выкинуть.
...
Рейтинг: 0 / 0
14.07.2019, 21:25
    #39837267
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
L_argoДБГрид - полнейший отстой, который можно только выкинуть.
Почему же? На нем хорошо тренироваться, что выше упомянутая статья и показала. Может, ТС потом свой компонент напишет?

зы. Кстати, ЭхЛиб грид изначально наследовался от дбгрида, лишь потом Большаков его заново от CustomControl переписал.
...
Рейтинг: 0 / 0
14.07.2019, 22:39
    #39837271
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
L_argoВозьмите нормальный грид и не морочьте себе голову. Тот же ehlib.
ДБГрид - полнейший отстой, который можно только выкинуть.

+100, "стандартный" только для демок годится.
...
Рейтинг: 0 / 0
15.07.2019, 08:29
    #39837309
Мигалка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
в стандартном дбгриде есть всякие сложные заголовки. но нужен специально обученный датасет. в д5 есть демка alchtest.dpr
...
Рейтинг: 0 / 0
15.07.2019, 09:52
    #39837324
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
Большое спасибо конечно, но я не ставил вопрос, а какой грид обладает той или иной фичей...
Я и так знаю... Меня интересует правильная реализация рисования компонентов самому.
Зачем мне это нужно... оставим это мне )))
Инфы просто об этом нуль...
...
Рейтинг: 0 / 0
15.07.2019, 12:19
    #39837400
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
Prot_XTИнфы просто об этом нуль...... или кто-то не умеет искать. Целые книги есть по созданию компонентов.
...
Рейтинг: 0 / 0
15.07.2019, 13:24
    #39837423
Мигалка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
а вообще, это идеологически неправильно - рисовать в других ячейках. надо чтоб каждая из объединённых ячеек могла отрисовать на себе кусочек общей ячейки. тогда при скроллинге всё автоматом правильно нарисуется
...
Рейтинг: 0 / 0
16.07.2019, 10:07
    #39837739
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
Мигалка ,
Уф... спасибо за мысль... а то я что-то в дебри полез. Хотел сдвиг вычислять и т.д.
Короче обрабатываю исключительно ячейку, если визуально все ячейки входящие в блок видны, то рисую полный многоугольник (объединяю ячейки которые входят в блок),
если часть ячеек уехала... выкидываю эту часть из большого многоугольника и рисую его на оставшихся частях...
Все идеально работает!
Теперь еще одна проблема осталась... текст в объединенной ячейке...
Я его вписываю в прямоугольник:
Код: pascal
1.
 WriteText(Canvas, Rect, Caption, taCenter);


Однако... ну он всегда тупо по центру... гы гы
А надо то эмулировать, что он уезжает влево при скролле.
Есть какие-нить мысли, что можно придумать?
...
Рейтинг: 0 / 0
16.07.2019, 11:09
    #39837766
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
Prot_XTчто можно придумать?А зачем ? Вы зря тратите время.
...
Рейтинг: 0 / 0
16.07.2019, 11:19
    #39837780
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
white_niggerЦелые книги есть по созданию компонентова какие кстати могли бы порекомендовать разработчики комплексных компонент?
...
Рейтинг: 0 / 0
16.07.2019, 11:44
    #39837796
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
L_argo ,
Уважаемый...
Вы позволите мне самому решать, зря я трачу время или нет?
Большое спасибо.
...
Рейтинг: 0 / 0
16.07.2019, 12:01
    #39837809
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
vavanа какие кстати могли бы порекомендовать разработчики комплексных компонент?По компонентам для начинающего любая книжка подойдёт. По графике GDI лучше Фень Юаня врятли что найдешь. А дальше уже смотря куда двигаться захочет
...
Рейтинг: 0 / 0
16.07.2019, 12:13
    #39837821
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
L_argoВозьмите нормальный грид и не морочьте себе голову.
+1

Стандартные компоненты из коробки - это прошлый век и разработчики их даже не пытаются улучшить
...
Рейтинг: 0 / 0
16.07.2019, 17:09
    #39837975
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
X11Стандартные компоненты из коробки - это прошлый век и разработчики их даже не пытаются улучшить
ага, скоро введут новую специальность: программист на devexpress.
...
Рейтинг: 0 / 0
16.07.2019, 18:04
    #39838019
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
ДокX11Стандартные компоненты из коробки - это прошлый век и разработчики их даже не пытаются улучшить
ага, скоро введут новую специальность: программист на devexpress.
Ну ч0... в тему... прикольна ))) жги исч0.
...
Рейтинг: 0 / 0
16.07.2019, 22:00
    #39838086
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
Prot_XTДокпропущено...

ага, скоро введут новую специальность: программист на devexpress.
Ну ч0... в тему... прикольна ))) жги исч0.
Ну ты хоть объясни, ради чего эти прыжки и ужимки со "стандартным дбгрид".
...
Рейтинг: 0 / 0
17.07.2019, 06:53
    #39838139
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
Да все, тему можно закрывать... в принципе не так уж и сложно все было.
Все фунциклирует так как нужно...
А я люблю, когда работает так, как нужно мне.
Всем спасибо. )))
...
Рейтинг: 0 / 0
18.07.2019, 02:19
    #39838527
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
ёёёёёНу ты хоть объясни, ради чего эти прыжки и ужимки со "стандартным дбгрид".
Во-первых, это интересно и отвлекает от рутины. Во-вторых, почему ужимки, если это работает и приносит пользу и удовлетворение от проделанного? В-третьих, всё что-то более-менее серьёзное стоит серьезных денег. В-четвертых, вот так по мелочи то одно подпилишь, то другое, и в целом получается достаточно много за 20 лет-то, и даже когда смотришь на навороченные компоненты за деньги, то понимаешь, что и там придется как-то подстраиваться, а что-то - непонятно как делать, а может и нет вовсе, и жуть как неохота всё у себя под это ломать.

Что-то у меня не срослось в своем гриде с отрисовкой только в своей ячейки той части, которая требуется, как-то при горизонтальном скроллинге часть отрисовки то там, то сям терялась. Так что пока приходится залазить на соседние ячейки. Жутко стыдно, но работает, вроде. Надо собраться как-нибудь и поправить.
...
Рейтинг: 0 / 0
18.07.2019, 08:43
    #39838562
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
V.BorzovЧто-то у меня не срослось в своем гриде с отрисовкой только в своей ячейки той части, которая требуется, как-то при горизонтальном скроллинге часть отрисовки то там, то сям терялась.
Когда при скролле часть отрисовки "теряется то там то сям"... это означает, что прямоугольники рисуются неправильно. Они могут налазить друг на друга, пытаться друг друга перерисовать или вообще не отрисовываться и там или черный цвет будет или вообще не пойми что. Нужна отладка и понимание, что происходит. Я для этого делал отрисовку прямоугольников на форме и смотрел, что там вообще рисуется. Потому что в рамках рисования на отдельно взятой колонке трудно понять.
Приведенная статья в начале поста всего лишь пример с чего я брал идею, там мало чего общего осталось. Но ключевая функция объединения заголовков
Код: pascal
1.
2.
function TCustomDBGrid.CalcTitleRect(Col: TColumn; ARow: Integer;
  var MasterCol: TColumn): TRect;

присутствует и у меня.
Она вычисляет Rect по любой колонке входящей в блок.
В принципе при условии наследования от TCustomGrid с его вариантом скролла вполне хватает. Наверное если переделывать скролл, то наверное надо почти все самому рисовать, переписывать...
...
Рейтинг: 0 / 0
18.07.2019, 16:50
    #39838869
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
Prot_XT,

Собственно, не знаю, что у меня там не получалось с отрисовкой, сейчас поправил как хотел, с использованием intersectcliprect, завернутым в savedc и restoredc, всё работает, никаких артефактов, недорисовок и наложений. Таким образом, когда рассчитываем заголовок, распространяющийся на несколько колонок, то рисуем его полностью на столько колонок, на сколько он распространяется, при обновлении данных по каждой колонке, хоть за край экрана, а фактически он будет прописан внутри области, выделенной под эту колонку. Ну, только на вертикальные линии внутри заголовка надо наложение не забыть сделать. Правда, тут я переписал вообще всю функцию paint, и линии в заголовках рисую не заранее, как в стандарте, а по мере отрисовки каждой ячейки, а не как в той статье...

Кстати, если я правильно понял здесь про текст и скроллинг, то хочу отметить, что лучше выглядит, когда текст общего для ячеек заголовока, если его часть ушла за границы видимости, отрисовывается целиком в оставшейся видимой области, и центрировался по центру. Хотя это, может, дело вкуса уже.
...
Рейтинг: 0 / 0
19.07.2019, 07:06
    #39839016
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневые заголовки TDBGrid
V.BorzovProt_XT,
Кстати, если я правильно понял здесь про текст и скроллинг, то хочу отметить, что лучше выглядит, когда текст общего для ячеек заголовока, если его часть ушла за границы видимости, отрисовывается целиком в оставшейся видимой области, и центрировался по центру. Хотя это, может, дело вкуса уже.
Да... я это уже после понял... когда стал использовать в работе и заполнял огромную портянку с кучей разнообразных заголовков... порой сверху и не поймешь визуально что это, иной раз приходится туда-сюда дергать. А так действительно лучше.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многоуровневые заголовки TDBGrid / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]