tutorials.hu

Kezdőlap Blogok Fórum Kapcsolat

Belépés

E-mail cím:

Jelszó:



Regisztráció
Elfelejtett jelszó

Új tutorial feltöltése ebbe a ketegóriába!

Tutorial feltöltése ebbe a kategóriába

Delphi tutorial


TrayIcon tálcára

Beküdte: softman | 2008-12-29 14:12:23 | hozzászólások (0)
Megtekintve 124476 alkalommal
Értékelés: | értékelje ezt a tutorialt

Ez a kis tutorial bemutatja, hogyan lehet Delphi alatt egy alkalmazást tálcára ikonnal elhelyezni. Erre sokszor lehet szükség olyan alkalmazások készítésekor, melyek esetén a program az ablak bezárása után tovább kell fusson, és a tálcáról ismét előhívható legyen.

Erre vannak kész komponensek is, de most a komponens használata nélküli módszerek egyikét ismertetem!

A programunk main formjában kell elhelyezni a megfelelő kódokat.

Lesz egy kódunk, ami létrehozza a tálcára az ikont, majd minimailzálja az alkalmazást:
MinimizeToTray;

Lesz egy eljárás, ami eltávolítja az ikont a tálcáról, majd visszaállítja az ablakot eredeti nem minimalizált állapotára:
RestoreFromTray
Ezen kívűl felül kell definiálnunk a windows callback eljárást (wndproc), mely figyeli majd, hogy mikor kattintanak a tálcán az ikonra, és szükség esetén meghív egy helyi menüt, ezért el kell helyezni a formon egy popupmenu komponenst is:
WndProc

De nézzük magát a megoldást:

Definiálnunk kell az alábbi eljárásokat (privátként)

procedure CreateTrayIcon;
procedure MinimizeToTray;
procedure OnSHIde(sender: TObject);
procedure RestoreFromTray;

A public szekcióba definiáljuk a windows callback-ot
public
procedure WndProc(var Msg : TMessage); override;

Szükségünk lesz egy privátként definiált változóra:
IconData: TNotifyIconData;

Ne feledjük a uses listához hozáadni a shellapi definiciót!
A formCreate eseménynél el kell végeznünk néhány dolgot, hogy a program indulása után a tálcára kerüljön:

procedure TMain.FormCreate(Sender: TObject);
begin
WindowState := wsMinimized; //minimalizáljuk
CreateTrayIcon; //létrehozzuk a tálcára az ikont
Application.OnMinimize := OnSHide; //lásd később
MinimizeToTray; //minimalizáljuk
end;


Nézzük az eljárásokat:

procedure TMain.CreateTrayIcon;
begin
IconData.cbSize := sizeof(IconData);
IconData.Wnd := Handle; // Formunk handle-ja
IconData.uID := 100;
IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
IconData.uCallbackMessage := WM_USER + 1; // Callback azonosítója
IconData.hIcon := Application.Icon.Handle; // Saját alkalmazásunk ikonját használnuk a tálcán StrPCopy(IconData.szTip, Caption);
end;

procedure TMain.MinimizeToTray;
begin
Shell_NotifyIcon(NIM_ADD, @IconData); // Tálca ikon hozzáadása Hide; // Formunk elrejtése
ShowWindow(Application.Handle, SW_HIDE); // Az alkalmazás gombjának eltüntetése a tálcáról
end;
procedure TMain.OnSHIde(sender: TObject);
begin
MinimizeToTray; //ha az alkalmazás bezáródik, tálcára az ikont
end;

procedure TMain.RestoreFromTray;
begin
Shell_NotifyIcon(NIM_DELETE, @IconData); // Ikon törlése a tálcáról
ShowWindow(Application.Handle, SW_SHOW); // Alkalmazás gomb Megjelenítése a tálcán
WindowState := wsNormal;
Show; // Form megjelenítése
Application.BringToFront;
end;



Van még néhány teendőnk. Ha be akarja zárni valaki a programot,akkor helyette a tálcára kell kerüljön, ezért az OnClose esemény a következő:
procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
minimizeToTray;
end;


A WndProc ami figyeli a tálcán lévő ikon eseményeit, szükség esetén hívja a helyi menüt, melyet korábban elhelyeztünk a formon:


procedure TMain.WndProc(var Msg: TMessage);
var
p : TPoint;
begin
case Msg.Msg of
WM_USER + 1: // Az ikonunk
case Msg.lParam of
WM_RBUTTONDOWN: begin // Jobb klikk a tálca ikonon
GetCursorPos(p); // Kell az egérmutató poziciója
PopupMenu1.Popup(p.x, p.y); // Menü megjelenítése
end;
WM_LBUTTONDBLCLK: RestoreFromTray; // Dupla kattintás az ikonon
end;
end;
inherited; // folytatása az eredeti WndProc-nak

end;


Végül a menü eseményei:
Három eseményt rendelünk a helyi menühöz: Megjelenít, bezár, és Mégse
A mégse menühöz semmilyen kódot rendelünk, így kattintása esetén nem történik semmi.
A bezár, valóban bezárja az alkalmazást, a megjelenít pedig előcsalogatja a tálcáról a programunkat!

bezárás:
procedure TMain.Bezr1Click(Sender: TObject);
begin
if Application.MessageBox('Biztosan bezárja a programot?','Bezárás',1)=1 then
begin
RestoreFromTray;
Application.Terminate;
end;
end;

Megjelenítéshez:
procedure TMain.Megjelent1Click(Sender: TObject);
begin
RestoreFromTray;
end;


És készen is vagyunk.
SoftMan
Hozzászólások:



Szólj te is hozzá:
Beceneved:


Hozzászólásod:


Megjegyzés

A beküldött tutorialok taralmáért felelősséget az oldal szerkesztője nem vállal



Hirdetések


Photoshop, Flash, CSS, JavaScript, HTML, Delphi, C++, SQL, Egyéb segédletek gyűjteménye
Copyright © O-Soft Bt. Készítette, és az oldalt fenntartja O-Soft Bt.