Здравствуйте жители королевства.
Помогите пож. разобраться с Hint-ами.
Мне нужно показать hint для каждой ячейки DBgrida.
Как это правильно сделать?
(код оделения длины текста ячейки, и считывание
текста ячейки я написал).
Но как добраться до каждого из Edit-ов (ячеек), чтобы установить им свойства ShowHint и Hint?
Или нужно показывать подсказки другим способом?
Заранее спасибо.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
03-02-2009 09:00 | Комментарий к предыдущим ответам
2 Shabal:
нет ли случайно вопроса - развития этой темы?
// проверить, что не в редакторе!
if not OkToWork or EditorMode {or (DataSource.DataSet.State <> dsBrowse)} then Exit;
Cell := MouseCoord(X, Y);
if (Cell.X = 0) or (Cell.Y = 0) then Exit;
// - вошла ли мыша в новую ячейку?
if (FLastCol <> Cell.X) or (FLastRow <> Cell.Y) then begin
FLastCol := Cell.X;
FLastRow := Cell.Y;
// чтоб не вылезти за границы массива
if (Cell.X <= (LeftCol + VisibleColCount - 1)) and (Cell.X >= LeftCol) then begin
iCurRec := DataLink.ActiveRecord;
BeginUpdate;
try
DataLink.ActiveRecord := Cell.Y - 1;
// текст
S := Columns[Cell.X - 1].Field.DisplayText; // GetEditText(DataToRawColumn(Cell.X) - 1, Cell.Y)
// ячейка
R := CellRect(Cell.X, Cell.Y);
HW.Canvas.Font.Assign(Self.Font);
if (HW.Canvas.TextWidth(S) + 2) > Columns[Cell.X - 1].Width then begin
P := ClientToScreen(Point(R.Left, R.Top));
R := Rect(P.X, P.Y, P.X + HW.Canvas.TextWidth(S) + 7, P.Y + RowHeights[Cell.Y] - 2);
OffsetRect(R, -1, -1);
HW.Canvas.TextRect(R, 0, 0, S);
HW.ActivateHint(R, S);
end
else begin
if IsWindowVisible(HW.Handle) then ShowWindow(HW.Handle, SW_HIDE);
HW.ReleaseHandle;
end;
finally
EndUpdate;
DataLink.ActiveRecord := iCurRec;
end;
end;
end;
end;
procedure TToolTipsDBGrid.MouseWheelHandler(var Message: TMessage);
begin
if (Message.Msg = WM_MOUSEWHEEL) and OkToWork then begin
if SmallInt(HiWord(Message.wParam)) > 0
then DataSource.DataSet.Prior
else DataSource.DataSet.Next;
Message.Result := 1;
end else
inherited MouseWheelHandler(Message);
end;
procedure TToolTipsDBGrid.NewGridWindowProc(var Msg: TMessage);
begin
case Msg.Msg of
CM_MOUSELEAVE: if IsWindowVisible(HW.Handle) then begin
ShowWindow(HW.Handle, SW_HIDE);
HW.ReleaseHandle;
end;
end;
FOldGridWindowProc(Msg); // вызываем "старый" обработчик!
end;
function TToolTipsDBGrid.OkToWork: Boolean;
begin
Result := Assigned(DataSource) and Assigned(DataSource.DataSet) and (DataSource.DataSet.Active);
end;
Я тоже воспользовался информацией других программеров, отовсюду понемногу, поэтому считаю долгом поделиться. (Судя по оперативности Вашего ответа, Вам это тоже срочно нужно поэтому пишу рабочие заготовки. Хотя решение я уже почти отшлифовал - Hint появляется (правда пока не установил таймер для него - появляется сразу, и проверку еще не втиснул.
Хотя от Вашего решения не откажусь :-) ).
итак:
procedure TAsBaseGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
var
Cell: TGridCoord;
iAllCol, iAllRows, i, iCurRec : Integer;
begin
Cell := MouseCoord(X, Y);
// - вошла ли мыша в новую ячейку?
// - iLastCol, iLastRow объявлены в моем гриде.
if (iLastCol <> Cell.X) or (iLastRow <> Cell.Y) then
begin
iLastCol := Cell.X;
iLastRow := Cell.Y;
iAllCol := VisibleColCount;
iAllRows := VisibleRowCount;
// чтоб не вылезти за границы массива
if Cell.X <= iAllCol then
begin
if Cell.X < 1 then Cell.X := 1;
if Cell.Y >iAllRows then Cell.Y := iAllRows;
if Cell.Y < 1 then Cell.Y := 1;
Col := Cell.X;
Row := Cell.Y;
iCurRec:=DataLink.ActiveRecord;
DataLink.activeRecord:=Cell.Y-1;
// sHintStr для Application.OnShowHint
// объявл. в гриде
sHintStr :=Fields[Cell.x-1].displayText;
Application.ActivateHint(ClientToScreen(Point(x, y)));
DataLink.ActiveRecord:=iCurRec;
ShowHint := true;
end;
end;
end;
проверка длины
(еще не решил, где я вставлю эту проверку)
использую Свойство столбца грида и длину строки в пикселях
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.