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

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

Как эмулировать показ hint нажатием, например, button на форме? [D7, WinXP]


Dr. Andrew ©   (2007-07-09 07:28:00) 

Уважаемые Мастера!
Я использую свой класс подсказок оговоренный в процедуре onFormCreate:
{* установить собственный формат подсказок *}
 Application.ShowHint := False;
 HintWindowClass := GraphicHint.TGraphicHintWindow;
 Application.ShowHint := True;

Вопрос: как мне программно эмулировать показ всплывающей подсказки (используя Perform или SendMessange или еще что-то), чтобы моя подсказка всплывала (показывалась), например над панелью Panel1, когда я нажимаю кнопку Button1? Без того, чтобы перемещать мышкой над компонентом или использования события onMouseMove и тому подобное!Пожадуйста, приведете маленький пример. Всем спасибо!


Юрий Зотов   (2007-07-09 14:17:00) [1]

> Dr. Andrew   (09.07.07 13:06) [3]

Если координаты X и Y известны, то меняется только одна строчка:
вместо R.TopLeft := Panel1.ClientToScreen(Point(4, 4));
пишем что-то вроде этого R.TopLeft := Point(X, Y-6);

Только убедитесь, что X и Y - это абсолютные экранные координаты, а не клиентские (иначе сначала перегоните их через ClientToScreen компонента).


Dr. Andrew   (2007-07-09 13:06:00) [2]

Спасибо Юрий.
Но, задача несколько сложнее. Есть текстовый компонент типа RichView с текстом. Программно (не мышкой!) я выделяю, например третье слово во второй строке и могу опрелелить координаты его начала, например в переменные X и Y. И вот над этим словом с этими координатами (то есть с мнимой позицией курсора) мне необходимо вывести подсказку, мой класс GraphicHint.TGraphicHintWindow, который я определил в процедуре onFormCreate. Что в вашем примере в таком случае надо изменить? И только есть такой путь - проще ничего нет? Еще раз спасибо за очень квалифицированный ответ.


Юрий Зотов   (2007-07-09 08:53:00) [3]

Вот полный пример:

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Button1: TButton;
   Timer1: TTimer; // Enabled = False
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
 private
   FHintWindow: THintWindow;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FHintWindow := HintWindowClass.Create(Self)
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 H: string;
 R: TRect;
begin
 H := 'Hello';
 R.TopLeft := Panel1.ClientToScreen(Point(4, 4));
 R.Right := R.Left + FHintWindow.Canvas.TextWidth(H) + 4;
 R.Bottom := R.Top + FHintWindow.Canvas.TextHeight(H) + 4;
 FHintWindow.ActivateHint(R, H);
 Timer1.Enabled := True
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 FHintWindow.ReleaseHandle;
 Timer1.Enabled := False
end;


Юрий Зотов   (2007-07-09 08:19:00) [4]

Application.ActivateHint(Mouse.CursorPos);


Наверх

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