Nix0N Опубликовано 22 мая, 2014 Поделиться Опубликовано 22 мая, 2014 Набросал компонент для работы с значком в системном трее. Компонент только для FM и только для платформы Windows ! Среда: Delphi XE6 Основные моменты Свойства: Hint : string - отображает текст при наведении на значок в системном трее BalloonTitle : string - текст заголовка всплывающей подсказки BalloonText : string - текст содержания всплывающей подсказки IconBalloonType : TBalloonIconType - иконка всплывающей подсказки. Принимает значения: BigError, BigWarning, Error, Info, None, User, Warning Indent : Cardinal - "косметический костыль" для нормального отображения меню при клике по значку в системном трее. Подбирается экспериментально, так как при различных стилях область отображения меню изменяется (меню уезжает вверх) PopUpMenu : TPopUpMenu - всплывающее меню, при OnClick правой кнопкой мыши по значку Методы: Show - отображать значок в системном трее Hide - скрыть значок из системного трея ShowBalloonHint - показать всплывающую подсказку События: OnClick - нажатие левой кнопки мыши OnDblClick - двойное нажатие левой кнопки мыши Важное замечание: необходимо обязательное наличие TForm и только один экземпляр TnTrayIcon в приложении ! Установка: Распаковать содержимое архива Открыть файл nTrayIcon.dpk В Project Manager окне правой кнопкой мыши по nTrayIcon.bpl -> Compile В Project Manager окне правой кнопкой мыши по nTrayIcon.bpl -> Install Добавляем путь в Library: Tools -> Options -> Delphi Options -> Library -> Library Patch -> Add... В архиве компонент и пример для работы. P.S. Писал для себя, так как частенько использую... Всегда хочется простоты. P.S.S. Писал быстро и ночью. Возможны недочеты и ошибки. Постепенно исправлю. TnTrayIcon.zip Brovin Yaroslav, Kitty, Вячеслав и 1 другой 4 Цитата Ссылка на комментарий
Skyp Опубликовано 29 мая, 2014 Поделиться Опубликовано 29 мая, 2014 Молодец, спасибо, если "допиливать" будешь, добавь возможность отображения по мимо hint'a, формы( в type's параметр закатай, там sform,shide), и какой, а дальше присваиваем форму. Высчитываем % соотношения к рабочему столу, далее при show плавный opacity к 1единице, так-же при исчезание(после задержки, или же после MouseOver) opacity к 0-лю.... и hide. Как руки дойдут, сам реализую... если у тебя быстрее, то милости просим)) Цитата Ссылка на комментарий
Nix0N Опубликовано 29 мая, 2014 Автор Поделиться Опубликовано 29 мая, 2014 А смысл таких "изворотов" с формой, как альтернативой Hints ? Для моих целей вполне достаточно стандартного меню, единственное, что необходимо "допилить": Определение позиции TaskBar (так как он у пользователя бывает не только снизу) для корректного отображения меню Различные манипуляции с иконкой в трее (смена и т.д.) Кастомный BalloonHint В принципе мне более и не надо P.S. как показывает практика - пользователь все равно нажмет на иконку в трее для получения информации о состоянии (работы) приложения... Цитата Ссылка на комментарий
伝説の Опубликовано 30 июля, 2014 Поделиться Опубликовано 30 июля, 2014 Пару заметок: Меню показывается за таскбаром, а не поверх него. Если включить прозрачность у формы, при запуске иконка в трее показывается и сразу же пропадает. P.S.WIndows 8.1 Цитата Ссылка на комментарий
Nix0N Опубликовано 30 июля, 2014 Автор Поделиться Опубликовано 30 июля, 2014 Если меню оказалось за таскбаром, поиграйтесь с свойством Indent Цитата Ссылка на комментарий
伝説の Опубликовано 30 июля, 2014 Поделиться Опубликовано 30 июля, 2014 Если меню оказалось за таскбаром, поиграйтесь с свойством Indent Причем тут Indent? если речь идет о другом... объясню на примере Сделал для себя временное решение: if Screen.MousePos..Y < VCL.Forms.Screen.WorkAreaTop then PopUpMenu1.Popup(Screen.MousePos.X;, VCL.Forms.Screen.WorkAreaTop) else PopUpMenu1.PopUp(Screen.MousePos.X;, Screen.MousePos..Y); Но как вы понимаете это не решает той проблемы что сейчас. И еще, пока проблема с исчезновение иконки у прозрачной формы не решится, этот компонент бесполезен, по крайней мере для меня, но я все ровно буду искать способ решить эту проблему . Цитата Ссылка на комментарий
Nix0N Опубликовано 30 июля, 2014 Автор Поделиться Опубликовано 30 июля, 2014 Ident задает смещение, что значит причем ? если у Вас таскбар расположен сверху, то ident должен иметь отрицательное значение, к примеру -NN Этот компонент написан на скорую руку. Хотите модернизировать - все Вам скажут спасибо. Добавьте функцию определения позиции таскбара, к примеру. Изначально я не расчитывал, что меню будет располагаться поверх таскбара, только НАД таскбаром. В FM это сделать не легко. Цитата Ссылка на комментарий
伝説の Опубликовано 30 июля, 2014 Поделиться Опубликовано 30 июля, 2014 Ident задает смещение, что значит причем ? если у Вас таскбар расположен сверху, то ident должен иметь отрицательное значение, к примеру -NNЭтот компонент написан на скорую руку. Хотите модернизировать - все Вам скажут спасибо. Добавьте функцию определения позиции таскбара, к примеру. Изначально я не расчитывал, что меню будет располагаться поверх таскбара, только НАД таскбаром. В FM это сделать не легко.Блин, положение меню по оси y, и положение меню как "слой" так сказать это разные вещи. Цитата Ссылка на комментарий
Nix0N Опубликовано 30 июля, 2014 Автор Поделиться Опубликовано 30 июля, 2014 Вы за кого меня принимаете ? Посмотрите на досуге исходники FM, если они у Вас есть... Еще раз повторюсь "Изначально я не расчитывал, что меню будет располагаться поверх таскбара, только НАД таскбаром" т.е. на границе TaskBar и WorkArea. P.S. что за ось Z ? Мы работаем в плоскости, где только 2 направляющие X,Y Цитата Ссылка на комментарий
伝説の Опубликовано 30 июля, 2014 Поделиться Опубликовано 30 июля, 2014 P.S. что за ось Z ? Мы работаем в плоскости, где только 2 направляющие X,Y Вот только не надо к словам придираться, опечатался, с кем не бывает... Вы за кого меня принимаете ? Это просто ответ был на ваше "Ident задает смещение, что значит причем ?" Цитата Ссылка на комментарий
Nix0N Опубликовано 30 июля, 2014 Автор Поделиться Опубликовано 30 июля, 2014 Ну так сместите прямо к границе и не будет проблемы с отображением. А по поводу исчезновения иконки при прозрачной форме - да. Есть такое дело, только что проверил. Цитата Ссылка на комментарий
伝説の Опубликовано 30 июля, 2014 Поделиться Опубликовано 30 июля, 2014 Ну так сместите прямо к границе и не будет проблемы с отображением. Я это уже давно сделал, но хочется чтоб поверх него было, как у нормального приложения. Цитата Ссылка на комментарий
Nix0N Опубликовано 30 июля, 2014 Автор Поделиться Опубликовано 30 июля, 2014 Пока в FM нет возможности "из коробки" вытащить Handle Application наружу - это не возможно. Можно модифицировать самому исходник среды FM, и я могу вписать функцию в исходник компонента, но тогда он будет работать только у тех, у кого модифицирован исходник среды FM. Это не есть хорошо. Ярослав говорил, что якобы в след. версии студии реализуют такую возможность - тогда компонент можно модифицировать и развивать. Пока не вижу смысла. Цитата Ссылка на комментарий
伝説の Опубликовано 30 июля, 2014 Поделиться Опубликовано 30 июля, 2014 Пока в FM нет возможности "из коробки" вытащить Handle Application наружу - это не возможно. Можно модифицировать самому исходник, и я могу вписать функцию в исходник компонента, но тогда он будет работать только у тех, у кого модифицирован исходник FM юнита. Это не есть хорошо. Нет проблем, модифицируйте исходник, скомпилируйте его (в release [x32, x64], debug [x32, x64]), и выложите сюда dcu файлы. Пользователю всего лишь останется их закинуть в C:\Program Files (x86)\Embarcadero\Studio\14.0\lib и там в соответствующие папки (предварительно сделав бэкпак оригинальных), для временного решения в самый раз. Цитата Ссылка на комментарий
Nix0N Опубликовано 30 июля, 2014 Автор Поделиться Опубликовано 30 июля, 2014 В самый раз для тех, у кого версия среды совпадает с моей... Этот способ не пройдет. Сделайте это сами, вот ссылка на решение. Цитата Ссылка на комментарий
伝説の Опубликовано 30 июля, 2014 Поделиться Опубликовано 30 июля, 2014 В самый раз для тех, у кого версия среды совпадает с моей... Этот способ не пройдет. Сделайте это сами, вот ссылка на решение.А что с кодом компонента? нечего править не нужно? Цитата Ссылка на комментарий
Nix0N Опубликовано 30 июля, 2014 Автор Поделиться Опубликовано 30 июля, 2014 Нужно: procedure TnTrayIcon.Show; begin mHWND := FmxHandleToHWND((Self.Owner as TForm).Handle); <<< ---------- ApplicationHWND; mPopUpMenu := nTrayMenu; mIndent := nIndent; ..................... Вот это: mHWND := FmxHandleToHWND((Self.Owner as TForm).Handle); Изменить на это: mHWND := ApplicationHWND; Цитата Ссылка на комментарий
伝説の Опубликовано 30 июля, 2014 Поделиться Опубликовано 30 июля, 2014 Нужно: procedure TnTrayIcon.Show; begin mHWND := FmxHandleToHWND((Self.Owner as TForm).Handle); <<< ---------- ApplicationHWND; mPopUpMenu := nTrayMenu; mIndent := nIndent; ..................... Вот это: mHWND := FmxHandleToHWND((Self.Owner as TForm).Handle); Изменить на это: mHWND := ApplicationHWND; И что это дает?upd Пардон туплю, иконка в трее работать теперь стала (с прозрачной формой). Цитата Ссылка на комментарий
Nix0N Опубликовано 30 июля, 2014 Автор Поделиться Опубликовано 30 июля, 2014 Мне долго объяснять что это даст, если Вы не понимаете как ведет себя среда FM. Я лучше подскажу как решить проблему иначе, не изменяя исходников вообще: 1. Убрать при создании формы операцию nTrayIcon1.Show; 2. Добавить таймер с интервалом минимум 10 мс 3. В событии тамера: nTrayIcon1.Show -> Отключаем таймер. Всё. Проверил - работает. Цитата Ссылка на комментарий
Nix0N Опубликовано 30 июля, 2014 Автор Поделиться Опубликовано 30 июля, 2014 Рад что Вы разобрались =) P.S. если Вы модифицировали исходник, то можете добавить процедуры для Show и Hide: ShowWindow(ApplicationHWND, SW_HIDE); // cкрыть из таскбар ShowWindow(ApplicationHWND, SW_SHOW); // показать в таскбар Евгений Корепов 1 Цитата Ссылка на комментарий
伝説の Опубликовано 30 июля, 2014 Поделиться Опубликовано 30 июля, 2014 Мне долго объяснять что это даст, если Вы не понимаете как ведет себя среда FM. Я лучше подскажу как решить проблему иначе, не изменяя исходников вообще: 1. Убрать при создании формы операцию nTrayIcon1.Show; 2. Добавить таймер с интервалом минимум 10 мс 3. В событии тамера: nTrayIcon1.Show -> Отключаем таймер. Всё. Проверил - работает. Блииин, как же я сразу об этом не подумал... кстати таймер не обязателен, главное этот код не в OnCreate а в OnShow выполнять и все. А вот на этом огромное спасибо, главную проблему решили таким простым способом =) Цитата Ссылка на комментарий
Nix0N Опубликовано 30 июля, 2014 Автор Поделиться Опубликовано 30 июля, 2014 Можно и так, в компоненте не дублируется создание второй иконки. Но не желательно - лишняя нагрузка. Мы же любим оптимизированный софт =) P.S. если Вы правили исходник среды FM, то проблема с "расположением позади taskbar" так же должна исчезнуть. Проверьте. Цитата Ссылка на комментарий
伝説の Опубликовано 31 июля, 2014 Поделиться Опубликовано 31 июля, 2014 P.S. если Вы правили исходник среды FM, то проблема с "расположением позади taskbar" так же должна исчезнуть. Проверьте.Неа, потому я тогда разницы и не увидел. Цитата Ссылка на комментарий
DrBlack Опубликовано 8 ноября, 2014 Поделиться Опубликовано 8 ноября, 2014 Доброе время суток! XE6, Win7 Подскажите пожалуйста, выполнил все рекомендации, а именно: Добавил в FMX.Platform.Win функцию ApplicationHWND, теперь данный код работает: ShowWindow(ApplicationHWND, SW_HIDE); В компоненте TnTrayIcon заменил FmxHandleToHWND((Self.Owner as TForm).Handle) на ApplicationHWND Но проблема стала другой, исконка исчезла, хотя место под неё выделилось, но при наведении мыши, выделенное место пропадает: Прикрепить картинку не смог, по этому ссылка на ЯД Перечитал несколько раз все советы, похоже что такая проблема только у меня, с чем это может быть связано? Цитата Ссылка на комментарий
Nix0N Опубликовано 9 апреля, 2015 Автор Поделиться Опубликовано 9 апреля, 2015 Доброе время суток! XE6, Win7 Подскажите пожалуйста, выполнил все рекомендации, а именно: Добавил в FMX.Platform.Win функцию ApplicationHWND, теперь данный код работает: ShowWindow(ApplicationHWND, SW_HIDE); В компоненте TnTrayIcon заменил FmxHandleToHWND((Self.Owner as TForm).Handle) на ApplicationHWND Но проблема стала другой, исконка исчезла, хотя место под неё выделилось, но при наведении мыши, выделенное место пропадает: Прикрепить картинку не смог, по этому ссылка на ЯД Перечитал несколько раз все советы, похоже что такая проблема только у меня, с чем это может быть связано? Извините, я забросил... Перебежал на QT... Цитата Ссылка на комментарий
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.