Recimo da želimo da napravimo malu aplikaciju kao što je časovnik ili hardverski monitor, koji će zauzimati malo mesta na ekranu. Kreiraćemo malu formu i to takvu da nema naslovne linije, da korisnici ne bi mogli da povećavaju/smanjuju veličinu forme, ali da ipak mogu da premeštaju formu. Na primer, program „Sat“ koji dolazi uz Windows ne poseduje naslovnu liniju, ali forma programa može biti prevučena na drugo mesto. Kako ovaj efekat reprodukovati u Delphi aplikacijama?
Postoji nekoliko načina da dobijemo ovaj efekat. Osnovna tehnika je da „zavaramo“ Windows da je cela forma (ili neki njen deo) u stvari naslovna linija. Pa tako, kada korisnik klikne mišem bilo gde na formi i pomeri pokazivač, i forma bi trebalo da promeni poziciju i isprati pokret korisnika.
- Pokrenite Delphi i kreirajte novi projekat. Projekat nazovite „BEZNASLOVA.DPR“.
- Podesite osobine forme na sledeći način:
- AutoScroll – False
- BorderStyle – bsSingle
- Name – Forma bez naslova
- Dodajte na formu i dve kontrole label sa sledećim osobinama:
- Label1
Left 14
Top 5
Width 100
Height 20
Alignment taCenter
AutoSize False
- Label2
Left 14
Top 30
Width 100
Height 20
Alignment taCenter
AutoSize False
- Label1
- Dodajte na formu i komponentu „PopupMenu“, dvostruko kliknite na postavljenu komponentu i pojaviće vam se „Menu Designer“. Na „Pop-up“ meni dodajte samo dve stavke: „&Izlaz“ i „&Ostani na vrhu“
- Unutar obrade događaja OnClick menija „Izlaz“ dodajte sledeći programski kod:
procedure TForm1.IzlazClick(Sender: TObject);
begin
Close;
end;
- Unutar obrade događaja OnClick menija „Ostani na vrhu“ dodajte sledeći kod:
procedure TForm1.Ostaninavrhu1Click(Sender: TObject);
begin
Ostaninavrhu1.Checked := not(Ostaninavrhu1.Checked);
if Ostaninavrhu1.Checked then
FormStyle := fsStayOnTop
else FormStyle := fsNormal;
end;
- Zatvorite „dizajner menija“. Za ovaj projekat potrebna nam je drugačija forma u odnosu na standardne koje nudi Delphi. Potrebno je da podesimo stil forme tako da „zaobiđemo“ metod forme „CreateParams“. U editoru koda deklarišite metod „CreateParams“ u sekciji deklaracija:
type
TNoCapForm = class(TForm)
Label1: TLabel;
Label2: TLabel;
PopupMenu1: TPopupMenu;
Izlaz: TMenuItem;
Ostaninavrhu: TMenuItem;
procedure Timer1Timer(Sender: TObject);
procedure IzlazClick(Sender: TObject);
procedure Ostaninavrhu(Sender: TObject);
private
{ Private declarations }
procedure CreateParams(var Params: TCreateParams); override;
public
{ Public declarations }
end;
- Potom, u sekciju implementation dodajte naredni kod:
implementation
{$R *.DFM}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams (Params);
Params.Style := ws_Popup or ws_ClipChildren or ws_ClipSiblings or
ws_Border;
end;
- Preostalo nam je da podesimo da Windows tretira celu formu kao naslovnu liniju, i to odgovaranjem na sistemsku poruku wm—NCHitTest:
private
{ Private declarations }
procedure CreateParams(var Params: TCreateParams); override;
procedure WMNCHitTest(var Msg: TMessage); message WM_NCHITTEST;
public
{ Public declarations }
end;
- U sekciju implementacija dodaćemo kod za upravljanje sistemskom porukom:
procedure TForm1.WMNCHitTest(var Msg: TMessage);
begin
if GetAsyncKeyState(VK_LBUTTON) < 0 then
Msg.Result := HTCAPTION
else
Msg.Result := HTCLIENT;
end;
- Na formu ćemo još dodati komponentu „Timer“, iz koje ćemo iščitavati podatak o trenutnom vremenu.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption := TimeToStr(Time);
Label2.Caption := DateToStr(Date);
end;
Selektujte formu i pređite u „Object Inspector“, na kartici „Events“, kliknite u desno polje događaja „OnCreate“, te iz liste izaberite „Timer1Timer“. - Iskompajlirajte i istestirajte projekat.
Pratite Krstaricu na www.krstarica.com