Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Хинты для TStringGrid [D7, WinXP]


Вопрошающий ©   (2005-05-20 16:18:00) 

Как сделать хинты для каждой ячейки компонента TStringGrid, особеднно для FixedRows?


Вопрошающий   (2005-05-23 11:01:00) [1]

Вот готовый вариант, если кому-то нужно...

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
 X, Y: Integer);
var   r,c: integer;
  CellRect:TRect;
 s:string;
 R1: TRect;
 i,offsetX, offsetY:integer;
begin

if not Assigned(FHintWnd) then
  FHintWnd := THintWindow.Create(Self);

StringGrid1.MouseToCell(X, Y, C, R);

if (c=-1) or (r=-1) then
 Exit;

Label5.Caption:='Col:='+IntToStr(c)+' Row:=' +IntToStr(r);
s:=StringGrid1.Cells[c,r];
R1:=StringGrid1.CellRect(c,r);
if ((FHintWnd.Canvas.TextWidth(S) + 4)>(R1.Right-R1.Left) ) then
begin
   OffsetRect(R1, X,Y);
   R1.TopLeft:=ClientToScreen(R1.TopLeft);
   R1.BottomRight:=ClientToScreen(R1.BottomRight);
   R1.Right:=R1.Left+FHintWnd.Canvas.TextWidth(S)+7;
   R1.Bottom:=R1.Top;
   R1.Top:=R1.Bottom-StringGrid1.RowHeights[r];
   OffsetRect(R1, StringGrid1.Left-1, StringGrid1.Top-1);
   OffsetX:=0;
   if c>0 then
   for i:=0 to c-1 do
    offsetX:=offsetX+StringGrid1.ColWidths[i];

   OffsetY:=0;
   if r>0 then
   for i:=0 to r-1 do
    offsetY:=offsetY+StringGrid1.RowHeights[i];
   OffsetRect(R1, -offsetX, -offsetY);
   FHintWnd.ActivateHint(R1, S);
end
else
   if IsWindowVisible(FHintWnd.Handle) then
      FHintWnd.ReleaseHandle;
end;


Вопрошающий   (2005-05-20 20:00:00) [2]

помогите переписать этот кусок кода под StringGrid
procedure TXDBGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
var
 Cell: TGridCoord;
 iCurRec: Longint;
 R: TRect;
 P: TPoint;
 S: String;
begin
 inherited MouseMove(Shift, X, Y);

 Cell := MouseCoord(X, Y);

 
 if not OkToWork or EditorMode or
   (DataLink.DataSet.State dsBrowse) or
   DataLink.DataSet.ControlsDisabled or
   (DataLink.DataSet.RecordCount = 0) or
   DataLink.DataSet.IsEmpty or
   ((dgIndicator in Options) and (Cell.X = 0)) {or (Cell.Y = 0)} then
 begin
   CloseToolTipWindow;
   Exit;
 end;

 if (FLastCol Cell.X) or (FLastRow Cell.Y) then begin
 
   FLastCol := Cell.X;
   FLastRow := Cell.Y;
   if (Cell.X = LeftCol) then begin
     
     iCurRec := DataLink.ActiveRecord;
     if FLastRow > 0 then begin
       BeginUpdate;
       try
       
         DataLink.ActiveRecord := Cell.Y - 1;
       
         if Assigned(Columns[RawToDataColumn(FLastCol)].Field)
           then S := Columns[RawToDataColumn(FLastCol)].Field.DisplayText
           else S := '';
       finally
         DataLink.ActiveRecord := iCurRec;
         EndUpdate;
       end;
     end
     else begin
       S := Columns[RawToDataColumn(FLastCol)].Title.Caption;
     end;

     
     if (FHintWnd.Canvas.TextWidth(S) + 4) > Columns[RawToDataColumn(FLastCol)].Width then begin
       R := CellRect(Cell.X, Cell.Y);
       P := ClientToScreen(Point(R.Left, R.Top));
       
       R := Rect(P.X, P.Y, P.X + FHintWnd.Canvas.TextWidth(S) + 7,
         P.Y + RowHeights[Cell.Y] - 2);
       OffsetRect(R, -1, -1);
       FHintWnd.ActivateHint(R, S); // ïîêàæåì õèíò
//        FHintWnd.Canvas.TextRect(R, 0, 0, S);
//        FHintWnd.Canvas.Rectangle(R);
     end
     else CloseToolTipWindow;
   end;
 end;
end;


Вопрошающий   (2005-05-20 17:19:00) [3]


> procedure TFormConf.SG_STATUSMouseMove(Sender: TObject;
> Shift: TShiftState; X, Y: Integer);
> var   r,c: integer;
> begin
>  try
> SG_STATUS.MouseToCell(X, Y, C, R);
>  with SG_STATUS do
>  begin
>    if ((Row <> r) or(Col <> c)) then
>     if (c<= SG_STATUS.ColCount-1) and (r<=SG_STATUS.RowCount-1)
> then
>    begin
>      Row := r;
>      Col := c;
>      Application.CancelHint;
>      SG_STATUS.Hint := SG_STATUS.Cells[c,r];
>    end;
>  end;
>  except
>  end;  
> end;

этот код немного глючит
если наводишь на фиксированную строку, то подней появляется копия фиксированной строки. Если фиксированных строк несколько, то при наведении на одну из ячеек фиксированной строки, появляется такое же количество строк, сколько есть фиксированных, со значениями в ячейках, которые присвоенный фиксированным строкам.
Кто знает, как можно убрать этот эффект?


-=XP=-   (2005-05-20 16:49:00) [4]

Вопрошающий   (20.05.05 16:46) [7]

Вам что, еще и про F1 рассказывать?
Вот еще!


Вопрошающий   (2005-05-20 16:46:00) [5]

а как выглядит ф-ция MouseToCell(X; Y; var Col; var Row)?
и как мне в хинт поместить значение ячейки из фиксированного ряда?


Antonn   (2005-05-20 16:41:00) [6]

а вот и примерчик...

procedure TFormConf.SG_STATUSMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var   r,c: integer;
begin
 try
SG_STATUS.MouseToCell(X, Y, C, R);
 with SG_STATUS do
 begin
   if ((Row <> r) or(Col <> c)) then
    if (c<= SG_STATUS.ColCount-1) and (r<=SG_STATUS.RowCount-1) then
   begin
     Row := r;
     Col := c;
     Application.CancelHint;
     SG_STATUS.Hint := SG_STATUS.Cells[c,r];
   end;
 end;
 except
 end;  
end;


-=XP=-   (2005-05-20 16:30:00) [7]

Для всех. И даже для пустого пространства.


Вопрошающий   (2005-05-20 16:29:00) [8]

а для FixedRows это будет работать?


Игорь Шевченко   (2005-05-20 16:27:00) [9]

Пример для ListBox, например, есть в http://www.delphikingdom.com/treasury/combo.htm


Игорь Шевченко   (2005-05-20 16:25:00) [10]

Обрабатывать OnMouseMove, вызывать ActivateHint от THintWindow


-=XP=-   (2005-05-20 16:24:00) [11]

Обрабатывать событие: OnMouseMove;
Определять, над какой ячейкой находится указатель: MouseToCell(X; Y; var Col; var Row);
Устанавливать хинт в зависимости от Col и Row: Hint := 'Col: ' + IntToStr(Col) + '; Row: ' + IntToStr(Row);
Выводить хинт: Application.ActivateHint(Point(X, Y));


Наверх

Титульная страница Поиск, карта сайта Написать письмо