Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на Delphi

  Все выпуски  

Программирование на DELPHI v3-7 Выпуск нумер 29


Информационный Канал Subscribe.Ru

Знаете как Стаханов стал рекордсменом?
Под его логином в шахту спускались четыре бригады.


Выпуск № 29

Здравствуйте, уважаемые подписчики!


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

И так задача номер 1, при запуске Вашей программы, в трее (это возле часиков), появляется иконка, после закрытия иконка соответственно исчезает. Для этого в блок Uses добавляем модуль ShellAPI
Затем определяем следующую константу и переменную:

const MyTrayIcon = WM_USER + 1;
var NID: TNotifyIconData;

Далее щелкнув два раза по форме, попадаем в предопределенную процедуру TForm1.FormCreate, и прописываем там следующий код:

with NID do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Handle;
uId := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallbackMessage := MyTrayIcon;
hIcon := Application.Icon.Handle;
szTip := 'Всплывающая подсказка ...';
end;
Shell_NotifyIcon(NIM_ADD, @NID);

Это весь текст необходимый для того, что бы при создании формы, в трее появилась иконка. Теперь осталось указать, что при закрытии приложения, иконку надо убрать. Если этого не сделать, то иконка останется, до тех пор пока вы не наведете на нее мышку, после этого исчезнет. Думаю, Вы неоднократно сталкивались с такой ошибкой в некоторых программах. Поэтому что бы не уподобляться, не аккуратным программистам, в процедуре закрытия формы, указываем всего одну строку:

Shell_NotifyIcon(NIM_DELETE, @NID); // УДАЛИТЬ ЗНАЧОК ИЗ ТРЕЯ


Конечно, от того что в трее будет Ваш значок, ни какого толку. Поэтому задача номер 2, работа с этим самым треем.
Предлагаю при щелчке, правой кнопкой на этом значке, сделать всплывающее меню, что-бы все было как у взрослых :). Для этого надо создать это самое меню. На форму вытаскиваем компонент PopupMenu из закладки Standard. После чего два раза кликаем по меню, и получаем это самое меню. На котором кликаем правой кнопкой, выбираем Insert, и наше меню растет, до нужного количества пунктов, ну а в "Инспекторе Объектов", прописываем название этих пунктов, иконки если хотите, и конечно по двойному клику, получаем процедуру, которая будет выполнятся для этого пункта меню. Предлагаю создать там пункт "Показать приложение", а в процедуре прописать Visible := true; т.к. на сомой форме разместим кнопку "Спрятать", действие которой будет Visible := false; Обязательно сохраните проект, т.к. спрятанное приложение, может не получиться закрыть, разве что вместе с Делфи.
Создаем процедуру, обработки:

// ОБРАБОТКА МЫШИ В ТРЕЕ
procedure TForm1.TrIcon(var a: TMessage);
var P: TPoint;
begin
case a.lParam of
WM_LBUTTONDBLCLK:
begin
SetForegroundWindow(Handle);
end;
WM_RBUTTONDOWN:
begin
GetCursorPos(P);
PopupMenu1.Popup(P.X, P.Y);
end;
end;
end;


И регистрируем ее в { Private declarations } следующей строкой:

procedure TrIcon(var a: TMessage); message MyTrayIcon;

Вот вроде и все. Теперь при запуске приложения и нажатии на форме кнопки "Спрятать", приложение становиться невидимым, а при правом клике, на иконке в трее, выбираем пункт "Показать приложение" и оно снова появляется.
Если несмотря на мои пошаговые инструкции, у Вас ничего не выходит, шлите мне письмо с темой "MyTrayIcon", и я вышлю Всем желающим исходник (на Delphi 6).

Теперь по традиции несколько вопросов от наших читателей.

Подсажите, пожалуйста:
- Как можно сделать бегущую строку на форме базы данных?
- Как можно осуществить в базе данных гибкий поиск, т.е. без учета регистра и количества символов, по нескольким полям?
Ответить: Кирилл

Здравствуйте уважаемые эксперты.
Может у Вас есть описание INDY компонента idIRC или исходник IRC клиента с использованием этого компонента?
Ответить: SOURCE

Как сделать так, чтобы можно было проиграть 2 файла (с разными расширениями: mp3, wav, ogg, wma) одновременно.
Я пробовал использовать библиотеку bass.dll, тем не менее ничего доброго из этого не вышло.
Ответить: Jrek

У меня вопросик как mdi приложения навигацию между окнами сделать нападобив Opera AvantBrowseк (чтоб на toolabre висел спиоск окон и каждой кнопкее соответсвовало одно окно)?
Ответить: Лелик


Если Вы знаете ответы на какие-то из этих вопросов, не пожалейте времени написать автору вопроса. А если Ваш ответ может претендовать на полноту, то и мне. А я эти ответы опубликую в следующих номерах. И наша рассылка будет востребованной. Сегодня поможете Вы, завтра Вам.
Взаимовыручка - понимаешь ли ...


Желаю Всем удачи.
Оставайтесь с нами.
/Tisa


Написать письмо.
Посмотреть архив рассылки.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.programondelphi
Отписаться

В избранное