Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.27.232] |
|
Сообщ.
#1
,
|
|
|
Помогите решить такую вот проблему.. Все наверное видели вкладку "загрузки" в Opera, так вот мне нужно реализовать нечто наподобие этого. Чтобы во время перемещения курсора над сеткой с данными, коей является TDBGridEh в данном случае рядом с курсором появлялась всплывающая подсказка с дополнительными сведениями по записи.
Проблема в том, чтобы узнать содержимое ячецки, над которой висит мышь. В ФАКе нашел статью на эту тему, вот ее содержимое: 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 выудить. решил обойтись без нее, но в результате у меня выводились только разные поля активной записи. Вот примерно, что у меня осталось от этого кода(точно не помню): 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], например или чего-то похожего, выходит, я знаю координаты ячейки в сетке, но не могу достать данные из нее. |
Сообщ.
#2
,
|
|
|
На Билдере можно сделать так:
void __fastcall TForm1::DBGrid1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { int Col, Row; ((TCustomDrawGrid*)DBGrid1)->MouseToCell(X, Y, Col, Row); // получаешь колонку (строка мало волнует) и далее выводишь хинт } |
Сообщ.
#3
,
|
|
|
для показа в Хинт содержимого ячейки у TDBGridEh есть свойство у колонки - Tooltips
|
Сообщ.
#4
,
|
|
|
недавно замутил нечто по этому поводу, все бы ничего, но во время перемещения указателя по сетке, запись выбирается которая под курсором.. и строка мне тожу важна, мне надо, не меняя текущей записи отображать содержимое других(которые под курсором)
|
Сообщ.
#5
,
|
|
|
Цитата Demigod @ Я тебе показал событие, в котором определяются и Row, и Col.строка мне тожу важна Цитата Demigod @ Не понял, зачем это надо...Никто не запрещает вызвать DataSet.Next() (если конечно датасет - в режиме ПРОСМОТРА, иначе возможны проблемы вплоть до изумления). мне надо, не меняя текущей записи отображать содержимое других(которые под курсором) |
Сообщ.
#6
,
|
|
|
Может я неправильно выражаюсь, но взгляните на закладку "Загрузки" в Опере, вот мне нужно нечто в этом роде, но в качестве сетки выступает DBGridEh.
|
Сообщ.
#7
,
|
|
|
Создайте на форме 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. ©Drkb::01291 |
Сообщ.
#8
,
|
|
|
Если еще актуально
про DBGridEh публикую цикл статей все с чем сталкивался его осваивая.. Delphi. Играемся с DBGridEh |