powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многоуровневые заголовки TDBGrid
23 сообщений из 23, страница 1 из 1
Многоуровневые заголовки TDBGrid
    #39837049
Prot_XT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем реализовал у себя рисование многоуровневых заголовков... основу взял отсюда: НеОбычный 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
Многоуровневые заголовки TDBGrid
    #39837077
Prot_XT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... скорее всего вряд ли в этом коде, кто разбираться будет... )))
Для себя набросок как это сделать набросал... не знаю правда на сколько он грамотен.
В идеале заголовки рисуются правильно только когда они все видны и на канве можно без проблем рисовать.
Если начинаем скроллить, пошла каша... скроллинг в обычном гриде осуществляется скачками по одной колонке.
Там где скролл переписан и плавный... такое конечно не пойдет.
Соответственно можно узнать каких колонок нет, посчитать их ширину и указать TRect рисуемого прямоугольника в заголовке смещение на ширину отсутствующих колонок.
Теперь вопрос... а как определить индекс первой, визуально видимой колонки?
...
Рейтинг: 0 / 0
Многоуровневые заголовки TDBGrid
    #39837264
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возьмите нормальный грид и не морочьте себе голову. Тот же ehlib.
ДБГрид - полнейший отстой, который можно только выкинуть.
...
Рейтинг: 0 / 0
Многоуровневые заголовки TDBGrid
    #39837267
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoДБГрид - полнейший отстой, который можно только выкинуть.
Почему же? На нем хорошо тренироваться, что выше упомянутая статья и показала. Может, ТС потом свой компонент напишет?

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

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


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

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

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

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

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

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

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


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