Прямой вызов Hint

Материал из DRKB

Прямой вызов Hint[править | править код]

{----------------------------------------------------------------}
{ Демонстрирует всплывающую подсказку для определенного элемента }
{ управления (Control), возвращает ссылку на hint-объект,        }
{ поэтому в дальнейшем подсказка может быть спрятана вызовом     }
{ RemoveHint (смотри ниже).                                      }
{----------------------------------------------------------------}
function RevealHint(Control: TControl): THintWindow;
var
  ShortHint: string;
  AShortHint: array[0..255] of Char;
  HintPos: TPoint;
  HintBox: TRect;
begin
  { Создаем окно: }
  Result := THintWindow.Create(Control);

  { Получаем первую часть подсказки до '|': }
  ShortHint := GetShortHint(Control.Hint);

  { Вычисляем месторасположение и размер окна подсказки }
  HintPos := Control.ClientOrigin;
  Inc(HintPos.Y, Control.Height + 6);
  // < < < < Смотри примечание ниже
    HintBox := Bounds(0, 0, Screen.Width, 0);
  DrawText(Result.Canvas.Handle,
    StrPCopy(AShortHint, ShortHint), -1, HintBox,
    DT_CALCRECT or DT_LEFT or DT_WORDBREAK or DT_NOPREFIX);
  OffsetRect(HintBox, HintPos.X, HintPos.Y);
  Inc(HintBox.Right, 6);
  Inc(HintBox.Bottom, 2);

  { Теперь показываем окно: }
  Result.ActivateHint(HintBox, ShortHint);
end; {RevealHint}

{----------------------------------------------------------------}
{ Освобождаем дескриптор окна всплывающей подсказки, выведенной  }
{ предыдущим RevealHint.                                         }
{----------------------------------------------------------------}
procedure RemoveHint(var Hint: THintWindow);
begin
  Hint.ReleaseHandle;
  Hint.Free;
  Hint := nil;
end;

Строка с комментарием <<<< позиционирует подсказку ниже элемента управления. Это может быть изменено, если по какой-то причине вам необходима другая позиция окна с подсказкой.


Source: http://delphiworld.narod.ru/
ID: 01287



{ Появление }
if h <> nil then H.ReleaseHandle; { если чей-то хинт yже был, то его погасить }
H := THintWindow.Create(Окно-владелец хинта);
H.ActivateHint(H.CalcHintRect(...), 'hint hint nint');
....
{ UnПоявление :) - это возможно придется повесить на таймеp, который будет
обнуляться при каждом новом появлении хинта }
IF h <> nil H.ReleaseHandle;

По-дрyгомy задача тоже решаема, но очень плохо. (см исходник объекта TApplication, он как pаз сабжами заведует.


Source: http://delphiworld.narod.ru/
ID: 01288



Сделаем это по нажатию на первую кнопку, а по нажатию на вторую кнопку будем скрывать окно hint'a:

public
  { Public declarations }
  h: THintWindow;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if h <> nil then
    H.ReleaseHandle;
  H := THintWindow.Create(Form1);
  H.ActivateHint(Form1.ClientRect, 'Это всплывающая подсказка');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if h <> nil then
    H.ReleaseHandle;
end;


Source: http://delphiworld.narod.ru/
ID: 01289