Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.20;
Скачать: CL | DM;

Вниз

Форма в SysTrey и SetForegroundWindow   Найти похожие ветки 

 
Интересующийся   (2007-03-21 02:47) [0]

Всем доброе время суток!

В теории:
Существует форма, которя отображается в трей и у которой существуе менюшка которая вываливается при клике на иконке в SysTrey.
Один из пунктов данног мею позволяет показать файл справки *.hlp.

На практике:
При использоании SetForegroundWindow файл перестает отоброжатья, а без SetForegroundWindow менюшка глючит или перестает вываливаться.


const
Msg_FromIcon=WM_USER+400;
..........
Protected

Procedure MyHandler(var Message:TMessage); message Msg_FromIcon;
..........

Procedure TFMain.MyHandler(var Message:TMessage);
Var
P:TPoint;
Begin

   if Message.LParam=516 then
   begin
   SetForegroundWindow(FMain.Handle);
   GetCursorPos(P);
   MainMenu.Popup(P.x,P.y);
   end;

End;
..........
Procedure TFMain.HelpClick(Sender:TObject);
Begin
Application.HelpCommand(HELP_FINDER,0);
End;



Как заставить отображать справку при использовании SetForegroundWindow?

P.S.
В качестве меню испольщуется TPopupMenu, SetForegroundWindow используется для вывода формы на переднем плане.


 
Германн ©   (2007-03-21 02:54) [1]


> В теории:
> Существует форма, которя отображается в трей и у которой
> существуе менюшка которая вываливается при клике на иконке
> в SysTrey.
>

Хреновая теория. В Трее отображаются только иконки. А уж кто их туда поместил и какие "менюшки" разрешил - это вопрос, но другой :)


 
Elen ©   (2007-03-21 09:56) [2]

Что-то я не пойму, а как ты вызываеш MyHandler? На Трей тут и намека нет, может тебе нужна иконка в трее, и по клику на нее должна выползать меню?
Или у тебя есть на экране форма, которая находится в области трея? Задача то какая?


 
Интересующийся   (2007-03-21 12:33) [3]

> Elen ©   (21.03.07 09:56) [2]


Procedure MyHandler(var Message:TMessage); message Msg_FromIcon;


MyHandler - Процедура обрабатывающая событие Msg_FromIcon (в разных примерах Msg_FromIcon=WM_USER+400 / MW_MYTRAYNOTIFY = WM_USER+123)

P.S.
Иконка создается и разрушается нормально, проблема именно в меню.....


 
Интересующийся   (2007-03-21 12:56) [4]

> Германн ©   (21.03.07 02:54) [1]
> Elen ©   (21.03.07 09:56) [2]

Вопрос не в том как создать и отобразить иконку, а в том как заставить работать менюшку как мне нада, а не так как ему вздумается.

Проблемная процедура в моей проги:

Procedure TFMain.MyHandler(var Message:TMessage);
Var
P:TPoint;
Begin

  if Message.LParam=516 then
  begin
  SetForegroundWindow(FMain.Handle);
  GetCursorPos(P);
  MainMenu.Popup(P.x,P.y);
  end;

End;


Основа процедуры взята из примера по работе с иконкой в SysTrey взятой из нета, дополнена строчками из примера. В место MainMenu в первоначальном примере использовалось меню созданойе средствами API.

Пример с  SetForegroundWindow:

Procedure TFMain.MWICON(var Message:TMessage);
Var
P:TPoint;
Begin

 Case Message.LParam of
 WM_LBUTTONDOWN:
 Begin
 GetCursorPos(P);
SetForegroundWindow(Application.MainForm.Handle);
MainMenu.Popup(P.x,P.y);
 End;

End;


P.S.
В результате выполнения моей процедуры создается иконка, вываливается менюшка но пунк меню вызывающий справку работать отказывается :(


 
clickmaker ©   (2007-03-21 13:04) [5]


> но пунк меню вызывающий справку работать отказывается

MyHandler не вызывается?

SetForegroundWindow(Application.Handle) ?


 
Elen ©   (2007-03-21 13:19) [6]

Может просто не выполняется код прописанный в том пункте меню. Проверь доходит ли выполнение туда и выполняются ли те операторы.


 
Интересующийся   (2007-03-21 13:28) [7]

> clickmaker ©   (21.03.07 13:04) [5]
В этой области все работает

Отказывается работать вот этот код:

Procedure TFMain.HelpClick(Sender:TObject);
Begin
Application.HelpCommand(HELP_FINDER,0);
End;


Хотя вот эти два кода работают

Procedure TFMain.ExitClick(Sender:TObject);
Begin
Close;
End;

Procedure TFMain.HelpClick(Sender:TObject);
Begin
Application.MessageBox("Вызов файла справки...","HelpClick",64);
End;



P.S.
Если убрать SetForegroundWindow(FMain.Handle) из MyHandler справка отображается нормально, но меню начинает глючить (не убирается с экрана или перестает отображаться). Неохота все время снимать прогу по Ctrl+Alt+Del :(;

Как я небезоснования полагаю, вся проблема возникает из-за отображения формы на переднем плане в режиме, когда прога свернута в SysTrey.

Отображение файла справки конечно вопрос непринципиальный, но хотелось получить в меню такой пункт.


 
Интересующийся   (2007-03-21 13:39) [8]

> Elen ©   (21.03.07 13:19) [6]
Код конечно проверил, все доходит, и наверника выполняется. Но я предполагаю, что из за того, что форма в положена в SysTrey и определена на передний план файл справке пользователь не видет. Это легко проверить удалив (откоментировав) строку SetForegroundWindow(FMain.Handle).

P.S.
Причем без разници что идет как параметр: FMain.Handle, Application.Handle или Application.MainForm.Handle.

Думаю существует две возможности:
1. Отказаться от вызова файла справки
2. Отменить действие строки SetForegroundWindow(FMain.Handle) перед вызовом файла справки (но я незнаю как это сделать).

Конечно я мог непонимать логики примера

Procedure TFMain.MWICON(var Message:TMessage);
Var
P:TPoint;
Begin

Case Message.LParam of
WM_LBUTTONDOWN:
Begin
GetCursorPos(P);
SetForegroundWindow(Application.MainForm.Handle);
MainMenu.Popup(P.x,P.y);
End;
WM_LBUTTONUP:
End;

End;


 
Elen ©   (2007-03-21 14:53) [9]


> то из за того, что форма в положена в SysTrey и определена
> на передний план файл справке пользователь не видет

Чепуха. Форма в трей не ложится - туда ложится иконка, и передний план тут непричем, если конечно у тебя форма не настолько большая, чтоб перекрыть остальные формы и в том числе форму хелпа. Кстати я б хелп в HTML превратила и показывала на своей форме черех TwebBrowser.


 
Интересующийся   (2007-03-21 16:00) [10]

> Elen ©   (21.03.07 14:53) [9]
> то из за того, что форма положена в SysTrey и определена
> на передний план файл справке пользователь не видит
> Чепуха. Форма в трей не ложится - туда ложится иконка, и передний план тут не причем...

На счет формы, спорить небуду. Скорей всего это так и есть, но вот без этой строки SetForegroundWindow(FMain.Handle) файл справки нормально отображается :(

Насколько я помню из описания этот вызов выводит форму на передний план...

Вопрос в том как использую SetForegroundWindow в одном месте (где это действительно нужно) во втором оставить все как есть (отменить действие SetForegroundWindow перед показом файла справки). Но как я писал ранее как сделать это я не знаю :(

P.S.
Поэтому нужен конкретный совет как переписать процедуру отображающую менюшку, а не рассуждения о том как создать иконку.

А форма у меня вообще одна и отображаться в принципе не должна, иначе давно кнопочек на ней набросал и проблем не имел.


 
Интересующийся   (2007-03-22 17:02) [11]

Простейший способ решить данную проблему (реализован во многих прогах):

1. остовляем MyHandler без изменения, со строкой  SetForegroundWindow(FMain.Handle);
2. Создаем дополнительную форму TFAbout и помещаем туда основную информацию описывающую прогу;
3. Подключаем форму к проекту и вызываем ее с помощью FMISAbout.Show;

Ура, все работает! :)

P.S.
При необходимости файл справки можно вызвать из TFAbout.

>Elen ©   (21.03.07 14:53) [9]

Идея с TwebBrowser конечно хороша, но по сравнению с моим решением кажется более громозкой, хотя если все правильно организовать и HTML закатать в EXE как ресурсы будет интересна для многих :)



Страницы: 1 вся ветка

Текущий архив: 2007.05.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
3-1172815383
cad2206
2007-03-02 09:03
2007.05.20
MySQL и русские символы


15-1177295295
Slider007
2007-04-23 06:28
2007.05.20
С днем рождения ! 22 апреля


2-1178102376
Neket
2007-05-02 14:39
2007.05.20
Колличество строк


15-1176963350
Pazitron_Brain
2007-04-19 10:15
2007.05.20
Ищется память для ноутбука


3-1172922633
---SerG---
2007-03-03 14:50
2007.05.20
Инсталятор для баз данных