Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.012 c
14-1125045509
Ega23
2005-08-26 12:38
2005.09.18
Воистину мудро


2-1123675740
Arkady
2005-08-10 16:09
2005.09.18
DBGrid


14-1124721982
ПЛОВ
2005-08-22 18:46
2005.09.18
Поможите, никак не могу разобраться с типами переменных


14-1124546455
desam
2005-08-20 18:00
2005.09.18
Драйвера


1-1125008888
Dot
2005-08-26 02:28
2005.09.18
ExtractFileName ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский