| 
| 
 | Вопрос # 3 134/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Подскажите пожалуйста как сделать подсказку в ДБГРИД на каждую строку
 
|  |   Вопрос задал: 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 нужны для доступа к какой-нибудь ячейке. Другой способ без их использования: при отрисовке значений ячеек (соответствующее событие), необходимо запомнить значения всех ячеек, находящихся на экране и производить выбор среди них.
 Приложение:Переключить в обычный режим unit Unit1;interfaceuses  Windows, Messages, SysUtils, Classes, Graphics, Controls,  Forms, Dialogs, Grids, DBGrids, Db, DBTables;type  TForm1 = class(TForm)    DataSource1: TDataSource;    Table1: TTable;    DBGrid1: TDBGrid;    Table2: TTable;    DataSource2: TDataSource;    procedure FormCreate(Sender: TObject);  private    { Private declarations }    procedure AppMess(var Msg: TMsg; var Handled: Boolean);  public    { Public declarations }end;var  Form1: TForm1;implementation{$R *.DFM}procedure TForm1.AppMess(var Msg: TMsg; var Handled: Boolean);var  X, Y: integer;  gpt: TGridCoord;  s: string;  w, len: integer;begin  if Msg.message=WM_MOUSEMOVE then  begin    if Msg.hwnd=DBGrid1.Handle then    begin      x:=LoWord(Msg.lParam);      y:=HiWord(Msg.lParam);      gpt:=DBGrid1.MouseCoord(x,y);       if (gpt.x>0) and (gpt.y>0) then      begin        DataSource2.DataSet.First;        DataSource2.DataSet.MoveBy(gpt.y-1);        s:=Table2.Fields[gpt.x-1].asString;        w:=DBGrid1.Columns[gpt.x-1].Width;         len:=DBGrid1.Canvas.TextWidth(s);         if len > w then          DBGrid1.Hint:=s;        else          DBGrid1.Hint:='';      end;    end;  end;end;procedure TForm1.FormCreate(Sender: TObject);begin   DBGrid1.ShowHint := True;  Application.OnMessage := AppMess;end;end. --------------------------------------  
|  | Ответ отправил: Егор (статус: 10-ый класс)Время отправки: 28 августа 2009, 22:24
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 6 сентября 2009, 17:24; участников в обсуждении: 2. 
|   | Егор (статус: 10-ый класс), 28 августа 2009, 22:12 [#1]:уже задавал же этот вопрос - 3130. чем тот ответ не устроил? не надо задавать вопрос ПОВТОРНО. нужно сказать, что не понятно в предыдущем ответе.
 Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | 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.
 Или я не так понял?
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |