|
Вопрос # 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;
- interface
- uses
- 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.
Или я не так понял?
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|