С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297

Особенности отображения таблицы данных TDBGrid от разных провайдеров

11.02.2024, 20:52. Показов 1579. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть таблица БД SQLite и есть два проекта: в одном провайдером выступает TADOTable, а в другом TFDTable.
Есть задача в DBGrid строки рисовать разными цветами. Для этого свойство TDBGrid(sender).DataSource.DataSet.RecNo проверяется на четность. Так вот, в первом случае при событии перерисовки ячейки GridDrawColumnCell это свойство идет по порядку (1, 2, 3...n), а во втором просто сразу n. Почему так и можно во втором случае что-то исправить?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.02.2024, 20:52
Ответы с готовыми решениями:

Можно ли указать для разных Access баз разных ADo провайдеров?
В ADO нужно указывать провайдера. Можно ли указать для разных Access баз разных провайдеров? P.S. для Access 2000 -...

При разных вариантах заполнения таблицы результат отображения изменяется в одном браузере
Доброго времени суток! У меня есть таблица которая заполняется json объектами, в одном случае данные тянутся из скрипта, в другом из файла,...

Несколько шлюзов от разных провайдеров
Друзья, прошу помощи. Есть машина шлюз, на ней 3 сетевые карты. 192.168.0.150-смотрит в сеть с доменом ...

25
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,356
Записей в блоге: 3
12.02.2024, 07:18
Цитата Сообщение от t232006 Посмотреть сообщение
в одном провайдером выступает TADOTable, а в другом TFDTable.
Провайдер в текущем контексте - поставщик данных. Ни TADOTable, ни TFDTable таковыми не являются - это не более чем компоненты, формирующие набор данных, которые провайдер, как правило - движок какой-либо СУБД, предоставил. Так что, если хотите, чтобы Вас понимали - не изобретайте своих терминов, а существующие выучите и пользуйтесь ими по назначению.

По сабжу: у Вас ошибка в 88-й строке
Это, если что, принятый на форумах намек на то, что проблема в Вашем коде и не худо бы Вам его показать, т.к. без него любой ответ будет не более чем гаданием на кофейной гуще.

Хотя проблема, скорее всего (вот, гадание начинается !!!) в сортировке данных. При использовании компонентов T...Query Вы, записывая свой SQL-запрос, можете сами влиять на то, как и по какому полю/полям будет отсортирован получаемый набор данных. В случае же с T...Table Вы никак на режим сортировки повлиять не можете, поэтому ориентироваться по номеру записи в наборе - это не самая лучшая идея...) Поэтому данный инструмент (T...Table), лично я просто никогда не использую: мало того, что он с сортировкой непредсказуем, так он еще может работать только с одной таблицей БД и, вдобавок, тянет на клиента ВСЁ! содержимое этой таблицы. При наличии хотя бы 1000000000 записей и не очень шустрого канала связи с удаленной СУБД процесс получения данных может занять весьма длительное время.
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
12.02.2024, 10:26  [ТС]
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.GridDrawColumnCell(Sender: TObject; const Rect2: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
  var style,rl,rr,rt,rb:integer; rect1:TRect;
begin
if odd(TDBGrid(sender).DataSource.DataSet.RecNo) then
  TDBGrid(Sender).Canvas.Brush.Color:=clGreen
else
  TDBGrid(Sender).Canvas.Brush.Color:=clRed;
Грубо говоря, код выглядит так. Но в первом случае таблица будет иметь искомый результат (полосатая), а во втором - одноцветная. Причина одноцветности - свойство RecNo всё время устанавливается на одно значение (это последняя запись). Сортировка по какому-то полю ничего не дает.
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,356
Записей в блоге: 3
12.02.2024, 10:49
А зачем вообще определять четность номера записи набора данных? Вам надо раскрасить грид через строку: красная, зеленая, красная, зеленая... Так? Ну так и подумайте на тему, как обойтись без RecNo!
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
12.02.2024, 11:04  [ТС]
Я перепробовал разные способы. Через четность является полностью рабочим, но только почему-то с ADOConnection. При этом, при отладке с ADOConnection прямо можно проследить прорисовку ячеек, чего нет с FDConnection (там по окончанию отрисовки сразу же отображается готовый результат). Как будто бы это разные компоненты работают.
0
 Аватар для Beltar
807 / 423 / 37
Регистрация: 05.05.2022
Сообщений: 2,933
12.02.2024, 11:04
Delphi
1
2
3
4
5
if (not (gdSelected in State) and (not (gdFocused in State))) then
  if dbgMain.DataSource.DataSet.RecNo mod 2 = 1 then 
    dbgMain.Canvas.Brush.Color:=RGB(250,250,200);
dbgMain.Canvas.FillRect(Rect);
dbgMain.DefaultDrawColumnCell(Rect,DataCol,Column,State);
Раскраска через полоску в такой вот розоватый цвет.

Тут тоже FireDAC, MS SQL Server.

Если у вас RecNo не работает, хотя я с таким не сталкивался, что за таблица такая. Может с Fetch что-то не то, у меня вместо дефолтного 50 в коннекшене Mode стоит fmAll, чтобы сразу всё тащило. То сделайте глобальную булеву переменную и в каждой рисовке инвертируйте ее.
1
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
12.02.2024, 11:09
Цитата Сообщение от Beltar Посмотреть сообщение
в каждой рисовке инвертируйте ее.
а откуда уверенность, что отрисовка всегда будет идти для всех строк и только от начала до конца?
0
 Аватар для Beltar
807 / 423 / 37
Регистрация: 05.05.2022
Сообщений: 2,933
12.02.2024, 11:41
А зачем тут такая точность? Главное, чтобы в каждом вызове значение было инвертированным относительно предыдущего. Впрочем, нюанс о котором сразу не подумал, вызов для каждого столбца ведь, но тогда инвертирование надо проводить, например, перед рисованием первого столбца, или после последнего.
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
12.02.2024, 12:04  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
Если у вас RecNo не работает, хотя я с таким не сталкивался, что за таблица такая. Может с Fetch что-то не то, у меня вместо дефолтного 50 в коннекшене Mode стоит fmAll, чтобы сразу всё тащило. То сделайте глобальную булеву переменную и в каждой рисовке инвертируйте ее.
Поставил fmAll - не помогло.
С глобальной булевой переменной пробовал - не решение.
Попробовал Ваш код, результат тот же (ну так Ваш код - это тот же мой): в первом случае работает, а во втором - нет. Осталось понять, какие Ваши настройки не совпадают с моими.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
12.02.2024, 12:07
я немного в замешательстве
если у вас отрисовывается ячейка с координатами Col,Row
то как определить, четная это строка или нет ??
а ю сириес ??
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
12.02.2024, 12:20  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
а откуда уверенность, что отрисовка всегда будет идти для всех строк и только от начала до конца?
Этот код будет работать, но до тех пор, пока не произойдет отрисовка какой-нибудь ячейки. Другими словами, запустили - сработало. Но если вы сдвинете курсор на позицию вверх и тогда всё поплывет. Или отсортируете таблицу. Короче, при каждой перерисовке строки будут вести себя непредсказуемо. Вернее, предсказуемо, но не так, как нужно. Была четная - стала нечетная. И неважно, что предыдущая строка тоже была нечетная. Поэтому здесь нужно привязываться к строкам таблицы или к строкам Rect'а. Или есть какой-то еще изощренный способ.

Добавлено через 5 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
если у вас отрисовывается ячейка с координатами Col,Row
то как определить, четная это строка или нет ??
а ю сириес ??
в случае с ADOConnection как-то это определяется. Там прямо видно при отладке, что идет отрисовка ячеек строки и RecNo 1, 2, 3... Всё по-честному. (Да, и мы прекрасно понимаем, что DBGridу без разницы, какая там строка, он оперирует Canvasом).
0
 Аватар для Beltar
807 / 423 / 37
Регистрация: 05.05.2022
Сообщений: 2,933
12.02.2024, 12:20
Лучший ответ Сообщение было отмечено t232006 как решение

Решение

Там нет координат Col, Row в параметрах onDrawDataCell.

У меня кроме Fetch и конкретно драйвера ничего не менялось. Я не понимаю, как RecNo может тупить. Ну выкиньте TFDTable, Его никто не использует, возьмите TFDQuery. Может в таблице ключа нет?

BTW сочетание красного с зеленым будет до слез доводить. Нужны менее контрастные цвета.
1
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
12.02.2024, 12:29  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
BTW сочетание красного с зеленым будет до слез доводить. Нужны менее контрастные цвета.
Это было только для примера. В программе можно настраивать цвета.
Попробую с Query. Хотя я что-то сомневаюсь.
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
12.02.2024, 12:31  [ТС]
Цитата Сообщение от t232006 Посмотреть сообщение
в случае с ADOConnection как-то это определяется. Там прямо видно при отладке, что идет отрисовка ячеек строки и RecNo 1, 2, 3... Всё по-честному. (Да, и мы прекрасно понимаем, что DBGridу без разницы, какая там строка, он оперирует Canvasом).
В качестве иллюстрации, как работает RecNo в ADOConnection у меня
Миниатюры
Особенности отображения таблицы данных TDBGrid от разных провайдеров  
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
12.02.2024, 13:38  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
Ну выкиньте TFDTable, Его никто не использует, возьмите TFDQuery.
Да, с Query это сработало.

Добавлено через 36 минут
Цитата Сообщение от t232006 Посмотреть сообщение
Ну выкиньте TFDTable, Его никто не использует, возьмите TFDQuery.
А TFDTable я использую, потому что там есть некоторые полезные свойства, которых нет в Query. В частности, там можно вставлять поля подстановки. Еще там для поля типа Boolean есть свойство DisplayValues. Это позволяет заменить фразы True и False на что-то другое, не меняя содержание
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
12.02.2024, 14:00
вот заставили старого деда открыть VCL.

две картинки - один вариант с RecNo
другой вариант с дополнительным полем в запросе, который тоже по сути RecNo
SQL
1
2
3
4
SELECT
ROW_NUMBER() OVER() AS ROW_NUM, 
e.* 
FROM events e
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.dbg1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if odd( q1.RecNo) then
  begin
    dbg1.Canvas.Brush.Color := clRed;
    dbg1.DefaultDrawDataCell(rect, Column.Field, state);
  end;
end;
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.dbg1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if odd( q1.FieldByName('ROW_NUM').asinteger) then
  begin
    dbg1.Canvas.Brush.Color := clRed;
    dbg1.DefaultDrawDataCell(rect, Column.Field, state);
  end;
end;
как говорится, ищем пару отличий
Миниатюры
Особенности отображения таблицы данных TDBGrid от разных провайдеров   Особенности отображения таблицы данных TDBGrid от разных провайдеров  
1
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
12.02.2024, 14:17  [ТС]
krapotkin, да, хороший, рабочий вариант. Только для его реализации нужно изменять структуру таблицы базы данных, если я использую компонент Table (компонент Query для меня не подходит).
0
 Аватар для Beltar
807 / 423 / 37
Регистрация: 05.05.2022
Сообщений: 2,933
12.02.2024, 14:39
Цитата Сообщение от t232006 Посмотреть сообщение
(компонент Query для меня не подходит)
Не верю. Query с фикс. запросом неотличим от Table, поэтому Table никто не использует. НЕТ ТАКОГО КОМПОНЕНТА.

Delphi
1
 Это позволяет заменить фразы True и False на что-то другое, не меняя содержание
Это можно реализовать миллионом способов.

1) Можно сделать в БД таблицу с логикой, и на них лукап-поле.
2) Можно прописать свое событие onGetText у филда.

Например у меня есть такое
Delphi
1
2
3
4
5
procedure TDM.QHistИзменениеGetText(Sender: TField; var Text: string;
  DisplayText: Boolean);
begin
Text:=ABS(QHistИзменение.Value).ToString;
end;
Так что вместо отрицательного изменения юзер видит положительное, в др. вычислимом поле соответственно пишется "Положил\Забрал"

3) Можно сделать чекбоксы вместо текста. Как именно я сам спрашивал на этом самом форуме в 2019-ом, скорее всего в августе, мне тогда просто готовое решение дали.
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
12.02.2024, 14:48  [ТС]
Цитата Сообщение от Beltar Посмотреть сообщение
3) Можно сделать чекбоксы вместо текста. Как именно я сам спрашивал на этом самом форуме в 2019-ом, скорее всего в августе, мне тогда просто готовое решение дали
Как Вы видите из картинки, у меня чекбокс и реализован. Это не проблема. Проблема в Query, что true и false отображаются на заднем фоне (ну да, их можно закрасить, чет я не подумал, но это больше похоже на костыль. Но рабочий).
Можно про лукап поле поподробнее? Как реализовать это поле в компоненте Query?
0
 Аватар для Beltar
807 / 423 / 37
Регистрация: 05.05.2022
Сообщений: 2,933
12.02.2024, 15:04
Рисование ячеек начинается с закраски в любом случае.

Lookup-поля это вообще-то базовая вещь со времен BDE, просто создается новое поле типа LookUp, задается основной датасет, поле по которому надо искать, обычно, внешний ключ, второй датасет, поле по которому будет поиск, обычно первичный ключ, результирующее поле. Т. е. просто делается на уровне приложения аналог Join в SQL. Типа

SQL
1
INNER JOIN T2 ON T1.Id_T2=T2.Id
Полезно, если надо редактировать таблицы прямо в сетке, выбирая значения из списка. Да и LookUp-компоненты за счет этого живут, при этом их можно применять не только для редактирования, но и для выбора значений из справочных таблиц, если не задавать им DataSource и DataField.

Ну и позволяет строить Join-подобные конструкции, т. к. запросы, полученные через Join редактировать через Edit нельзя.

Если нужно только отображать, то onGetText для такой простой задачи, думаю, будет лучше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2024, 15:04
Помогаю со студенческими работами здесь

Две локальные сети от разных провайдеров
Ребят помогите пожалуйста возможно ли сделать 2 локальные сети от разных провайдеров. 2 локальные сети на 1 пк

Особенности отображения капчи
Написал прокси-сервер для работы с сайтом погоды. Все зашибись работает, кроме вкладки где можно сделать свой информер. Там несколько...

Отображения данных в форме в виде таблицы
Доброго времени суток, ув. форумчане ! Я только начал изучать С# поэтому прошу строго не судить ) А вопрос такой планирую сделать...

Как соединить две подсети от разных провайдеров?
есть вот такие вот сети. на машинах ip прописаны вручную. задача: компьютеры подсети 192.168.1.... имели возможность выходить на сайты...

Как настроить сетевое окружиение с разных провайдеров?
Нужно добавить ПК, который подключен к другому провадеру, в сетевое окружение. Я так полагаю, нужно воспользоваться какой-нибуть утилитой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru