Последняя версия DataExpress 3 beta от 15 сентября 2020 года.

Изображение Скачать | Изображение Что нового?



Объявление:

Если вам понравилась программа и вы ее интенсивно используете - замолвите словечко о ней на вашем сайте (блоге, форуме, твитере, краской на подъезде, ютуб-канале и т.д.) с активной (по-возможности) ссылкой на сайт программы/форум. Тем самым вы можете внести небольшой вклад в seo-карму проекта в виде входящих ссылок.
Спасибо! Администрация :)


>> Обсудить <<

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

Все вопросы, связанные с написанием скриптов и SQL-запросов.
Frost
Эксперт
Сообщения: 17
Зарегистрирован: 12 апр 2017, 13:17

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

Сообщение Frost » 05 сен 2019, 13:15

Для реализации творческих идей при создании дизайна таблицы (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 КБ) 1752 просмотра

Аватара пользователя
admin
Разработчик
Сообщения: 5196
Зарегистрирован: 14 мар 2016, 11:32
Откуда: Ленинградская
Благодарил (а): 41 раз
Поблагодарили: 341 раз

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

Сообщение admin » 05 сен 2019, 21:41

Пока не знаю. Надо посмотреть.

Аватара пользователя
Develop-Soft
Сообщения: 1839
Зарегистрирован: 05 мар 2019, 18:09
Благодарил (а): 122 раза
Поблагодарили: 502 раза
Контактная информация:

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

Сообщение Develop-Soft » 05 сен 2019, 21:57

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

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

Frost
Эксперт
Сообщения: 17
Зарегистрирован: 12 апр 2017, 13:17

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

Сообщение Frost » 06 сен 2019, 10:19

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

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

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

Аватара пользователя
Иван
Интересующийся
Сообщения: 206
Зарегистрирован: 22 дек 2018, 14:16
Откуда: Kiev
Благодарил (а): 31 раз
Поблагодарили: 49 раз

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

Сообщение Иван » 02 дек 2019, 15:36

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

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


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

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

Аватара пользователя
Develop-Soft
Сообщения: 1839
Зарегистрирован: 05 мар 2019, 18:09
Благодарил (а): 122 раза
Поблагодарили: 502 раза
Контактная информация:

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

Сообщение Develop-Soft » 02 дек 2019, 18:53


Аватара пользователя
Иван
Интересующийся
Сообщения: 206
Зарегистрирован: 22 дек 2018, 14:16
Откуда: Kiev
Благодарил (а): 31 раз
Поблагодарили: 49 раз

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;           


Вернуться в «Программирование в DataExpress»