Конференция "Начинающим" » hint со значением ячеек gbrid
 
  • 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]
    Проблема не решена. Более того, появились новые проблемы.
  • Leonid Troyanovsky © (22.09.10 12:59) [7]

    > Arkadi4   (21.09.10 15:28) [5]

    http://delphimaster.net/view/2-1275568305

    --
    Regards, LVT.
 
Конференция "Начинающим" » hint со значением ячеек gbrid
Есть новые Нет новых   [134433   +21][b:0][p:0.003]