Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

TaskBar   Найти похожие ветки 

 
Quattro ©   (2005-07-28 01:39) [0]

Добрый день!...подскажите,пожалуйста, где у меня ошибка??...по нажатию кнопки надобно чтоб по нажатию одной кнопки кирпичик либо скрывался,либо появлялся в панели задач....скрываться то он скрываеться,но не появляется...ниже приведён код...
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 TSystemTrayIcon = class(TComponent)
 private
   FDefaultIcon:THandle;
   FIcon:TIcon;
   FPlaced:Boolean;
   FHideTask:Boolean;
   FHint:String;
   FIconVisible:Boolean;
   FTimer:TTimer;
   NID:TNotifyIconData;
   procedure SendTrayMessage(Msg:DWORD;Flags:UINT);
   procedure SetIconVisible(Value:Boolean);
   procedure LoadDefaultIcon;
   procedure SetHideTask(Value:Boolean);
   function ActiveIconHandle:THandle;
 public
   Constructor Create(AOwner:TComponent);override;
   Destructor Destroy;override;
   property IconVisible : Boolean read FIconVisible write SetIconVisible;
   property HideTask : Boolean read FHideTask write SetHideTask default False;
 end;

 TIconManager = class
 private
   FHWindow:HWnd;
   procedure TrayMsg(var Message:TMessage);
 public
   Constructor Create;
   Destructor Destroy;override;
   property HWindow:HWnd read FHWindow write FHWindow;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

var
 IconManager:TIconManager;
 DDGM_TRAYICON:Cardinal;

{ TSystemTrayIcon }

function TSystemTrayIcon.ActiveIconHandle: THandle;
begin
 Result:=FDefaultIcon;
end;

constructor TSystemTrayIcon.Create(AOwner:TComponent);
begin
 inherited Create(AOwner);
 FIcon:=TIcon.Create;
 FTimer:=TTimer.Create(Self);
 with FTimer do begin
   Enabled:=False;
   Interval:=GetDoubleClickTime;
 end;
 LoadDefaultIcon;
end;

destructor TSystemTrayIcon.Destroy;
begin
 if FIconVisible then SetIconVisible(False);
 FIcon.Free;
 FTimer.Free;
 inherited Destroy;
end;

procedure TSystemTrayIcon.LoadDefaultIcon;
begin
FDefaultIcon:=LoadIcon(0,IDI_WINLOGO);
end;

procedure TSystemTrayIcon.SendTrayMessage(Msg: DWORD; Flags: UINT);
begin
 with NID do begin
   cbSize:= SizeOf(NID);
   uFlags:=Flags;
   uID:=uID;
   Wnd:=IconManager.HWindow;
   uCallBackMessage:=DDGM_TRAYICON;
   hIcon:=ActiveIconHandle;
   StrPLCopy(szTip,PChar(FHint),SizeOf(szTip));
 end;
 Shell_NotifyIcon(NIM_ADD,@NID);
end;

procedure TSystemTrayIcon.SetHideTask(Value: Boolean);
const
 ShowArray: array[Boolean] of integer = (sw_ShowNormal,sw_Hide);
begin
 if FHideTask <> Value then
   FHideTask:=Value;
 if not (csDesigning in ComponentState) then
   ShowWindow(Application.Handle,ShowArray[FHideTask]);
end;

procedure TSystemTrayIcon.SetIconVisible(Value: Boolean);
const
 MsgArray: array[Boolean] of DWORD = (NIM_DELETE,NIM_ADD);
begin
if (FIconVisible <> Value) then
 begin
   FIconVisible:=Value;
   SendTrayMessage(MsgArray[Value],NIF_MESSAGE or NIF_ICON or NIF_TIP);
 end;
end;

{ TIconManager }

constructor TIconManager.Create;
begin
FHWindow:=AllocateHWnd(TrayMsg);
end;

destructor TIconManager.Destroy;
begin
if FHWindow <> 0 then DeallocateHwnd(FHWindow);
 inherited;
end;

procedure TIconManager.TrayMsg(var Message: TMessage);
var
 TheIcon:TSystemTrayIcon;
begin
 with Message do begin
   if (Msg = DDGM_TRAYICON) then
     TheIcon:=TSystemTrayIcon(wParam)
   else
     Result:=DefWindowProc(FHWindow,Msg,wParam,lParam);
   end;  
end;

const
 TrayMsgStr ="DDG.TrayNotifyIconMsg";

procedure TForm1.Button1Click(Sender: TObject);
var
ST:TSystemTrayIcon;
begin
ST:=TSystemTrayIcon.Create(nil);
if ST.HideTask then
  ST.SetHideTask(False)
else
  ST.SetHideTask(True);

end;

initialization
 DDGM_TRAYICON:=RegisterWindowMessage(TrayMsgStr);
 IconManager:=TIconManager.Create;
finalization
 IconManager.Free;
end.

это всё в стадии разработки:)..но уже почему то не работает:)...если сделать две кнопки-одна прячет кирпичик, вторая - показывает..тогда всё работает....а если сделать одну и действовать в зависимости от знавения HideTask-тогда не получается...подскажите,плиз, в чём проблема....не вижу ошибки-хоть убей....


 
alex-drob ©   (2005-07-28 01:57) [1]

Скорей всего ST.HideTask всегда становиться равно false при нажатии на кнопку.
Т.к. каждый раз выполняется ST:=TSystemTrayIcon.Create(nil);
Попробуй в formcreate запихнуть эту строку.


 
Quattro ©   (2005-07-28 02:30) [2]

=>alex-drob ©
 Вай вай вай!!!....спасибо тебе!!..как это я не углядел!!..и точно ведь!!!....земной поклон!!!..=)



Страницы: 1 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.023 c
14-1124650406
VictorT
2005-08-21 22:53
2005.09.18
Просьба.


14-1124261289
Lexer
2005-08-17 10:48
2005.09.18
Посоветуйте стиральную машину


14-1124660488
desam
2005-08-22 01:41
2005.09.18
Модем


2-1123936347
RomanBishkek
2005-08-13 16:32
2005.09.18
Как можно обновить одну запись через Query


1-1124887085
Sidex
2005-08-24 16:38
2005.09.18
Как интегрировать программу с оболочкой Windows?