Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2009, 20:19   #1
Baaandit
Заблокирован
 
Регистрация: 10.11.2009
Сообщений: 99
По умолчанию Сворачивание программы в трей

Нашел такой код на сайте, но не могу разобраться и применить, подскажите. Надо что бы программа сворачивалась при нажатие на кнопку.

Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ShellApi, StdCtrls ;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure ActionIcon(n:Integer;Icon:TIcon);
    procedure FormCreate(Sender: TObject);
    Procedure OnMinimizeProc(Sender:TObject);
    Procedure MouseClick(var Msg:TMessage); message WM_USER+1;
    procedure Button1Click(Sender: TObject);
      private
    { Private declarations }
  public

  protected

  Procedure WindowMessage(Var Msg:TMessage); message WM_SYSCOMMAND;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ActionIcon(n:Integer;Icon:TIcon);
Var Nim:TNotifyIconData;
begin
With Nim do // 
Begin
cbSize:=SizeOf(Nim); //
Wnd:=Form1.Handle; // 
uID:=1;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
hicon:=Icon.Handle; //
uCallbackMessage:=wm_user+1;
szTip:='Ñîîáùåíèå ïîÿâëÿþùååñÿ ïðè íàâåäåíèè';
End;
Case n OF //
1: Shell_NotifyIcon(Nim_Add,@Nim);
2: Shell_NotifyIcon(Nim_Delete,@Nim);
3: Shell_NotifyIcon(Nim_Modify,@Nim);
End;
end;

Procedure TForm1.WindowMessage (Var Msg:TMessage);
Begin
IF Msg.WParam=SC_MINIMIZE then Begin
ActionIcon (1,Application.Icon); // 
ShowWindow(Handle,SW_HIDE); // 
ShowWindow(Application.Handle,SW_HIDE); // 

End else inherited;

End;

Procedure TForm1.OnMinimizeProc(Sender:TObject);
Begin
PostMessage(Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
End;


procedure TForm1.FormCreate(Sender: TObject);
begin
Application.onMinimize:=OnMinimizeProc;
end;

procedure TForm1.MouseClick(var Msg:TMessage);
Var p:tpoint;
begin
GetCursorPos(p); // 
Case Msg.LParam OF // 
WM_LBUTTONUP,WM_LBUTTONDBLCLK: 
Begin 
ActionIcon (2,Application.Icon); // 
ShowWindow(Application.Handle,SW_SHOW); //
ShowWindow(Handle,SW_SHOW); //
End;
End;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
form1.ActionIcon(1,);
end;

Последний раз редактировалось Stilet; 20.11.2009 в 09:41.
Baaandit вне форума Ответить с цитированием
Старый 19.11.2009, 20:31   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Если у окна есть стиль WS_MINIMIZEBOX, тогда можно
Код:
PostMessage(Handle, WM_SYSCOMMAND, SC _MINIMIZE, 0);
BOBAH13 вне форума Ответить с цитированием
Старый 19.11.2009, 20:34   #3
Baaandit
Заблокирован
 
Регистрация: 10.11.2009
Сообщений: 99
По умолчанию

Мне хотелось бы понять этот код, в нем еще есть возможность при нажатие на иконку в трее-развертывание программы в первоначальный вид. Не понимаю как применить эти процедуры.
Baaandit вне форума Ответить с цитированием
Старый 19.11.2009, 20:51   #4
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

быть может не совсем правильно понял, что требуется автору... есть иконка в трее, нужно, чтоб форма "сворачивалась в трей" при клике на неё и разворачивалась обратно?
Если так, то просто на OnClick или OnDubleClick событие вешаете примерно такой код:
Код:
procedure TVKmain.TrayIconLButtonDblClick(Sender: TObject);
begin
  if IsWindowVisible(FindWindow('TVKmain', PChar(VKform.Caption))) then begin
	    Application.Minimize;
      ShowWindow( Application.Handle, sw_Hide );
  end else begin
      ShowWindow( Application.Handle, sw_Restore );
      SetForegroundWindow( Application.Handle );
  end;
end;
помеченое красным - заменить на название своего класса и своей формы соответственно...

PS: если честно в коде не разбирался, но не совсем понял, зачем мудрить с мессагами для такой простой задачи... поправьте, если не прав...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 19.11.2009 в 20:54.
Johnson вне форума Ответить с цитированием
Старый 19.11.2009, 20:52   #5
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Да просто используйте TTrayIcon и никаких проблем у Вас не возникнет.
FaTaL вне форума Ответить с цитированием
Старый 19.11.2009, 20:56   #6
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

или TRzTrayIcon из комплекта Raise Component Pack - он немного "продвинутее", но смысл тот же...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 19.11.2009, 21:04   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Да давайте для двух строк кода, понатыкаем компонент жесть...

все просто, как сворачивать написано, а как ввостановить, так это, ShowWindow(WindowHandle, SW_RESTORE); да и все, остальное за вас Windows сделает
BOBAH13 вне форума Ответить с цитированием
Старый 19.11.2009, 21:22   #8
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Компонента входит в базовый комплект RAD Studio 2010
FaTaL вне форума Ответить с цитированием
Старый 19.11.2009, 21:26   #9
Baaandit
Заблокирован
 
Регистрация: 10.11.2009
Сообщений: 99
По умолчанию

Код:
procedure TVKmain.TrayIconLButtonDblClick(Sender: TObject);
begin
  if IsWindowVisible(FindWindow('TVKmain', PChar(VKform.Caption))) then begin
	    Application.Minimize;
      ShowWindow( Application.Handle, sw_Hide );
  end else begin
      ShowWindow( Application.Handle, sw_Restore );
      SetForegroundWindow( Application.Handle );
  end;
end;
Спасибо за код. Но он скрывает программу в диспетчер задач в процессы. А мне надо что программа скрывалась в 'значки где часы'.Наверно надо использовать процедуру TForm1. WindowMessage (Var Msg:TMessage);.Только какой параметр в ней указать.

Последний раз редактировалось Stilet; 20.11.2009 в 09:41.
Baaandit вне форума Ответить с цитированием
Старый 19.11.2009, 21:57   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Но он скрывает программу в диспетчер задач в процессы. А мне надо что программа скрывалась в 'значки где часы'.Наверно надо использовать процедуру TForm1. WindowMessage (Var Msg:TMessage);.Только какой параметр в ней указать.
ну у вас-же все есть, посмотрите свой 1-пост, вам надо к процедуре скрытия (свертывания) всего-лишь добавить иконку в трей через- ActionIcon(n:Integer;Icon:TIcon)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сворачивание в трей Sanek777 Общие вопросы Delphi 5 24.08.2011 14:20
Сворачивание в трей не выходит KiDoki Общие вопросы Delphi 6 26.01.2009 08:23
Сворачивание в трей при закрытии формы xxxsas Общие вопросы C/C++ 0 22.01.2009 08:11
[ищу мануал] Сворачивание в трей и показз сообщений из него. lazutov Общие вопросы Delphi 8 21.04.2008 00:02