-
Arkadi4 (18.09.10 16:12) [0]Имеется dbgrid. Длина текста в некоторых ячейках превышает ширину этих ячеек. Как сделать так, чтобы при наведении курсора на ячейку появлялся полный текст, находящийся в этой ячейке?
пробовал такой вариант:procedure TForm3.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var mc:TGridCoord;
begin
mc:=DBGrid1.MouseCoord(x,y);
DBGrid1.Hint:=DBGrid1.DataSource.DataSet.Fields[mc.x-1].AsString;
DBGrid1.ShowHint:=true;
Application.ActivateHint(Mouse.CursorPos);
end;
выдало ошибку "List index out of bounds (-2)"
delphi 7, 2007
windows 7 -
Anatoly Podgoretsky © (18.09.10 17:15) [1]> Arkadi4 (18.09.2010 16:12:00) [0]
А значение mc.x имеет допустимое значение? Или ты его от булды взял? -
Arkadi4 (20.09.10 20:27) [2]
> А значение mc.x имеет допустимое значение? Или ты его от
> булды взял?
>
не понял вопроса. в смысле? -
Вуйко Францишко (21.09.10 04:41) [3]>> Arkadi4 (18.09.10 16:12)DBGrid1.Hint:=DBGrid1.DataSource.DataSet.Fields[mc.x-1].AsString;
DBGrid1.MouseCoord(x,y) возвращает индексы ("координаты") ячейки в гриде по X и по Y. Значение в X никакого отношения к индексу поля в наборе данных не имеет. Y вообще не применимо к набору данных.
Для получения поля через индекс Х, следует обратиться к соответствующей колонке:var
F: TField;
F := DBGrid1.Columns[mc.x-1].Field;
if (F <> nil) then
DBGrid1.Hint := F.AsString
else
DBGrid1.Hint := '';
Но перед тем, как это делать, следует разобраться с Y.
А с Y ситуация сложнее. Дело в том, что набор данных в Delphi работает как курсор. "В лоб", путем перемещения указателя набора данных на требуемую запись, проблема не решается. Как вариант, можно забраться в protected свойства TDBGrid:
type
TMyDBGrid = class(TDBGrid);
И потом, установив TMyDBGrid(DBGrid1).DataLink.ActiveRecord := <нужное значение в пределах отображаемых записей>, получить значение требуемого поля. И не забыть потом вернуть ActiveRecord в прежнее значение.
"Нужное значение в пределах отображаемых записей", будьте добры, посчитайте сами на основании текущего TMyDBGrid(DBGrid1).Row и нужного Y. -
Anatoly Podgoretsky © (21.09.10 09:29) [4]
> не понял вопроса. в смысле?
Значит, что индекс должен быть не больше количества элементов в списке - 1, и не меньше 0 -
Arkadi4 (21.09.10 15:28) [5]Спасибо всем откликнувшимся! Проблема решена.procedure TForm3.AppMess(var Msg: TMsg; var Handled: Boolean);
var
X, Y: integer;
mc: TGridCoord;
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);
mc:=DBGrid1.MouseCoord(x,y);
if (mc.x>0) and (mc.y>0) then
begin
DataModule2.DataSource1.DataSet.First;
DataModule2.DataSource1.DataSet.MoveBy(mc.y-1);
s:=DataModule2.AdoQuery1.Fields[mc.x-1].asString;
w:=DBGrid1.Columns[ mc.x-1].Width;
len:=DBGrid1.Canvas.TextWidth(s);
if len > w then
DBGrid1.Hint:=s
else
DBGrid1.Hint:='';
end;
end;
end;
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
DBGrid1.ShowHint := True;
Application.OnMessage := AppMess;
end; -
Вуйко Францишко (21.09.10 19:47) [6]Проблема не решена. Более того, появились новые проблемы.