Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.27;
Скачать: CL | DM;

Вниз

координаты ячейки в DBGrid с учетом прокрутки   Найти похожие ветки 

 
makaronX   (2007-09-17 14:36) [0]

подскажите, как учесть вертикальную прокрутку в DBGrid, т. е. получить координаты ячеек, которые не видны в области вывода DBGrid.
задача - выводить в хинте информацию в зависимости от записи, на которой находится курсор мыши
Приведенный ниже код успешно работает только если все записи вмещаются в видимое окно DBGrid. При попытке навести курсор на записи, которые находятся ниже - происходит перемещение на начальные строки.

procedure TForm1.AppMess(var Msg: TMsg; var Handled: Boolean);

var
 a: TGridCoord;
 st: string;
 X, Y: integer;
begin
  if Msg.message=WM_MOUSEMOVE then
 begin
   if Msg.hwnd=DBGrid1.Handle then
   begin
    x:=LoWord(Msg.lParam);
    y:=HiWord(Msg.lParam);
    a:=DBGrid1.MouseCoord(X,Y);
  if (a.x>0) and (a.y>0) then
     begin
       DataSource1.DataSet.first;
       DataSource1.DataSet.MoveBy(a.y-1);
       st := DataSource1.DataSet.FieldValues["NOMER_TERMINALA"];
       adoquery2.close;
       adoquery2.sql.Clear;
       adoquery2.SQL.Add("select max(datestop) from terminalsession where terminalid = "+ st + " and success=1");
       adoquery2.ExecSQL;
       adoquery2.open;
       DBGrid1.Hint:="Последняя удачная инкассация: "+adoquery2.FieldList.Fields[0].AsString;
       application.ActivateHint(mouse.CursorPos);
    end;
   end;
  end;

Простите за сумбурное объяснение.


 
Johnmen ©   (2007-09-17 15:16) [1]

Т.е. ты потестировал код http://www.delphisources.ru/pages/faq/base/hint_for_dbgrid.html и предлагаешь обсудить его якобы неработоспособность? :)
PS

>При попытке навести курсор на записи, которые находятся ниже


Их же не видно...:)


 
makaronX   (2007-09-17 15:42) [2]

так и есть, в проницательности вам не откажешь
в чувстве юмора тоже
код я не тестировал, а приспособил под свои нужды, но мои нужды немножко шире указанного кода


> Их же не видно...:)

при прокрутке скроллером они становятся видны

так вот, как мне учесть тот факт, что DBGrid уже прокручен на энное количество строчек в момент наведения мыши на определенную запись?


 
Johnmen ©   (2007-09-17 16:13) [3]

Понятно.
Похоже данный пример действительно кривоват, ибо не учитывает, на сколько записей грид прокручен, сколько записей "сверху за кадром".
Поэтому отсчет надо делать односительный (а не абсолютный, как выше; и не дергать указатель в НД!). Т.е. надо опираться на внутренний буфер грида. Отсюда имеем код (из правильного фака :)):
type
TForm1 = class(TForm)
  DBGrid1: TDBGrid;
  ADOQuery1: TADOQuery;
  DataSource1: TDataSource;
  procedure DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
    Y: Integer);
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
  FHintWindow: THintWindow;
  procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

type
TXGrid = class(TCustomDBGrid);

procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
if Message.LParam = Integer(DBGrid1) then
  FHintWindow.ReleaseHandle;
inherited;
end;

procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
Grid: TDBGrid;
Cell: TGridCoord;
CellRect: TRect;
HintCol: TColumn;
OldActive: Integer;
Value: string;
Pt: TPoint;
begin
Grid := Sender as TDBGrid;
Cell := Grid.MouseCoord(X, Y);
if (Cell.X < 1) or (Cell.Y < 0) then Exit;
try
  HintCol := Grid.Columns[Cell.X - 1];
  Value := "";
  OldActive := TXGrid(Grid).DataLink.ActiveRecord;
  try
    TXGrid(Grid).DataLink.ActiveRecord := Cell.Y - 1;
    Value := HintCol.Field.DisplayText;
    CellRect := TXGrid(Grid).CellRect(Cell.X, Cell.Y);
    GetCursorPos(Pt);
    CellRect := FHintWindow.CalcHintRect(Grid.Width, Value, nil);
    OffsetRect(CellRect, Pt.X, Pt.Y);
    FHintWindow.ActivateHint(CellRect, Value) ;
  finally
    TXGrid(Grid).DataLink.ActiveRecord := OldActive;
  end;
except
  FHintWindow.ReleaseHandle;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FHintWindow := THintWindow.Create(Self);
FHintWindow.Color := clInfoBk;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FHintWindow.Free;
end;


 
makaronX   (2007-09-17 18:13) [4]

спасибо большое, все работает так как хотелось :-)



Страницы: 1 вся ветка

Текущий архив: 2008.01.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
2-1198508759
Kvendi
2007-12-24 18:05
2008.01.27
Скриншот некого чужого окна


2-1198820783
d@nger
2007-12-28 08:46
2008.01.27
Как программно засунуть в свой exe файл другой файл?


15-1197963583
Slider007
2007-12-18 10:39
2008.01.27
С днем рождения ! 18 декабря 2007 вторник


3-1190207246
Slimer
2007-09-19 17:07
2008.01.27
Сумашедшая дробь:)


2-1199179929
palva
2008-01-01 12:32
2008.01.27
Не открывается TADODataSet