Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OnHint при активации формы, нужно, чтоб хинт всплывал при фокусе 
V
    Опции темы
fidres
Дата 8.12.2006, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 15.11.2006

Репутация: нет
Всего: 1



ситуация: форма отрисовывается и на ней фокус переходит на какой-то компонент (к примету ComboBox).
так вот, хотелось бы, чтобы через 2 секунды всплывал хинт данного компонента...
все примеры, найденные мной по хинтам - это всего-лишь отслеживание курсора и возникновения события при помещении кусрора в область компонента... а события по OnActive или OnShow - нигде не описаны...
подскажите?

Код
procedure TForm5.FormShow(Sender: TObject);
begin
   Application.CancelHint;
   form5.ComboBox1.ShowHint:=true;
end;

не прокатывает. почему - не знаю..

Это сообщение отредактировал(а) fidres - 8.12.2006, 10:44
--------------------
Исправьте ошибку в слове <ХЕРОШО> и я скажу Вам оптимист Вы или пессимист.
PM ICQ   Вверх
Elfebet
Дата 8.12.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



если я правильно понял тебе нужно наследовать события OnEnter и OnExit как у label, что то подобное этому
Код

unit ImgHover;
interface
uses
  Messages, Classes, Controls, ExtCtrls;

  type
    TImgHover = class(TImage)
  private
    FOnMouseLeave: TNotifyEvent;
    FOnMouseEnter: TNotifyEvent;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  published
    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
  end;

implementation

procedure TImgHover.CMMouseEnter(var Message: TMessage);
begin
  if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;

procedure TImgHover.CMMouseLeave(var Message: TMessage);
begin
  if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;

end.



--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
PROeXT
Дата 8.12.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.12.2005
Где: Москва

Репутация: нет
Всего: нет



А может стоит попробовать использовать таймер с 2х секундным интервалом? А на событии OnTimer определять "сфокусированный" контрол и отображать его хинт? Или я чего-то не понимаю?  smile 
PM MAIL ICQ   Вверх
Elfebet
Дата 8.12.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



а вообще все гораздо проще
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
cbb1.Hint:='Привет!';
cbb1.ShowHint:=True;
end;


чтобы задержать хинт на две секунды
Код

Application.HintPause:=2000; // 2 сек


Это сообщение отредактировал(а) Elfebet - 8.12.2006, 11:05


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
fidres
Дата 8.12.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 15.11.2006

Репутация: нет
Всего: 1



ещё раз.
задержка по таймеру - не критична (её вообще можно исключить).
вопрос в другом.
форма отрисовывается по событию OnActive. в это время фокус передаётся компоненту со свойством TabOrder = 1.
IMHO не важно чего это за компонент. главное - у него есть свойство Hint и это свойство нужно отобразить НЕПОСРЕДСТВЕННО ПРИ ОТКРЫТИИ ФОРМЫ!
при этом совершенно безразлично в каком месте экрана находится курсор мыши (курсор мыши не играет тут никакой роли! он мне не нужен, т.к. переход в компонен осуществляется по TabOrder'у!)...
всё.

то есть. необходимо отобразить хинт какого-то компонента НЕПОСРЕДСТВЕННО при открытии/активации формы...
замечу, что форма не главная (не MainForm).

Код
  Application.ShowHint := True;
  Application.HintPause := 100; 
  Application.HintHidePause := 29999;
это тоже не главное. хотя... может Application.ShowHint и влияет на то, что у меня form5.ComboBox1.ShowHint не прокатывает?

нифига... проверил. Application.ShowHint не влияет на сколько я понял...

Это сообщение отредактировал(а) fidres - 8.12.2006, 14:52
--------------------
Исправьте ошибку в слове <ХЕРОШО> и я скажу Вам оптимист Вы или пессимист.
PM ICQ   Вверх
Sunvas
Дата 8.12.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



fidres, есть класс THintWindow. С ним и играйся. smile 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
dimazu
Дата 8.12.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



THintWindow - это правильно адназначна.  smile 
Но можно и глобально попробовать сделать.
Это пример просто, но идея понятна...  smile 
Код

procedure TForm1.SeeFirstHint(Hint: String);
var
  Message: TMessage;
begin
  Self.Hint:= Hint;
  if Hint='' then
  begin
    Application.HideHint;
    Application.CancelHint;
  end
  else
  begin
    Application.CancelHint;
    Self.Hint:=Hint;
    if Hint<>'' then
    begin
      TWMMouse(Message).Pos:=PointToSmallPoint(ScreenToClient(Mouse.CursorPos));
      Application.HintMouseMessage(Self, Message);
    end;
  end;
end;

PM MAIL   Вверх
dimazu
Дата 8.12.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



Там просто подменяется хинт апликации, не надо строить ректангл.
Ну раз не понятно, то может  вот так будет понятней:
Код

unit Unit1;

interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Button1: TButton;
    Button2: TButton;
    Procedure PrepareHint(MyControl:TWinControl);
    procedure ShowHint(MyControl:TWinControl);
    procedure HideHint(MyControl:TWinControl);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;
  MyHintWindow : THintWindow;

implementation

{$R *.DFM}

procedure TForm1.ShowHint(MyControl:TWinControl);
var
  R : TRect;
begin
    R := THintWindow(MyHintWindow).CalcHintRect(100,THintWindow(MyHintWindow).Hint,NIL);
    R.TopLeft := THintWindow(MyHintWindow).Parent.ClientOrigin;
    R.Bottom := R.Bottom + r.top;
    R.Right := R.Right + R.Left;
    THintWindow(MyHintWindow).ActivateHint(R,THintWindow(MyHintWindow).Hint);
end;


procedure TForm1.HideHint(MyControl:TWinControl);
begin
  THintWindow(MyHintWindow).ReleaseHandle;
end;

Procedure TForm1.PrepareHint(MyControl:TWinControl);
begin
  if (MyControl.Showhint) and (MyControl.Hint <> '') then
  begin
        MyHintWindow := THintWindow.Create(MyControl);
        MyHintWindow.Hint := TWinControl(MyControl).Hint;
        MyHintWindow.Parent := TWinControl(MyControl);
        MyHintWindow.Color := Application.HintColor;
        MyHintWindow.Hide;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  HideHint (Panel2);
  PrepareHint (Panel1);
  ShowHint(Panel1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  HideHint (Panel1);
  PrepareHint (Panel2);
  ShowHint(Panel2);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
   ShowHint(Panel1);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PrepareHint (Panel1);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  HideHint (Panel1);
end;

end.


PM MAIL   Вверх
fidres
Дата 10.12.2006, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 15.11.2006

Репутация: нет
Всего: 1



dimazu, поучительно. спасибо. smile

З.Ы. ща пока что не до хинтов немного... сдача проги поджимает, поэтому все "красивости" оставляю на потом...
ща больше волнуют другие задачки...
--------------------
Исправьте ошибку в слове <ХЕРОШО> и я скажу Вам оптимист Вы или пессимист.
PM ICQ   Вверх
fidres
Дата 14.9.2007, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 15.11.2006

Репутация: нет
Всего: 1



dimazu, чё-то не вкатывает. ацес виаланшин показывает...
ща ещё поиздеваюсь...

З.Ы. тормозит на ShowHint при открытии формы...
 smile 

Это сообщение отредактировал(а) fidres - 14.9.2007, 06:18
--------------------
Исправьте ошибку в слове <ХЕРОШО> и я скажу Вам оптимист Вы или пессимист.
PM ICQ   Вверх
fidres
Дата 14.9.2007, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 15.11.2006

Репутация: нет
Всего: 1



кстати. де-та был у меня примерчик с мультистринговыми хинтами....
нода поискать... там реализация должна быть самой подсказки!..
точно!
--------------------
Исправьте ошибку в слове <ХЕРОШО> и я скажу Вам оптимист Вы или пессимист.
PM ICQ   Вверх
fidres
Дата 17.9.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 15.11.2006

Репутация: нет
Всего: 1



короче, не стал я башку ломать.
сделал проще. обычную панель киданул поверх остальных компонентов и при необходимости меняю визибл на тру и показываю подсказку.
 smile 

на панельке лежит прогресс_бар и лэбл.
в лэбл выводим текст желаемого собщения, редактируем размер панели с учётом высоты и ширины лэбла и прогресс_бара. перемещаем панель в позицию, в которой находится компонент в фокусе. меняем видимость панели на тру. по таймеру или просто по sleep'у скрываем панель.
никаких TWinControl'ов и прочей байды.
простенько и со вкусом.
можно менять как размер/цвет панели и всех компонентов, так и их форму отображения (рисуя их через полигоны).
в принципе, тоже самое можно делать и с хинтом, но это всё намного сложнее.
куча кода, написанного от руки и ещё не гарантирует, что этот код будет работать где-то на простенькой машине...
а панель - она и в африке панель!
;)

Добавлено через 1 минуту и 9 секунд
кстати!
забыл сказать, что натолкнуло меня на эту мысль реализациия таблички "подождите..." на нашем форуме!!!
 smile 
--------------------
Исправьте ошибку в слове <ХЕРОШО> и я скажу Вам оптимист Вы или пессимист.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0853 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.