Форум: "Основная";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
ВнизФорма в 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.072 c