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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2016, 21:54   #1
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию Иконка в трее

Как вывести иконку в трее для программы без окна (демона)?

Код:
program Project1;

{$R *.dres}

uses
  SysUtils,
  TrayIcon;

var
  TrayIcon1: TTrayIcon;
begin
  TrayIcon1 := TTrayIcon.Create(nil);
  TrayIcon1.Visible := True;

  while True do
    Sleep(1000);
end.
Ошибка: [DCC Error] Project1.dpr(13): E2003 Undeclared identifier: 'Visible'

Delphi 2006 и 2010

Последний раз редактировалось CraZZZy-GameRRR; 25.05.2016 в 22:04.
CraZZZy-GameRRR вне форума Ответить с цитированием
Старый 25.05.2016, 22:13   #2
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Код:
program Project1;

uses
  SysUtils, ExtCtrls;

{$R *.res}

var
  TrayIcon: TTrayIcon;

begin
  TrayIcon:=TTrayIcon.Create(nil);
  TrayIcon.Visible:=True;

  Sleep(5000);

  TrayIcon.Visible:=False;
  TrayIcon.Free;
end.
Delphi 2010.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 29.05.2016, 10:51   #3
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,987
По умолчанию

Код:
uses ShellAPI;

type
  TDUMMYUNIONNAME = record
  case Integer of
    0: (uTimeout:UINT);
    1: (uVersion:UINT);
  end;
  TNewNotifyIconData = record
    cbSize:DWORD;
    Wnd:HWND;
    uID:UINT;
    uFlags:UINT;
    uCallbackMessage:UINT;
    hIcon:HICON;
    szTip:array[0..127] of Char;
    //Version 5.0 is 128 chars, old ver is 64 chars
    dwState:DWORD;
    dwStateMask:DWORD;
    szInfo:array[0..255] of Char;
    DUMMYUNIONNAME:TDUMMYUNIONNAME;
    szInfoTitle:array[0..63] of Char;
    dwInfoFlags:DWORD;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var nidata:TNewNotifyIconData;
begin
   With nidata do
   begin
      cbSize:=SizeOf(nidata);
      Wnd:=Form1.Handle;
      uID:=5;
      uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
      uCallBackMessage:=WM_USER;
      hIcon:=Application.Icon.Handle;
      StrPCopy(szTip,'My programm');
   end;
   Shell_NotifyIcon(NIM_ADD,@nidata);
   Sleep(1000);
   With nidata do
   begin
      cbSize:=SizeOf(nidata);
      Wnd:=Form1.Handle;
      uID:=5;
      uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP or $10;
      uCallBackMessage:=WM_USER;
      StrPCopy(szInfo,'Щелкните здесь для подробности');
      StrPCopy(szInfoTitle,'My programm - sms');
      { dwInfoFlags:       }
      { 0: нет иконки       }
      { 1: информация       }
      { 2: внимание         }
      { 3: ошибка           }
      { 4: значок программы }
      dwInfoFlags:=2;
   end;
   Shell_NotifyIcon(NIM_MODIFY,@nidata);
   Sleep(3000);
   With nidata do
   begin
      cbSize:=SizeOf(nidata);
      Wnd:=Form1.Handle;
      uID:=5;
   end;
   Shell_NotifyIcon(NIM_DELETE,@nidata);
end;
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 29.05.2016, 12:26   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Не сойдёт.
1. По условию задачи приложение безоконное.
2. Если юзается VCL, то нет смысла городить твой винапишный код - велика вероятность косяков настрогать.

Согласен?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.05.2016, 16:43   #5
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Сойдет )

Нет смысла от иконки, если она тупо будет висеть в трее без возможности взаимодействия пользователя с ней. А значит необходим обработчик сообщений от нее. Посылать сообщения проще всего окну, а раз юзается VCL да еще и Delphi, то всегда можно сымитировать окно через AllocateHWnd() и передать полученный хэндл в структуру TNewNotifyIconData. По завершении приложения прибить через deAllocateHWnd().

А что касаемо готовой обертки, конечно удобно использовать готовый класс, в котором как раз и идет описанный финт ушами через AllocateHWnd(). Т.е. окно как в посту #2, так и #3 создается.
kutani вне форума Ответить с цитированием
Старый 29.05.2016, 16:54   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

да ладно, если уж VCL, то uses Forms достаточно, чтобы вообще не юзать винапи напрямую: объект Application рулить будет. Это сильно упростит и ускорит отладку проги, сократит исходник... Однако, увеличит размер ехе на 1-1,5 МБ (да и пофиг).
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Иконка в трее саша40 Общие вопросы Delphi 10 24.10.2012 14:49
Иконка в системном трее (там, где часики) Македонский Win Api 6 22.12.2008 18:03
Иконка оперы в трее... Altera Софт 10 15.10.2008 08:32
Иконка в трее* Krow Win Api 5 20.07.2008 02:41
Иконка в трее Mangust Win Api 2 10.07.2008 13:43