Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Заставить появляться Hint в конкретных координатах


Автор: Fedor 8.11.2004, 10:55
Собственно, как сделать САБЖ.
У меня есть компонент. И мне нужно чтоб при наведении на него мышки Hint появлялся не в том месте, где курсор, а в определенных координатах на этом компоненте X и Y

Автор: Pakshin A. S. 8.11.2004, 13:46
Лови:
Код

function RevealHint(Control: TControl; x,y:integer): THintWindow;
// Делаем подсказку для компонента Control в позиции (x;y) на компоненте
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, y);
inc(HintPos.X, x);
HintBox:=Bounds(0, 0, Screen.Width, 0);
DrawText(Result.Canvas.Handle, StrPCopy(AShortHint, ShortHint), -1, HintBox, DT_CANCRECT or DT_LEFT or DT_WORDBREAK or DT_NOPREFIX);
OffsetRect(HintBox, HintPos,x, HintPos,y);
// здесь, может, то же зявязка с позицией...
inc(HintBox.Right, 6);
inc(HintBox.Bottom, 2);
Result.ActiveHint(HintBox, ShortHint);
end;

procedure RemoveHint(var Hint: THintWindow);
begin
Hint.RealaseHandle;
Hint.Free;
Hint:=nil;
end;

Автор: <Spawn> 8.11.2004, 13:47
Бросаешь на форму ApplicationEvents и пишешь обрабочтик OnHint примерно так:

Код

procedure TForm1.ApplicationEvents1ShowHint(var HintStr: String;
 var CanShow: Boolean; var HintInfo: THintInfo);
var
 P: TPoint;
begin
 if HintInfo.HintControl = Button1 then
 begin
   P := Point(Button1.Left + Button1.Width, Button1.Top + Button1.Height);
   P := ClientToScreen(P);
   //Отображаем подсказку в правом нижнем углу кнопки
   HintInfo.HintPos.X := P.X;
   HintInfo.HintPos.Y := P.Y;
 end;
end;

Автор: Zero 8.11.2004, 14:36
<Spawn>, у меня такой же вопрос, но только, как сделать это если на форме будет метка Label

Автор: Pakshin A. S. 8.11.2004, 14:48
Тогда пробуем мой метод...
Он самомтоятельно моздает Hint для любого компонента... Можно ещё в процедуру и вставить параметр, отвечающий за текст подсказки..

Автор: <Spawn> 8.11.2004, 15:29
Zero Ты хочешь отобржатаь подсказку в TLabel?

Если так, то:

Код

procedure TForm1.ApplicationEvents1ShowHint(var HintStr: String;
var CanShow: Boolean; var HintInfo: THintInfo);
begin
 CanShow := False;
 Label1.Caption := HintStr;
end;

Автор: Zero 8.11.2004, 17:01
Цитата
Zero Ты хочешь отобржатаь подсказку в TLabel?

Только в заданых координатах...
И я не совсем понял как сделать метод ApplicationEvents1ShowHint
А кстати Pakshin A.S., в твоём сбособе DT_CANCRECT ─ является неизвесным идентификатором... smile

Автор: Pakshin A. S. 8.11.2004, 17:12
DT_CALCRECT

Автор: Zero 8.11.2004, 17:23
Спасибо одну часть исправил, а вот теперь в строке
Код

OffsetRect(HintBox, HintPos,x, HintPos,y);

компмлятор выдаёт ошибку останавливаясь на x: след.:
[Error] Unit1.pas(41): Incompatible types: 'Integer' and 'TPoint'

Автор: Pakshin A. S. 8.11.2004, 17:57
Сразу мог сказать?!
OffsetRect(HintBox, HintPos.x, HintPos.y);

Автор: Zero 8.11.2004, 18:43
Цитата
Сразу мог сказать?!

До него у меня компилятор тогда ещё не дошол тогда.
А вот теперь я думаю, остался последний неизвесный идентификатор: ActiveHint. smile
В строке
Код

Result.ActiveHint(HintBox, ShortHint);

Автор: Pakshin A. S. 9.11.2004, 19:32
Да... без компилятора плохо... надо будет взять...
Result.ActivateHint(HintBox, ShortHint);

Автор: Zero 9.11.2004, 21:12
Цитата
А вот теперь я думаю, остался последний неизвесный идентификатор: ActiveHint.

Я был не прав smile , но предпологаю, что заместо
Код

Hint.RealaseHandle;

надо
Код

Hint.ReleaseHandle;

При этом, наконец-то компилируется, но всётаки, вопрос был как отправить хинты в координать X,Y ─ при наведении курсора на Label?

Автор: Pakshin A. S. 9.11.2004, 21:35
smile
Берем и перадеём подскузку как параметр в процедуру. По событию "Мышь на lаbel" показываем hint, если не показан hint. Как мышь вышла, убираем...

Автор: Zero 9.11.2004, 23:22
Цитата
По событию "Мышь на lаbel" показываем hint

Ты имееш ввиду на событие Label1MouseMove, чтоль???
Неработает, т.к. в процедуре RemoveHint, всего один параметр, и он должен быть типа THintWindow.
Короче говоря, вот есть у меня, форма на которой, находится Label, а в окне кода есть две твоих процедуры, и что куда ещё нужно дописть чтобы всётаки подсказка выдавалась в координатах [x,y]. Да чтобы нам не путатся пусть X и Y, в процедуре создания форма присваивают значения [200,300].

Автор: Pakshin A. S. 10.11.2004, 20:04
Понял правильно... создай глобальную переменную типа THintWindow и юзай в соответствующих событиях ту или иную процедуру... smile

Вообще видел оригинальный способ подсказки. В качестве фона подсказки используется обыкновенный TPanel, с настройками бортов. На ней Label... Управляя свойством Visible и Left, Top можно организовать интереный и простой Hint... smile

Автор: Zero 10.11.2004, 23:40
Цитата
Понял правильно...

Ты хочеш сказать что, в процедуре Label1MouseMove надо всё втыкать???
Я же говорю, что не работает, т.е. компилятор даёт ошибку в этом случае:
Код

Var
  tt:THintWindow; //Глобальная переменная
...
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
  tt.Top:=100;
end;

А ты немог бы привести простой пример для вывода хинта в коорд. X,Y??? smile
И вообще я уже запутался тут, здесь даже твои две процеуры не используются... smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)