hint в каждой ячейке stringgrida [Решено]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

hint в каждой ячейке stringgrida [Решено]

Сообщение alex208210 » 23.05.2011 20:25:40

Из всего нагугленного распиарен один способ отображения подсказки над каждой ячейкой, но он совершенно непригоден

Код: Выделить всё
procedure TForm1.StringGrid1MouseMove(Sender: TObject;
                   Shift: TShiftState; X, Y: Integer);
var
  r : integer;
  c : integer;
begin
  StringGrid1.MouseToCell(X, Y, C, R);
  with StringGrid1 do
    begin
      if ((Row <> r) or(Col <> c)) then
        begin
          Row := r;
          Col := c;
          Application.CancelHint;
          StringGrid1.Hint :=stringgrid1.Cells[c,r];
        end;
    end;
end;


Здесь при наведении мышки на ячейку, значениям stringgrid.col и stringgrid.row присваиваются текущие координаты ячейки относительно координат положения мыши. Минус этого способа в том что когда значения stringgrid.col и stringgrid.row присваиваются.. вызывается метод stringgrid1.click и если назначено какое либо действие для клика по ячейки то оно выполняется по мере проведения мыши над ячейкой. Если убрать присваивание этих значений, то хинт присваивается только при принудительном клике на ячейку и последующем движении мыши. но хинт нужен не выделенной ячейки а ячейки под мышью. А так как хинт равен значению выделенной ячейки то он показывается только если вернуть мышь над выделенную ячейку. Есть ли способ вызывать хинт с текстом ячейки над каждой строкой без принудительного клика по ней? Либо как можно заблокировать выполнение stringgrid.click при движении мыши над ячейкой, но что бы это не мешало вызывать метод клика нажатием левой кнопки мыши?
Последний раз редактировалось alex208210 23.05.2011 21:02:28, всего редактировалось 1 раз.
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: hint в каждой ячейке stringgrida

Сообщение Maxizar » 23.05.2011 20:49:25

Код: Выделить всё
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  r : integer;
  c : integer;
  Temp:TNotifyEvent;
begin
  Temp:=StringGrid1.OnClick;
  StringGrid1.OnClick:=nil;
  StringGrid1.MouseToCell(X, Y, C, R);
  with StringGrid1 do
    begin
      if ((Row <> r) or(Col <> c)) then
        begin
          Row := r;
          Col := c;
          Application.CancelHint;
          StringGrid1.Hint :=stringgrid1.Cells[c,r];
        end;
    end;
  StringGrid1.OnClick:=Temp;
end;
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: hint в каждой ячейке stringgrida

Сообщение alex208210 » 23.05.2011 21:01:00

Работает!
Maxizar Спасибо!
вот эту функцию и надо брать за основу отображения хинта над каждой ячейкой.

Добавлено спустя 3 часа 16 минут 39 секунд:
Re: hint в каждой ячейке stringgrida [Решено]
Выявился еще один неприятный косяк: Когда мышь находится на последней видимой неполной строке стринггрида.. ячейка фокусируется и таблица прокручивается вверх и если мышь не убирать то таблица вся прокрутится вверх до самой последней строки. Для того что бы этого небыло надо вставить проверку на наличиие мыши на последней видимой неполной строке и последующую отмену фокусирования этой строки.
Добавим условие r < VisibleRowCount+topRow

Код: Выделить всё
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
var
  r : integer;
  c : integer;
  Temp:TNotifyEvent;
begin
  Temp:=StringGrid1.OnClick;
  StringGrid1.OnClick:=nil;
  StringGrid1.MouseToCell(X, Y, C, R);
  with StringGrid1 do
    begin
      if ((Row <> r) or(Col <> c)) and (r < VisibleRowCount+TopRow) then
        begin
          Row := r;
          Col := c;
          Application.CancelHint;
          StringGrid1.Hint :=stringgrid1.Cells[c,r];
        end;
    end;
  StringGrid1.OnClick:=Temp;
end;
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 13

Рейтинг@Mail.ru