Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.03.2018, 13:42
aford aford вне форума
Прохожий
 
Регистрация: 14.03.2018
Сообщения: 12
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию Выделение контуром при наведении и клике DBGridEh

Добрый день!
Подскажите пожалуйста, каким образом можно реализовать такое?
Есть таблица TDBGridEh. Задача - при наведении мышкой выделять в таблице (не в DataSource) контуром всю строку (как в экселе, без закрашивания ячеек), а при клике выделить контуром строку и соответственно запись в DataSource.
Ответить с цитированием
  #2  
Старый 14.03.2018, 13:53
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

Пять раз прочитал, но так и не понял
И в каком это Excel такое выделение?
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #3  
Старый 14.03.2018, 14:05
aford aford вне форума
Прохожий
 
Регистрация: 14.03.2018
Сообщения: 12
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Действительно, плохое сравнение.. вот:
Ответить с цитированием
  #4  
Старый 14.03.2018, 14:09
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

А Options.dgRowSelect=True, не подходит? Ну и dgAlwaysShowSelection=True для полноты можно. А еще можно OptionsEh.dghHotTrack=True.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.

Последний раз редактировалось Kailon, 14.03.2018 в 14:16.
Ответить с цитированием
  #5  
Старый 14.03.2018, 14:14
aford aford вне форума
Прохожий
 
Регистрация: 14.03.2018
Сообщения: 12
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Options.dgRowSelect=True выделяет строку стандартным цветом, насчет dgAlwaysShowSelection=True можно сказать то же самое. или я не так понимаю
Ответить с цитированием
  #6  
Старый 14.03.2018, 14:22
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

Ну, что могу сказать? Если стандартные методы не удовлетворяют требованиям, то нужно все делать самому, ручками.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #7  
Старый 14.03.2018, 15:18
aford aford вне форума
Прохожий
 
Регистрация: 14.03.2018
Сообщения: 12
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Я поэтому сюда и написал, самому сделать не получается
Ответить с цитированием
  #8  
Старый 16.03.2018, 13:26
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от aford
...самому сделать не получается
Не получается, это потому как слишком глобальной оказалась поставленная задача, нужно разбить её на этапы и задавать вопросы по мере их прохождения. Вот подсказки:

Сначала хорошенько подумать, а точно-ли нужен именно такой, самописный вариант отображения данных или всёж можно обойтись уже имеющимся, от разработчиков?

При положительном ответе, думать дальше:

Убрать видимую разметку ячеек проще всего в дизайнтайме, для чего в Options отключить (=false) флажки dgEditing-dgTitles-dgIndicator-dgColLines-dgRowLines, тогда на екране останутся "голые" данные, как на рисунке.

Отследить положение курсора мышки можно с помощью функции GetCursorPos(), или глобальных значений Mouse.CursorPos.X/Y

За отрисовку ячеек в "таблице" отвечает обработчик DrawColumnCell, вот в нём нужно найти положение мышки, если она в пределах строки, то "выделить контуром строку" посредством вызова .Canvas.FrameRect(), эта низкоуровневая функция закрашивает не всё "тело" области, как это делает .Canvas.FillRect(), а только её контур, рамку как на рисунке

Вывод тескта в ячее - это .Canvas.TextOut()

Узнать над каким полем висит мышь
Код:
var
ScrPt, GrdPt: TPoint;
Cell: TGridCoord;
begin
ScrPt := Mouse.CursorPos;
GrdPt := DBGrid.ScreenToClient(ScrPt);
Cell := DBGrid.MouseCoord(GrdPt.X, GrdPt.Y);
// Col := Cell.X;
// Row := Cell.Y;
end;
...
FieldText: string;
DLink: TDataLink;
OldActiveRec: Integer;
... 

Cell := DBGrid.MouseCoord(GrdPt.X, GrdPt.Y);
FieldText := '';   
DLink := THackDBGrid(DBGrid).DataLink;
if Assigned(DLink) then
begin
  if (Cell.X < = 0)or(Cell.Y < = 0) then Exit;
  OldActiveRec := DLink.ActiveRecord;
  try
    DLink.ActiveRecord := Cell.Y-1;
    FieldText:= DBGrid.Columns[Cell.X-1].Field.Text;
  finally
    DLink.ActiveRecord := OldActiveRec;
  end;
end;
drkb. Пробуйте, появятся вопросы - спрашивайте

Последний раз редактировалось Alegun, 16.03.2018 в 15:07.
Ответить с цитированием
  #9  
Старый 16.03.2018, 15:46
aford aford вне форума
Прохожий
 
Регистрация: 14.03.2018
Сообщения: 12
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Спасибо за подробное объяснение, но я все равно сижу в тупике. Да, мне давно надо за учебники
У DBGridEh нет свойств ScreenToClient и MouseCoord, пробовал прописывать их в onDrawColumnCell. Получается нужно будет (скорее да, судя по приведенному Вами коду ниже) наследоваться от DBGridEh?
Ответить с цитированием
  #10  
Старый 16.03.2018, 16:35
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от aford
...У DBGridEh нет свойств ScreenToClient и MouseCoord...
Вот видите, как здорово, а у меня нет DBGrid с Eh :-) Возможно-ли поле "таблицы" (кстати, она называется сеткой и лишь отображает содержимое настоящей таблицы, к которой подключена) очистить с помощью опциональных флажков от сеточной мишуры ваш компонент позволяет? И обязательно нужно установить dgRowSelect=true, при дальнейшей обработке должна учитываться площадь (лежит в параметре DrawColumnCell под названием Rect) всей строки, а не только отдельной ячейки
Ответить с цитированием
  #11  
Старый 16.03.2018, 19:34
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 173
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

В DBGridEh есть подсветка строки, находящейся под курсором (dghHotTrack в OptionsEh). Подсвечивание происходит бледной заливкой. Может такой вариант сойдёт?
Ответить с цитированием
  #12  
Старый 20.03.2018, 09:09
aford aford вне форума
Прохожий
 
Регистрация: 14.03.2018
Сообщения: 12
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Guaho
В DBGridEh есть подсветка строки, находящейся под курсором (dghHotTrack в OptionsEh). Подсвечивание происходит бледной заливкой. Может такой вариант сойдёт?
Я пока с ним и сделал, спасибо. Оставлю все как есть, пока что ума не хватает переписывать компонент
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter