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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2012, 09:09   #1
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию добавить в трей программу

Учусь добавлять программу в трей, без использования компонентов сторонних. в модули прописываю:
Код:
Winapi.ShellAPI
Далее необходимо написать процедуру
Код:
procedure TForm1.ActionIcon(n:Integer;Icon:TIcon);
Var Nim:TNotifyIconData;
begin
With Nim do // Заполняем структуру Nim….
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;
Но я не сторонник копипаста, по этому анализирую и сам набираю код, и получаю что дельфе не известно о TForm1.ActionIcon Помогите разобраться! что не так делаю?
kta87 вне форума Ответить с цитированием
Старый 22.03.2012, 09:16   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

этот метод был создан вручную.(в том числе и обьвление в классе)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.03.2012, 09:21   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Не показан код событийной процедуры обратного вызова. Информации недостаточно. Посмотри мой исходник, когда-то для себя делал. Благодарность в репу.
TrayApi.rar

По твоей процедуре: с каждым новым вызовом при разных n у тебя этих иконок расплодится. А кто чистить будет? Переменная иконки у тебя локальная ведь. Каждый раз ты работаешь уже с новой созданной копией. Тогда уже глобальной ее сделай. Поэтому и смысл сих строк теряется:
Код:
Case n OF // Действия выполняемые процедурой
1: Shell_NotifyIcon(Nim_Add,@Nim);
2: Shell_NotifyIcon(Nim_Delete,@Nim);
3: Shell_NotifyIcon(Nim_Modify,@Nim);
end;
Смотри исходник.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 22.03.2012, 09:30   #4
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

ваш сырец не компилируется (Delphi XE2), строка 63
Код:
cbSize := SizeOf(TNotifyIconData);
"Too many actual parameters" (Дословно: Слишком много фактических параметров!)
п.с. если закомментировать, то все компилируется и работает, то так ли работает как вы делали изночально... Прокомментируйте код
Код:
cbSize := SizeOf(TNotifyIconData);

Последний раз редактировалось kta87; 22.03.2012 в 09:34.
kta87 вне форума Ответить с цитированием
Старый 22.03.2012, 09:43   #5
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Делал еще в Delphi 7. Для новых так:
Код:
cbSize := System.SizeOf(TNotifyIconData);
Определяет размер структуры и записывает в ее поле cbSize.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 22.03.2012, 13:15   #6
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

все подправил... отличный пример... спасибо за исходники и + в репу!
kta87 вне форума Ответить с цитированием
Старый 22.03.2012, 14:22   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
я не сторонник копипаста, по этому анализирую и сам набираю код
Цитата:
ваш сырец не компилируется
Цитата:
все подправил... отличный пример... спасибо за исходники
*facepalm*
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 22.03.2012, 14:27   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Для новых так:
Код:
cbSize := System.SizeOf(TNotifyIconData);
Неправильно, надо так:

Код:
cbSize := TNotifyIconData.SizeOf;
Цитата:
По твоей процедуре: с каждым новым вызовом при разных n у тебя этих иконок расплодится. А кто чистить будет? Переменная иконки у тебя локальная ведь. Каждый раз ты работаешь уже с новой созданной копией. Тогда уже глобальной ее сделай. Поэтому и смысл сих строк теряется:
Код, конечно, не фонтан, но ты не прав. Читай мат-чать. Иконки идентифицируются по ID или GUID (в Vista+), а ID у него фиксирован. Поэтому не имеет значения, где там и как хранится переменная, раз она заполняется заново каждый раз, причём одним и тем же ID.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 22.03.2012, 15:45   #9
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

в представленном исходнике програму можно вытащить из трея кликом лкм по иконке. Можно ли как нить отключить эту возможность?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ShellApi;

const
WM_NOTIFYTRAYICON = WM_USER + 1;
  
type
  TForm1 = class(TForm)
    pm: TPopupMenu;
    Collapse1: TMenuItem;
    Close1: TMenuItem;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Close1Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Collapse1Click(Sender: TObject);
  private
    procedure WMTRAYICONNOTIFY(var Msg: TMessage); message WM_NOTIFYTRAYICON;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Tray: TNotifyIconData;
  TrayIcon: TIcon;
  AppClose:Boolean=False;

implementation

{$R *.dfm}

procedure CollapseUnwrapToTray;
begin
  Form1.Visible:=not Form1.Visible;
  if Form1.Visible=True then Application.BringToFront;
end;

procedure TForm1.WMTRAYICONNOTIFY(var Msg: TMessage);
var p:TPoint;
begin
  case Msg.LParam of
    WM_LBUTTONUP:CollapseUnwrapToTray;
    WM_RBUTTONUP:
    begin
      GetCursorPos(p);
      SetForegroundWindow(Form1.Handle);
      pm.Popup(P.X, P.Y);
    end;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  try
  with tray do
  begin
    cbSize := TNotifyIconData.SizeOf;
    Wnd := Form1.Handle;
    uID := 1;
  end;
  Shell_NotifyIcon(NIM_DELETE, Addr(tray));
  finally
  Application.Terminate;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TrayIcon := Application.Icon;
  with tray do
  begin
    cbSize := TNotifyIconData.SizeOf;
    Wnd := Form1.Handle;
    uID := 1;
    uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    uCallBackMessage := WM_NOTIFYTRAYICON;
    hIcon := TrayIcon.Handle;
    szTip := '3D Hunter';
  end;
  Shell_NotifyIcon(NIM_ADD, Addr(tray));
end;

procedure TForm1.Close1Click(Sender: TObject);
begin
  AppClose:=True;
  Form1.Close;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=AppClose;
  if AppClose=False then CollapseUnwrapToTray;
end;

procedure TForm1.Collapse1Click(Sender: TObject);
begin
  CollapseUnwrapToTray;
end;

end.
kta87 вне форума Ответить с цитированием
Старый 22.03.2012, 17:49   #10
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Код:
procedure TForm1.WMTRAYICONNOTIFY(var Msg: TMessage);
var p:TPoint;
begin
  case Msg.LParam of
    WM_LBUTTONUP:CollapseUnwrapToTray;//обработка щелчка левой кнопки мыши - пиши что тебе надо
    WM_RBUTTONUP:
    begin
      GetCursorPos(p);
      SetForegroundWindow(Form1.Handle);
      pm.Popup(P.X, P.Y);
    end;
  end;
end;
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить в программу сортировку Anton94.by Паскаль, Turbo Pascal, PascalABC.NET 2 16.03.2012 22:59
Как свернуть программу в трей? KING_t.r.b.e. Общие вопросы C/C++ 1 30.11.2010 18:06
КАК свернуть программу в трей в Delphi 10 quarty Общие вопросы Delphi 3 29.10.2010 00:10
Свернуть чужую программу в трей grafgrial Общие вопросы Delphi 6 18.06.2010 19:27
Как свернуть программу в трей !!! Football_lady Общие вопросы Delphi 1 06.02.2010 19:46