Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1158250956
ph0sgen
2006-09-14 20:22
2006.10.01
перевести тип с С++ на Delphi


2-1157374144
parovoZZ
2006-09-04 16:49
2006.10.01
Когда много панелей


15-1157810484
Furyz
2006-09-09 18:01
2006.10.01
MySQL+Delphi


15-1157842793
Дед Маздай
2006-09-10 02:59
2006.10.01
Опера


15-1157720133
Dbn
2006-09-08 16:55
2006.10.01
Куда идет человечество?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский