Нестандартный Hint

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

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

Нестандартный Hint

Сообщение Nik » 30.09.2010 19:55:26

Понадобилось сделать Hint с нестандартным содержанием (в иделе - использовать вместо Hinta свой ListBox с кастомной отрисовкой). Но в какую сторону копать - вообще не могу придумать. Нашел пару Delphi-примеров по отрисовке кастомных Hint'ов, но там описано только изменение шрифта, а этого мало.

Ткните меня куда-нибудь носом на эту тему :)
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Нестандартный Hint

Сообщение Mr.Smart » 30.09.2010 20:01:47

Создайте форму без рамки и показывайте её вместо хинта.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Нестандартный Hint

Сообщение Nik » 30.09.2010 20:06:39

Форму создать не проблема. Вопрос в том, как её вызвать именно в качестве Hint'а.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Нестандартный Hint

Сообщение Mr.Smart » 30.09.2010 20:15:22

Смотрим у Application. Там есть что-то типа OnHint.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Нестандартный Hint

Сообщение Nik » 30.09.2010 20:20:51

Есть, ага, но как перекрыть чем-то совсем нестандартным - хз пока. Тупо фон поменять - без проблем, кастомную отрисовку на канве - тоже. А вот засунуть контрол вместо хинта пока не получается. И нагуглить ничего на эту тему пока тоже не могу, блин.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Нестандартный Hint

Сообщение Mr.Smart » 30.09.2010 20:28:36

В модуле forms смотрите в сторону THintWindow, THintWindowClass и переменную HintWindowClass :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Нестандартный Hint

Сообщение Brainenjii » 30.09.2010 20:45:46

Код: Выделить всё

Unit Unit1;

{$mode objfpc}{$H+}

Interface

Uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Buttons;

Type

{ BHintForm }

{ BHintFormClass }

BHintFormClass = Class(TForm)
  Private
    bBox: TListBox;
  Public
    Property Box: TListBox Read bBox;
    Procedure ShowMe;
    Constructor Build;
    Destructor Burn;
End;

Type

  { TForm1 }

  TForm1 = Class(TForm)
    Procedure FormCreate(Sender: TObject);
  Private
    { private declarations }
    bHintForm: BHintFormClass;
  Public
    { public declarations }
    Procedure MyOnHint(Sender: TObject);
  End;

Var
  Form1: TForm1;

Implementation

{$R *.lfm}

{ TForm1 }

Procedure TForm1.FormCreate(Sender: TObject);
Var
  i: Integer;
Begin
  bHintForm := BHintFormClass.Build;
  For i := 1 To 3 Do
    With TSpeedButton.Create(Self) Do
      Begin
        Parent := Self;
        ShowHint := TRUE;
        Caption := IntToStr(i);
        Hint := Caption;
        Left := i * (Width + 10);
      End;
  Application.OnHint := @MyOnHint;
end;

Procedure TForm1.MyOnHint(Sender: TObject);
Begin
  Application.HideHint;
  Application.ProcessMessages;
  bHintForm.ShowMe;
  Application.ShowHint := TRUE;
End;

{ BHintFormClass }

Procedure BHintFormClass.ShowMe;
Begin
  Top := Mouse.CursorPos.Y;
  Left := Mouse.CursorPos.X;
  Show;
End;

Constructor BHintFormClass.Build;
Begin
  Inherited Create(Application);
  bBox := TListBox.Create(Self);
  bBox.Parent := Self;
  bBox.Align := alClient;
  Width := 100;
  Height := 100;
  BorderStyle := bsNone;
End;

Destructor BHintFormClass.Burn;
Begin
  Box.Free;
  Inherited Destroy;
End;

End.

Вот создание формы ^_^ Правда её ещё и прятать, и узнавать откуда хинт пришёл >_<
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Нестандартный Hint

Сообщение Nik » 30.09.2010 20:55:40

2Brainenjii
Спасибо! Попробую поэкспериментировать. Ещё придумал немного извращённый метод с непосредственным показом ListBox в нужной точке экрана после небольшой паузы. Может чего дельное и выйдет в итоге :)

Добавлено спустя 39 минут 6 секунд:
Таки сделал Hint из формы, всё работает отлично, но есть одно маленькое "но". При показе формы-хинта главное окно теряет фокус (что логично). Если вернуть фокус принудительно (SetFocus для контрола, вызвавшего подсказку), то "падает" вниз (под родительское окно). Если форме-хинту поставить Style = StayOnTop, то поведение приходит в норму, но при этом форма игнорирует свойство BorderStyle и всегда показывается с рамкой и заголовком.

Собственно, вопрос вот в чём. Как показать форму без бордера поверх всех окно так, чтобы она при этом не забирада фокус у родительского окна.

Добавлено спустя 5 минут 25 секунд:
Всё, кажется пофиксил, теперь работает точно как задумано :)
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru