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