Создайте на форме DataSource1, Table1, DataSource2, Table2, DBGrid1. Table1 и Table2 свяжите со своей базой данных. DataSource1 и DataSource2 свяжите соответственно с Table1 и Table2. DBGrid1 свяжите с DataSource1 Table2 и DataSource2 нужны для доступа к какой-нибудь ячейке. Другой способ без их использования: при отрисовке значений ячеек (соответствующее событие), необходимо запомнить значения всех ячеек, находящихся на экране и производить выбор среди них.
Code: |
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. |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!