![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хинты для 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));