Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизШо за фигня с треем? Найти похожие ветки
← →
kirik (2006-09-11 12:40) [0]Есть трей. Есть TrayIcon. И есть два варианта после закрытия окна, которая этот икон туда пихает:
1. Икон остаётся - удаляется наведением мыша;
2. Икон уничтожается, но начинает тормозить трей для всех остальных значков, т. е. типа "icq incoming message" - и 1-2 секунды "висит" панель задач.
Как бороться?
← →
PSPF2003 © (2006-09-11 12:41) [1]
> пихает:
пихать ее туда руками без компонентов
← →
kirik (2006-09-11 12:43) [2]а он и не компонент, это я из delphiworld пример взял и создаю его динамически. если закрытие не из главной формы, не уничтожается, и если fault terminate - тоже!
← →
Сергей М. © (2006-09-11 12:45) [3]
> Как бороться?
Оч просто - не "пихать" этот икон, а "запуздыривать") ..см. "Орешник"
Более сложный вариант - отчетливо понимать, в какой момент, при каких условиях и с какими параметрами следует вызывать Shell_NotifyIcon()
← →
kirik (2006-09-11 12:46) [4]А в инете оч.много вариантов на эту тему.
Есть твой? Рабочий? 100%?
← →
031178 © (2006-09-11 12:48) [5]Могу исходники кинуть !!!
← →
kirik (2006-09-11 12:57) [6]Ага. Давай. madmin собака elprommash дот ру, жду.
← →
kirik (2006-09-11 13:05) [7]Исходники будут?
← →
031178 © (2006-09-11 13:08) [8]Да вроде послал уже, а что нормально адрес написать, не судьба !!
← →
PSPF2003 © (2006-09-11 13:12) [9]unit shellUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Menus;
const
WM_MYICONNOTIFY = WM_USER + 123;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
RestoreItem: TMenuItem;
N1: TMenuItem;
FileExitItem1: TMenuItem;
HideItem: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure RestoreItemClick(Sender: TObject);
procedure HideItemClick(Sender: TObject);
procedure FileExitItem1Click(Sender: TObject);
private
{ Private declarations }
ShownOnce: Boolean;
public
{ Public declarations }
procedure WMICON(var msg: TMessage); message WM_MYICONNOTIFY;
procedure WMSYSCOMMAND(var msg: TMessage);message WM_SYSCOMMAND;
procedure RestoreMainForm;
procedure HideMainForm;
procedure CreateTrayIcon(n:Integer);
procedure DeleteTrayIcon(n:Integer);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses ComObj, activex, ShellApi, shlobj, registry;
procedure TForm1.WMICON(var msg: TMessage);
var P : TPoint;
begin
case msg.LParam of
WM_LBUTTONDOWN:
begin
GetCursorPos(p);
SetForegroundWindow(Application.MainForm.Handle);
PopupMenu1.Popup(P.X, P.Y);
end;
WM_LBUTTONDBLCLK : RestoreItemClick(Self);
end;
end;
procedure TForm1.WMSYSCOMMAND(var msg: TMessage);
begin
inherited;
if (Msg.wParam=SC_MINIMIZE) then HideItemClick(Self);
end;
procedure TForm1.HideMainForm;
begin
Application.ShowMainForm := False;
ShowWindow(Application.Handle, SW_HIDE);
ShowWindow(Application.MainForm.Handle, SW_HIDE);
end;
procedure TForm1.RestoreMainForm;
var i,j : Integer;
begin
Application.ShowMainForm := True;
ShowWindow(Application.Handle, SW_RESTORE);
ShowWindow(Application.MainForm.Handle, SW_RESTORE);
if not ShownOnce then
begin
for I := 0 to Application.MainForm.ComponentCount -1 do
if Application.MainForm.Components[I] is TWinControl then
with Application.MainForm.Components[I] as TWinControl do
if Visible then
begin
ShowWindow(Handle, SW_SHOWDEFAULT);
for J := 0 to ComponentCount -1 do
if Components[J] is TWinControl then
ShowWindow((Components[J] as TWinControl).Handle, SW_SHOWDEFAULT);
end;
ShownOnce := True;
end;
end;
procedure TForm1.CreateTrayIcon(n:Integer);
var nidata : TNotifyIconData;
begin
with nidata do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Self.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_MYICONNOTIFY;
hIcon := Application.Icon.Handle;
StrPCopy(szTip,Application.Title);
end;
Shell_NotifyIcon(NIM_ADD, @nidata);
end;
procedure TForm1.DeleteTrayIcon(n:Integer);
var nidata : TNotifyIconData;
begin
with nidata do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Self.Handle;
uID := 1;
end;
Shell_NotifyIcon(NIM_DELETE, @nidata);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ShownOnce:= False;
CreateTrayIcon(1);
HideItem.Enabled := False;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteTrayIcon(1);
end;
procedure TForm1.RestoreItemClick(Sender: TObject);
begin
RestoreMainForm;
DeleteTrayIcon(1);
RestoreItem.Enabled := False;
HideItem.Enabled := True;
end;
procedure TForm1.HideItemClick(Sender: TObject);
begin
HideMainForm;
CreateTrayIcon(1);
HideItem.Enabled := False;
RestoreItem.Enabled := True;
end;
procedure TForm1.FileExitItem1Click(Sender: TObject);
begin
Close;
end;
end.
← →
Пусик © (2006-09-11 13:13) [10]
> kirik (11.09.06 13:05) [7]
> Исходники будут?
А надо?unit ufIconTray;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Menus,
ShellApi;
var
WM_MyNotifyIcon: Cardinal;
type
TfIconTray = class(TForm)
//PopUp-меню, всплывающее при щелчке правой кнопкой мышши на иконке
pmIconTray: TPopupMenu;
//Пункты меню
pmIconTrayRestore: TMenuItem; //Восстановление приложения
pmIconTrayExit: TMenuItem; //Завершение программы
pmIconTrayNoAction: TMenuItem; //Фиктивный пункт меню
procedure FormCreate(Sender: TObject);
procedure IconTray(aAction: Cardinal); //Процедура для манипуляций с иконкоё в SysTray
procedure pmIconTrayRestoreClick(Sender: TObject);
procedure pmIconTrayExitClick(Sender: TObject);
procedure MyWndProc(var Message: TMessage); //процедура, перекрывающая
//стандартную оконную процедуру
end;
var
fIconTray: TfIconTray;
implementation
{$R *.dfm}
procedure TfIconTray.FormCreate(Sender: TObject);
var
UniqueStr: String;
begin
Application.Title := Self.Caption;
UniqueStr := Application.Title+IntToStr(Application.Handle);
//Получаем уникальный номер Windows-сообщения.
WM_MyNotifyIcon := RegisterWindowMessage(PChar(UniqueStr));
//Заменяем обработчик стандартный обработчик сообщений на наш
WindowProc := MyWndProc;
end;
procedure TfIconTray.MyWndProc(var Message: TMessage);
var
P: TPoint;
begin
//Обработка сообщения от иконки в SysTray
if Message.Msg = WM_MyNotifyIcon then
begin
case Message.LParam of
WM_LBUTTONDBLCLK :
begin
//Восстанавливаем приложение
ShowWindow(Application.Handle,SW_RESTORE);
//Восстанавливаем основную форму
ShowWindow(Application.MainForm.Handle,SW_RESTORE);
//Приложение - на передний план
SetForegroundWindow(Application.MainForm.Handle);
//Удаляем иконку
IconTray(NIM_DELETE);
end;
//Клик на правой кнопке мыши
WM_RBUTTONUP:
begin
//Считываем позицию курсора на экране
GetCursorPos(P);
//Показываем меню в позиции курсора
SetForegroundWindow(Application.MainForm.Handle);
pmIconTray.Popup(P.X, P.Y);
end;
end;
//Заканчиваем обработку
Message.Result := 0;
Exit;
end;
//Обработка нажатия на кнопку свернуть в заголовке окна
if (Message.Msg=WM_SYSCOMMAND) and
((Message.wParam and $FFF0) = SC_MINIMIZE) then
begin
//Добавляем иконку
IconTray(NIM_ADD);
//Скрываем основную форму
ShowWindow(Application.MainForm.Handle,SW_HIDE);
//Скрываем приложение
ShowWindow(Application.Handle,SW_HIDE);
//Заканчиваем обработку
Message.Result := 0;
Exit;
end;
//Не наше сообщение - вызываем стандартную процедуру окна
WndProc(Message);
end;
//Процедура для манипуляций с иконкой
procedure TfIconTray.IconTray(aAction: Cardinal);
var
nid: TNotifyIconData;
begin
//Заполнение структуры
nid.cbSize := SizeOf(TNotifyIconData); //Размер структуры
nid.Wnd := Self.Handle; //Окно назначения
nid.uID := 0; //Назначаем идентификатор иконке
nid.uCallBackMessage := WM_MyNotifyIcon; //Процедура для обработки сообщений
nid.hIcon := Application.Icon.Handle; //Это основная иконка приложения
StrPCopy(nid.szTip,Application.Title); //Всплывающая подсказка (Hint)
//Признаки:
// NIF_ICON - используется поле nid.hIcon
// NIF_MESSAGE - используется сообщение с номером nid.uCallBackMessage для обработки
// NIF_TIP - для иконки назначен Hint - всплывающая подсказка.
nid.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
case aAction of
NIM_ADD: Shell_NotifyIcon(NIM_ADD, @nid); //Добавление иконки
NIM_DELETE: Shell_NotifyIcon(NIM_DELETE, @nid); //Удаление иконки
NIM_MODIFY: Shell_NotifyIcon(NIM_MODIFY, @nid); //Модификация иконки
end;
end;
//Обработка при выборе пункта меню "Восстановить"
procedure TfIconTray.pmIconTrayRestoreClick(Sender: TObject);
begin
//Посылаем нашему окну сообщение WM_LBUTTONDBLCLK
PostMessage(Application.MainForm.Handle,WM_MyNotifyIcon,0,WM_LBUTTONDBLCLK);
end;
//Обработка при выборе пункта меню "Выход из программы"
procedure TfIconTray.pmIconTrayExitClick(Sender: TObject);
begin
//Посылаем нашему окну сообщение WM_LBUTTONDBLCLK
PostMessage(Application.MainForm.Handle,WM_MyNotifyIcon,0,WM_LBUTTONDBLCLK);
//Закрываем приложение
Application.MainForm.CLose;
end;
end.
← →
kirik (2006-09-11 16:39) [11]Всё равно не терминается как надо
← →
Пусик © (2006-09-11 20:09) [12]
> Всё равно не терминается как надо
Значит судьба у тебя такая.
А если точнее, ошибка в строке 17.
← →
C@N © (2006-09-12 09:41) [13]Юзай RX...))) и проблем не будет ))))
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.022 c