Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Delphi: Базы данных > Как вывести Hint с содержимым записи над DBGridEh |
Автор: Demigod 08.12.07, 19:24 |
Помогите решить такую вот проблему.. Все наверное видели вкладку "загрузки" в Opera, так вот мне нужно реализовать нечто наподобие этого. Чтобы во время перемещения курсора над сеткой с данными, коей является TDBGridEh в данном случае рядом с курсором появлялась всплывающая подсказка с дополнительными сведениями по записи. Проблема в том, чтобы узнать содержимое ячецки, над которой висит мышь. В ФАКе нашел статью на эту тему, вот ее содержимое: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> var ScrPt, GrdPt: TPoint; Cell: TGridCoord; begin ScrPt := Mouse.CursorPos; GrdPt := DBGrid.ScreenToClient(ScrPt); Cell := DBGrid.MouseCoord(GrdPt.X, GrdPt.Y); // Col := Cell.X; // Row := Cell.Y; end; ... FieldText: string; DLink: TDataLink; OldActiveRec: Integer; ... Cell := DBGrid.MouseCoord(GrdPt.X, GrdPt.Y); FieldText := ''; DLink := THackDBGrid(DBGrid).DataLink; if Assigned(DLink) then begin if (Cell.X < = 0)or(Cell.Y < = 0) then Exit; OldActiveRec := DLink.ActiveRecord; try DLink.ActiveRecord := Cell.Y-1{TitleOffset}; FieldText := DBGrid.Columns[Cell.X-1{IndicatorOffset}].Field.Text; finally DLink.ActiveRecord := OldActiveRec; end; end; Когда попытался применить к своей сетке, то возникли проблемы с TDataLink, - не могу ее из DBGridEh выудить. решил обойтись без нее, но в результате у меня выводились только разные поля активной записи. Вот примерно, что у меня осталось от этого кода(точно не помню): <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> var ScrPt, GrdPt: TPoint; Cell: TGridCoord; begin ScrPt := Mouse.CursorPos; GrdPt := DBGridEh1.ScreenToClient(ScrPt); Cell := DBGridEh1.MouseCoord(GrdPt.X, GrdPt.Y); // Col := Cell.X; // Row := Cell.Y; end; ... FieldText: string; DLink: TDataLink; OldActiveRec: Integer; ... Cell := DBGridEh1.MouseCoord(GrdPt.X, GrdPt.Y); FieldText := ''; if (Cell.X < = 0)or(Cell.Y < = 0) then Exit; FieldText := DBGridEh1.Columns.Items[Cell.X].Field.Text; // индикатора у меня нет, выключил Умом я понимаю, что у меня идет только обработка Columns сетки, т.е. только в горизонтальном направлении, но я не нашел у DBGridEH свойства Cell[row,col], например или чего-то похожего, выходит, я знаю координаты ячейки в сетке, но не могу достать данные из нее. |
Автор: Диссидент 11.12.07, 05:09 |
На Билдере можно сделать так: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> void __fastcall TForm1::DBGrid1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { int Col, Row; ((TCustomDrawGrid*)DBGrid1)->MouseToCell(X, Y, Col, Row); // получаешь колонку (строка мало волнует) и далее выводишь хинт } |
Автор: Игорь Акопян 11.12.07, 06:56 |
для показа в Хинт содержимого ячейки у TDBGridEh есть свойство у колонки - Tooltips |
Автор: Demigod 11.12.07, 14:51 |
недавно замутил нечто по этому поводу, все бы ничего, но во время перемещения указателя по сетке, запись выбирается которая под курсором.. и строка мне тожу важна, мне надо, не меняя текущей записи отображать содержимое других(которые под курсором) |
Автор: Диссидент 12.12.07, 05:24 |
Я тебе показал событие, в котором определяются и Row, и Col. Цитата Demigod @ Не понял, зачем это надо...Никто не запрещает вызвать DataSet.Next() (если конечно датасет - в режиме ПРОСМОТРА, иначе возможны проблемы вплоть до изумления). мне надо, не меняя текущей записи отображать содержимое других(которые под курсором) |
Автор: Demigod 12.12.07, 17:14 |
Может я неправильно выражаюсь, но взгляните на закладку "Загрузки" в Опере, вот мне нужно нечто в этом роде, но в качестве сетки выступает DBGridEh. |
Автор: krogal 20.12.07, 03:35 |
Создайте на форме DataSource1, Table1, DataSource2, Table2, DBGrid1. Table1 и Table2 свяжите со своей базой данных. DataSource1 и DataSource2 свяжите соответственно с Table1 и Table2. DBGrid1 свяжите с DataSource1 Table2 и DataSource2 нужны для доступа к какой-нибудь ячейке. Другой способ без их использования: при отрисовке значений ячеек (соответствующее событие), необходимо запомнить значения всех ячеек, находящихся на экране и производить выбор среди них. Code: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 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. ©Drkb::01291 |
Автор: def32 01.06.17, 04:52 |
Если еще актуально про DBGridEh публикую цикл статей все с чем сталкивался его осваивая.. Delphi. Играемся с DBGridEh |