На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> Как вывести Hint с содержимым записи над DBGridEh, Как на вкладке "Загрузки" в Opera
    Помогите решить такую вот проблему.. Все наверное видели вкладку "загрузки" в Opera, так вот мне нужно реализовать нечто наподобие этого. Чтобы во время перемещения курсора над сеткой с данными, коей является TDBGridEh в данном случае рядом с курсором появлялась всплывающая подсказка с дополнительными сведениями по записи.
    Проблема в том, чтобы узнать содержимое ячецки, над которой висит мышь. В ФАКе нашел статью на эту тему, вот ее содержимое:

    ExpandedWrap disabled
      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 выудить. решил обойтись без нее, но в результате у меня выводились только разные поля активной записи. Вот примерно, что у меня осталось от этого кода(точно не помню):

    ExpandedWrap disabled
      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], например или чего-то похожего, выходит, я знаю координаты ячейки в сетке, но не могу достать данные из нее.
    Сообщение отредактировано: Bas -
      На Билдере можно сделать так:
      ExpandedWrap disabled
        void __fastcall TForm1::DBGrid1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) {
          int Col, Row;
          ((TCustomDrawGrid*)DBGrid1)->MouseToCell(X, Y, Col, Row);
          // получаешь колонку (строка мало волнует) и далее выводишь хинт
        }
        для показа в Хинт содержимого ячейки у TDBGridEh есть свойство у колонки - Tooltips
          недавно замутил нечто по этому поводу, все бы ничего, но во время перемещения указателя по сетке, запись выбирается которая под курсором.. и строка мне тожу важна, мне надо, не меняя текущей записи отображать содержимое других(которые под курсором)
            Цитата Demigod @
            строка мне тожу важна
            Я тебе показал событие, в котором определяются и Row, и Col.
            Цитата Demigod @
            мне надо, не меняя текущей записи отображать содержимое других(которые под курсором)
            Не понял, зачем это надо...Никто не запрещает вызвать DataSet.Next() (если конечно датасет - в режиме ПРОСМОТРА, иначе возможны проблемы вплоть до изумления).
              Может я неправильно выражаюсь, но взгляните на закладку "Загрузки" в Опере, вот мне нужно нечто в этом роде, но в качестве сетки выступает DBGridEh.
                Создайте на форме DataSource1, Table1, DataSource2, Table2, DBGrid1. Table1 и Table2 свяжите со своей базой данных. DataSource1 и DataSource2 свяжите соответственно с Table1 и Table2. DBGrid1 свяжите с DataSource1 Table2 и DataSource2 нужны для доступа к какой-нибудь ячейке. Другой способ без их использования: при отрисовке значений ячеек (соответствующее событие), необходимо запомнить значения всех ячеек, находящихся на экране и производить выбор среди них.



                Code:

                ExpandedWrap disabled
                  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
                Сообщение отредактировано: Bas -
                  Если еще актуально :)
                  про DBGridEh
                  публикую цикл статей
                  все с чем сталкивался его осваивая..
                  Delphi. Играемся с DBGridEh
                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script Execution time: 0,0980 ]   [ 15 queries used ]   [ Generated: 25.06.17, 02:04 GMT ]