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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2010, 14:00   #1
Aleks_www
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 39
По умолчанию RxTrayIcon

Подскажите по компоненту RxTrayIcon из библиотеки RxLib.

Есть форма. На ней RxTrayIcon. В событии формы FormCloseQuery прописано:

Form1.Hide;
CanClose := False;

Тоесть при нажатии на крестик, приложение не закрывается а сворачивается в трей. Потом по щелчку на иконку в трее приложение восстанавливается. Но если снова нажать на крестик никаких событий не происходит. Также после закрытия приложения полностью, в трее остается иконка до тех пор пока на нее не навести курсор, после чего она исчезает. Кк можно решить эти проблемы?
Aleks_www вне форума Ответить с цитированием
Старый 26.08.2010, 17:05   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Вот схема, которая работает.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RXShell, StdCtrls;

type
  TForm1 = class(TForm)
    Tray1: TRxTrayIcon;
    Button1: TButton;
    procedure Tray1Click(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);  //OnClick TRxTrayIcon в Object Inspector
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button1Click(Sender: TObject);
  private
    FullClose : Boolean;
    procedure ApplicationRestore(Sender : TObject);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Tray1Click(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then begin
    Application.Restore;
    Application.BringToFront;
    Show;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnRestore := ApplicationRestore;
end;

procedure TForm1.ApplicationRestore(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_RESTORE);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if FullClose then CanClose := True
  else begin
    CanClose := False;
    ShowWindow(Application.Handle, SW_HIDE);
    Hide;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject); //закрыть приложение
begin
  FullClose := True;
  Close;
end;

end.
Скандербег вне форума Ответить с цитированием
Старый 27.08.2010, 07:01   #3
Aleks_www
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 39
По умолчанию

Большое спасибо. Все работает.

Я так понял чтобы форма после восстановления из трея получила снова свою полную функциональность в событии FormCreate добавлена процедура ApplicationRestore?
Aleks_www вне форума Ответить с цитированием
Старый 27.08.2010, 07:25   #4
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Не совсем. Легко можно обойтись и без ApplicationRestore.
Например.
Код:
type
  TForm1 = class(TForm)
    Tray1: TRxTrayIcon;
    Button1: TButton;
    procedure Tray1Click(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button1Click(Sender: TObject);
  private
    FullClose : Boolean;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Tray1Click(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then begin
    Application.BringToFront;
    Show;
  end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if FullClose then CanClose := True
  else begin
    CanClose := False;
    Hide;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FullClose := True;
  Close;
end;

end.
В коде убрано все лишнее без чего RxTrayIcon и так прекрасно работает.
Скандербег вне форума Ответить с цитированием
Старый 27.08.2010, 08:22   #5
Aleks_www
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 39
По умолчанию

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

Последний раз редактировалось Aleks_www; 27.08.2010 в 08:29.
Aleks_www вне форума Ответить с цитированием
Старый 27.08.2010, 08:53   #6
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Цитата:
Никак правда не могу для него найти полноценного описания.
Все что есть из справки:
"Компонента TRxTrayIcon предназначена для отображения иконки, заданной свойством Icon, в системной области (tray) панели задач (TaskBar) Windows95 или Windows NT 4.0 и старше. Иконка может быть статической (задается свойством Icon) либо анимированной (при задании значения свойству Icons и установке свойства Animated в значение True) - в этом случае частота смены изображения иконки задается свойством Interval.

Вы можете показывать и скрывать иконку, изменяя значение свойства Active. Свойство Hint задает текстовую строку, которая появляется над иконкой, когда вы останавливаете над ней мышь. Для тестирования компоненты в режиме дизайна Вы можете отобразить иконку в системной области панели задач, установив свойство ShowDesign в True.
Вы можете задать значение свойства PopupMenu - заданное вами меню (при значении его свойства AutoPopup = True) будет появляться при нажатии правой кнопки мыши на иконке в системной области. Если это меню имеет пункт "по-умолчанию" (со значением свойства Default = True, только в 32-битной версии), то при двойном нажатии левой кнопки мыши будет вызван метод Click этого пункта меню. Вы можете также самостоятельно обработать события от мыши за счет использования обработчиков событий OnClick, OnDblClick и др., если не были вызваны обработчики по-умолчанию.
"
Цитата:
Еще умел бы он проверять открыто ли приложение чтобы не допускать повторного запуска .
Это не его задача.
Скандербег вне форума Ответить с цитированием
Старый 27.08.2010, 09:16   #7
Aleks_www
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 39
По умолчанию

Цитата:
Сообщение от Скандербег Посмотреть сообщение

Это не его задача.

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

Последний раз редактировалось Aleks_www; 27.08.2010 в 09:40.
Aleks_www вне форума Ответить с цитированием
Старый 27.08.2010, 09:59   #8
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

Проверку так сделать мона:
в oncreate формы
Код:
if waitforsingleobject(g,0)<>0 then
exitprocess(0);
g здесь глобальная переменная типа thandle

теперь после последнего end; пишем так
Код:
initialization
g:=createmutex(nil,true,pchar(extractfilename(application.exename)));
finalization
closehandle(g);
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 27.08.2010, 11:58   #9
Aleks_www
Пользователь
 
Регистрация: 26.08.2010
Сообщений: 39
По умолчанию

Цитата:
Сообщение от ZvEr_HaCkEr Посмотреть сообщение
Проверку так сделать мона:
в oncreate формы
Код:
if waitforsingleobject(g,0)<>0 then
exitprocess(0);
g здесь глобальная переменная типа thandle

теперь после последнего end; пишем так
Код:
initialization
g:=createmutex(nil,true,pchar(extractfilename(application.exename)));
finalization
closehandle(g);
Хорошо знать как пользоваться WinApi. Прицепил код к своему приложению, работает. Спасибо. Повторный запуск приложения блокируется, правда иконки в трее плодятся. Пробовал нажать раз десять, столько же иконок и появилось. Когда мышкой по ним пройтись исчезают и остается только одна - приложения которое было запущено первым. Кстати я такое часто видел и у довольно известных программ. Наверно надо еще проверять наличие иконки в трее.

Последний раз редактировалось Aleks_www; 27.08.2010 в 12:09.
Aleks_www вне форума Ответить с цитированием
Старый 27.08.2010, 13:02   #10
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

Не знаю и меня не плодятсяно я cooltrayicon юзаю
ZvEr_HaCkEr вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск