Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата Demigod @
строка мне тожу важна
Я тебе показал событие, в котором определяются и 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

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)