Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 134

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Подскажите пожалуйста как сделать подсказку в ДБГРИД на каждую строку

Beknur Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Beknur (статус: Посетитель)
Вопрос отправлен: 28 августа 2009, 22:07
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Егор

Здравствуйте, Beknur!
Есть такой сайт - яндекс (пишется как yandex.ru) - это поисковик. Можно в нём набрать, например, такое сочетание: "подсказка /7 DBGRID" и получить кучу нужных ссылок, например:
http://www.vr-online.ru/topic.php?id=12215
http://nnm.ru/blogs/delphi_source/novyiy_ishodnik_na_saiyte_07012009_3/
http://www.programmers.kz/12899-kak-vyvesti-hint-dlya-yachejki-dbgrid.html

Вот и пример с последней ссылки:

Создайте на форме DataSource1, Table1, DataSource2, Table2, DBGrid1. Table1 и Table2 свяжите со своей базой данных. DataSource1 и DataSource2 свяжите соответственно с Table1 и Table2. DBGrid1 свяжите с DataSource1 Table2 и DataSource2 нужны для доступа к какой-нибудь ячейке. Другой способ без их использования: при отрисовке значений ячеек (соответствующее событие), необходимо запомнить значения всех ячеек, находящихся на экране и производить выбор среди них.

Приложение:
  1. unit Unit1;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Classes, Graphics, Controls,
  5. Forms, Dialogs, Grids, DBGrids, Db, DBTables;
  6. type
  7. TForm1 = class(TForm)
  8. DataSource1: TDataSource;
  9. Table1: TTable;
  10. DBGrid1: TDBGrid;
  11. Table2: TTable;
  12. DataSource2: TDataSource;
  13. procedure FormCreate(Sender: TObject);
  14. private
  15. { Private declarations }
  16. procedure AppMess(var Msg: TMsg; var Handled: Boolean);
  17. public
  18. { Public declarations }
  19. end;
  20. var
  21. Form1: TForm1;
  22. implementation
  23. {$R *.DFM}
  24. procedure TForm1.AppMess(var Msg: TMsg; var Handled: Boolean);
  25. var
  26. X, Y: integer;
  27. gpt: TGridCoord;
  28. s: string;
  29. w, len: integer;
  30. begin
  31. if Msg.message=WM_MOUSEMOVE then
  32. begin
  33. if Msg.hwnd=DBGrid1.Handle then
  34. begin
  35. x:=LoWord(Msg.lParam);
  36. y:=HiWord(Msg.lParam);
  37. gpt:=DBGrid1.MouseCoord(x,y);
  38.  
  39. if (gpt.x>0) and (gpt.y>0) then
  40. begin
  41. DataSource2.DataSet.First;
  42. DataSource2.DataSet.MoveBy(gpt.y-1);
  43. s:=Table2.Fields[gpt.x-1].asString;
  44. w:=DBGrid1.Columns[gpt.x-1].Width;
  45.  
  46. len:=DBGrid1.Canvas.TextWidth(s);
  47.  
  48. if len > w then
  49. DBGrid1.Hint:=s;
  50. else
  51. DBGrid1.Hint:='';
  52. end;
  53. end;
  54. end;
  55. end;
  56. procedure TForm1.FormCreate(Sender: TObject);
  57. begin
  58. DBGrid1.ShowHint := True;
  59. Application.OnMessage := AppMess;
  60. end;
  61. end.
  62.  
  63. --------------------------------------
  64.  
  65.  


Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 28 августа 2009, 22:24
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 6 сентября 2009, 17:24; участников в обсуждении: 2.
Егор

Егор (статус: 10-ый класс), 28 августа 2009, 22:12 [#1]:

уже задавал же этот вопрос - 3130. чем тот ответ не устроил?
не надо задавать вопрос ПОВТОРНО. нужно сказать, что не понятно в предыдущем ответе.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Zavist Akop

Zavist Akop (статус: Посетитель), 6 сентября 2009, 17:24 [#2]:

в строке :

DataSource2.DataSet.MoveBy(gpt.y-1)

происходит перемещение на (Y-1) запись таблицы, но Y это ведь номер строки в DBGrid1, а он <b>не равен</b> номеру записи!
<i>ПРИМЕР:</i> в table1 1000 записей, я нахожусь на 125 записи в table1 (dateset1). а в DBGrid1 у меня допускается 20 строк и Y поэтому может принимать значение в предеалах 0..19.
Или я не так понял?

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:46
Выполнено за 0.02 сек.