Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.043 c
2-1177669220
Knight
2007-04-27 14:20
2007.05.20
Классы на базе TList...


2-1178101289
sergeyst
2007-05-02 14:21
2007.05.20
Как закрыть нужную форму?


9-1150337378
Mfox
2006-06-15 06:09
2007.05.20
Помогите скачать directx60.rar с DelphiGFX


3-1172908676
Бабенко Олег
2007-03-03 10:57
2007.05.20
Перевод базы формата Firebird 2.0 в Firebird 1.5


2-1178337129
Gromozeka
2007-05-05 07:52
2007.05.20
Проверка строки на соответствие формату даты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский