Главная страница
    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.015 c
14-1124905300
Веретенников
2005-08-24 21:41
2005.09.18
Выбор ТВ-тюнера


14-1124613753
Е-клмн
2005-08-21 12:42
2005.09.18
Какой правитель лучше: тот, которого боятся или тот, над которым


6-1117220597
acsoft
2005-05-27 23:03
2005.09.18
Помогите переделать


3-1123139791
Ирина
2005-08-04 11:16
2005.09.18
Запрос по полю


9-1116673417
Кирилл
2005-05-21 15:03
2005.09.18
Direct Sound





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский