DELPHI TUTORIAL

Animirane forme

API funkcija AnimateWindow je vrlo jednostavna za korišćenje, a omogućava upravljanje formom, određivanje dužine trajanja animacije i mnoštvo drugih efekata
Poznati Windows-ov GUI (grafički korisnički interfejs) je prepun grafičkih efekata; mogućnosti animacije objekata, efekti providnosti formi i slični efekti čine obični interfejs mnogo atraktivnijim za korisnike. Da bi sve ovo dostupno i programerima, na raspolaganju stoji Windows API funkcija AnimateWindow. Ova API funkcija je vrlo jednostavna za korišćenje, a omogućava upravljanje formom, određivanje dužine trajanja animacije i pregršt efekata. Da je korišćenje ove funkcije strvarno jednostavno pokazaće i sledeći primer, gde samo treba da sledeću liniju kôda smestite unutar obrađivača događaja OnShow forme:

... AnimateWindow(Self.Handle, 250, AW_BLEND or AW_ACTIVATE); ...

Podrazumeva se da funkcija koristi roll efekat, ali ovo možete promeniti korišćenjem parametra AW_SLIDE radi dobijanja slajd efekta, parametarom AW_CENTER skupljamo i širimo formu, a parametrom AW_BLEND postižemo blagi efekat providnosti. Dodatno, pozivu funkcije možete dodati parmetar AW_ACTIVATE koji određujemo prikazivanje forme ili parametar AW_HIDE za suprotan efekat. Kada koristite roll ili slide efekat, imate mogućnost da odredite smer efekta koji može da ide vertikalnom ili horizontalnom osom, dodavanjem parametara AW_HOR_POSITIVE ili AW_HOR_NEGATIVE za x osu, i AW_VER_POSITIVE ili AW_VER_NEGATIVE za y osu. Ali, ovi parametri će biti ignorisani ukoliko koristite parametar AW_CENTER. Radi boljeg iskorišćenja ove funkcije, što više eksperimetišite sa kombinovanjem parametara i uporedite rezultate.

Autostart vašeg programa pri podizanju Windows-a

Prikazaću vam kako da izvedete da se vaša Delphi aplikacija autostartuje pri podizanju Windows-a, ali ne metodom da postavite prečicu u "StartUp" folder. Pošto na ovaj način korisnik programa može slučajno ili namerno da izbriše ovu prečicu, a samim tim se gubi mogućnost samostartovanja aplikacije. Umesto toga ovo ćemo izvesti preko podešavanja u "Registry" baze, tj. upisom određenog ključa i to na određenom mestu. Sledeći kod jednostavno iskopirajte u vaš Delphi projekt. I ne zaboravite da dodate deklaraciju ove procedure u sekcije "private" ili "public", u zavisnosti od vaših potreba.
procedure SetAutoStart(CheckState: Integer);
const
RunKey = '\Software\Microsoft\Windows\CurrentVersion\Run';
var
Registry: TRegistry;
NazivAplikacije: String;
begin
// upisite naziv vase aplikacije
NazivAplikacije :=
// Kreiramo jednu instancu TRegistry objekta
Registry := TRegistry.Create;
try
Registry.RootKey := HKEY_LOCAL_MACHINE;
if Registry.OpenKey(RunKey, FALSE) then
begin
case CheckState of
// Onemogucavanje autostart-a
0: Registry.DeleteValue(NazivAplikacije);
// Omogucavanje autostart-a
1: Registry.WriteString(NazivAplikacije, ParamStr(0));
end;
end;
finally
// Oslobadjanje Registry objekta
Registry.Free;
end;
end;


Čitanje ID3 taga iz MP3 fajla


Gotovo svaki MP3 fajl poseduje u svom zaglavlju (ID3-Tag) informacije o numeri, izvođaču, godini izdavanja i eventualno neki komentar. Ovu informaciju ne nose sve pesme u MP3 formatu, ali je "ID3" zaglavlje gotovo standard. U sledećim redovima prikazaćemo proceduru koja će iščitavati ove informacije i koju recimo možete da upotrebite za kreiranje sopstvene baze podataka o MP3 numerama na vašem kompjuteru.
Struktura ID3-Tag zaglavlja je dugačka 128 bajtova, i izgleda ovako:
type
TID3Tag = packed record // 128 bytes
TAGID: array[0..2] of char; // 3 bytes: TAG
Title: array[0..29] of char; // 30 bytes: Naslov numere
Artist: array[0..29] of char; // 30 bytes: Izvodjac numere
Album: array[0..29] of char; // 30 bytes: Album
Year: array[0..3] of char; // 4 bytes: Godina izdanja
Comment: array[0..29] of char; // 30 bytes: Komentar
Genre: byte; // 1 byte: ID tipa muzickog zanra
end;
Za čitanje ID3 zaglavlja, iskoristićemo sledeću funkciju, koja će rezultat prikazati u dijalog prozoru:
procedure TForm1.Button1Click(Sender: TObject);
const
_mp3file='G:\Mp3\Bajaga\442 do Beograda.mp3';
var
id3tag: TID3tag;
mp3file: Tfilestream;
begin
mp3file:=Tfilestream.create(_mp3file,fmOpenRead);
try
mp3file.position:=mp3file.size-128;
mp3file.Read(id3tag,SizeOf(id3tag));
showmessage(' Naslov: '+id3tag.title+#13+
' Izvodjac: '+id3tag.artist+#13+
' Album: '+id3tag.album+#13+
' Godina: '+id3tag.year+#13+
' Komentar: '+id3tag.comment+#13+
' Zanr: '+inttostr(id3tag.genre)
);
finally
mp3file.free;
end;
end;


MP3 Plejer


Otvorite novi projekt, i formu postavite sledeće komponente:
MediaPlayer - podesite samo osobinu "VisibleButtons", da samo prva tri dugmića ostanu vidljiva (postavite na "True", ostale na "False").
BitButton - u osobinu "Caption" upiąite "Otvori".
Label - izbrišite sadržaj osobine "Caption".
ProgressBar - osobinu "Smooth" postavite na "True", da bi linija napredovanja iąla "glatko".
OpenDialog - u polju osobine "Filter" pritisnite dugmić sa tri tačke da bi dobili filter editor. Kada vam se otvori editor, u polje "Filter Name" unesite "MP3 fajlovi" i u polje Filter unesite " *.mp3 ".
Timer - ovde samo proverite da je osobina "Interval" postavljena na 1.000 milisekundi odnosno 1 sekund.
Kada ste postavili na formu sve ove komponente i podesili odgovarajuće njihove osobine, ostaje samo da unesete sledeći kod (vrlo mali):

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
with OpenDialog1 do
if Execute then
ProgressBar1.Max := 0;
label1.caption:= OpenDialog1.FileName;
MediaPlayer1.FileName :=OpenDialog1.FileName;
MediaPlayer1.Open;
ProgressBar1.Max := MediaPlayer1.Length;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if ProgressBar1.Max<>0 then
ProgressBar1.Position := Mediaplayer1.Position;

end;


Kako isprazniti 'Recycle Bin'


U ovom prilogu ću vam prikazati Delphi proceduru za pražnjenje Windows Recycle Bin-a (fajlova smeštenih u ovaj direktorijum). Za ovu proceduru ćemo iskoristiti sistemsku DLL biblioteku Shell32.dll, koja dolazi uz stariju verziju Internet Explorer-a (verziju 4.0), tj. već je ugrađena u Windows 98 i novije verzije ovog operativnog sistema. Morate obratiti pažnju na to da starije verzije Windows-a 95 nemaju update-ovanu verziju (tj. verzija koja onemogućava izvoz procedure) ove biblioteke.
Procedura koristi funkciju SHEmptyRecycleBinA koju ćemo pozvati iz Shell32.dll biblioteke. A sada evo i procedure:

Procedure EmptyRecycleBin ;
Const
SHERB_NOCONFIRMATION = $00000001 ;
SHERB_NOPROGRESSUI = $00000002 ;
SHERB_NOSOUND = $00000004 ;
Type
TSHEmptyRecycleBin = function (Wnd : HWND;
pszRootPath : PChar;
dwFlags : DWORD
) : HRESULT; stdcall ;
Var
SHEmptyRecycleBin : TSHEmptyRecycleBin;
LibHandle : THandle;
Begin { EmptyRecycleBin }
LibHandle := LoadLibrary(PChar('Shell32.dll')) ;
if LibHandle <> 0 then
@SHEmptyRecycleBin := GetProcAddress(LibHandle,
'SHEmptyRecycleBinA')
else
begin
MessageDlg('Neuspesno otvaranje
biblioteke Shell32.dll.', mtError,
[mbOK], 0);
Exit;
end;


if @SHEmptyRecycleBin <> nil then
SHEmptyRecycleBin(Application.Handle, nil,
SHERB_NOCONFIRMATION or
SHERB_NOPROGRESSUI or SHERB_NOSOUND);
FreeLibrary(LibHandle);
@SHEmptyRecycleBin := nil ;
end;


Delphi - Kopiranje fajlova sa prikazom progresa


Gotovo uvek je preporučljivo da u svoje aplikacije ugradite grafiku radi prikazivanja protoka nekog procesa. Ovim ćete zabaviti korisnika programa i istovremeno ćete mu dati korisnu informaciju, o protoku nekog procesa. Prikazaćemo vam primer za prikaz progresa prilikom kopiranja fajlova. Videćete proceduru koja istovremeno kopira određeni fajl sa jednog mesta (Izvor) na drugo (Odrediste), i pri tom prikazuje putem kontrole ProgressBar napredovanje kopiranja.
U novom projektu, na praznu formu postavite jedno komandno dugme i kontrolu ProgressBar i dodajte sledeći kod. Procedura KopirajFajl će vršiti kopiranje fajla i istovremeno prikazivati napredovanje, a pozivaćemo je kada se klikne dugme Button1.

Procedure TForm1.KopirajFajl(Izvor, Odrediste : string);
var
IzvorF,OdredisteF : file of byte;
Bafer : array[0..4096] of char;
Procitano: integer;
Velicina : longint;
begin
AssignFile(IzvorF,Izvor);
reset(IzvorF);
AssignFile(OdredisteF,Odrediste);
rewrite(OdredisteF);
Velicina:=FileSize(IzvorF);
With Progressbar1 do
begin
Min := 0;
Max := Velicina;
while Velicina > 0 do
begin
BlockRead(IzvorF,Bafer[0],SizeOf(Bafer),Procitano);
Velicina := Velicina - Procitano;
BlockWrite(OdredisteF,Bafer[0],Procitano);
Position := Position + Procitano;
end;
CloseFile(IzvorF);
CloseFile(OdredisteF);
end; end;


procedure TForm1.Button1Click(Sender: TObject);
begin
KopirajFajl('c:\Windows\Welcome.exe','c:\Welcome.exe');
end;


Obezbedite se od slučajnog Shut Down-a


Kada pravite komercijalne softverske proizvode, zbog očuvanja podataka klijenata, morate u svoje aplikacije ugraditi i zaštitne procedure. Jedna od njih je i prevencija u slučaju Shut Down-a (isključivanja) kompjutera. Naime, korisnik može da krene u proceduru "spuštanja" operativnog sistema, a da nije zatvorio korisničku aplikaciju. Da bi ovo izbegli možete ugraditi proceduru koja će ovo da preduhitri. Kada Windows krene u "spuštanje", on šalje poruku WM_QueryEndSession, svim otvorenim aplikacijama. Da bi detektovali (i sprečili izlaz), moraćete kreirati proceduru za obradu ove poruke.
Sledeću definiciju postavite u Private sekciju glavne forme:

procedure WMQueryEndSession
(var Msg : TWMQueryEndSession);
message WM_QueryEndSession;
Takođe, da bi izbegli Windows-ov Shut Down, ubacite sledeći metod u implementacionu sekciju unit-a:

procedure TForm1.WMQueryEndSession
(var Msg : TWMQueryEndSession);
begin
if MessageDlg('Spustanje Windows-a?',
mtConfirmation,
[mbYes,mbNo], 0) = mrNo then
Msg.Result := 0
else
Msg.Result := 1;
end;
A da bi detektovali Windows Shutdown, moramo "uhvatiti" poruku WM_QueryEndSession. Prvo deklarišite proceduru za obradu poruke u Private sekciji forme:

Procedure WMEndSession
(var Msg : TWMEndSession);
message WM_ENDSESSION;
I na kraju dodajte samu proceduru koja obrađuje "izlaznu" poruku, u sekciju Implementation:

procedure TForm1.WMEndSession
(var Msg : TWMEndSession);
begin
if Msg.EndSession = TRUE then
ShowMessage('Windows ide u shut down proceduru! ' + #10#13
+ 'at ' + FormatDateTime('c', Now));
inherited;
end;

Password forma

Često će vam u aplikacijama zatrebati forma za unos nekog korisničkog imena i lozinke. Ova forma može da posluži za logovanje na mrežu ili logovanje u neku zaštićenu aplikaciju. Za ovakvu formu se najčešće koriste, objekat tipa Button i dva objekta tipa Edit ili MaskEdit, što je bolje rešenje. Polje za unos korisničkog imena može biti tipa Edit, a polje za unos lozinke bi trebalo da bude tipa MaskEdit zbog zaštite tajnosti ovih podataka. Kada korisnik bude unosio lozinku videće se samo niz znakova određenih preko osobine kontrole "PasswordChar". Na primer, za ovu osobinu odredite karakter "*", i kada korisnik bude unosio tekst lozinke u ovo polje videće se samo niz ovih karaktera ("*******").
Često će se podaci uneti preko ovih polja upoređivati sa onima koji su skladišteni u odgovarajućoj bazi podataka. Pri ovome, kada korisnik bude unosio ili menjao lozinku, obezbedite za ovu operaciju dva ista polja, zbog provere tačnog unosa.
Kao primer, kreiraćemo jednu Password formu. Pokrenite novi projekt i prođite kroz sledeće korake:
Izaberite meni "File > New", te izaberite "Password Dialog" sa kartice Dialogs.
Sa palete komponenti izaberite klasično dugme (Button) i postavite ga glavnu formu. Te u proceduru za obradu događaja "OnClick" dodajte sledeći kod:

PasswordDlg.ShowModal;
ShowMessage(PasswordDlg.Password.Text);
Da bi pridodali ovaj kod glavnoj formi, dodajte u modul "Unit1", u direktivu "Uses", "Unit1".

uses Unit2,...
Pokrenite program pritiskom na F9, pa unesite lozinku u dijalog prozor. Kada kliknete na "OK", program će prikazati šta ste uneli preko dijalog prozora "ShowMessage".

Postavljanje ikone programa na Desktop i Start meni

Verovatno ste se susretali sa problemom kako da kada izradite neku aplikaciju, pri instalaciji programa postavite ikone-prečice na Desktop i u Start meni. Radi se o tome da jednostavno postavite prečice u foldere "C:\Windows\Start Menu\Programs" i "C:\Windows\Desktop" (fajlovi su tipa *.lnk). Sledeću proceduru smestite u vaš program, pozovite je bilo kada i ona će odraditi svoj posao. Evo i procedure:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ShlObj, ComObj, ActiveX, registry;

type
TForm1 = class(TForm)
procedure AddToStartMenu;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.AddToStartMenu;
var
MyObject : IUnknown;
MySLink : IShellLink;
MyPFile : IPersistFile;
Directory : String;
WFileName : WideString;
MyReg : TRegIniFile;
begin
MyObject := CreateComObject(CLSID_ShellLink);
MySLink := MyObject as IShellLink;
MyPFile := MyObject as IPersistFile;

with MySLink do begin
SetArguments(PChar(application.exename));
SetRelativePath(PChar(ExtractFilePath(application.exename)),0);
SetHotKey(635); // Podešavanje prečice sa tastature - Ctl-F12
// Prečica takođe može biti definisana sa vrednošću $279 (Ctl-F10)
SetWorkingDirectory(PChar(ExtractFilePath(application.exename)));
SetDescription(PChar('Putanja do vase aplikacije'));
SetIconLocation(PChar(application.exename),0);
// Smeštanje ikone vaše aplikacije u Start meni
end;
MyReg := TRegIniFile.Create(
'Software\MicroSoft\Windows\CurrentVersion\Explorer');

// Sledećom linijom postavljamo prečicu na Desktop
Directory := MyReg.ReadString('Shell Folders','Desktop','');

// Sa sledeće tri linije postavljamo prečicu u Start meni
Directory := MyReg.ReadString('Shell Folders','Start Menu','')+
'\Programs\VasPrograms';
CreateDir(Directory);

WFileName := Directory+'\ColorMatic 2000.lnk';
MyPFile.Save(PWChar(WFileName),False);
MyReg.Free;
end;
end.

Slanje e-mail poruka

Skoro svaka od vaših aplikacija koju projektujete i kreirate za druge bi trebala da sadrži mogućnost za slanje e-mail poruka. Ugradnjom ove funkcije dobijate efektniji program, klijenti bi recimo, direktno iz programa mogli da vam šalju komentare, razne upite i drugo. Sve ovo se u Delphi-ju realizuje uz pomoć "TNSMTP" kontrole, sa palete Internet, koja se koristi za slanje e-mail poruka na neki SMTP server. SMTP je i protokol koji je jednostavan, a za pristup, tj. odašiljanje poruke, uglavnom nije potrebna autentikacija na strani servera (slanje username-a i password-a). Ovo znači da možete da uspostavite konekciju sa bilo kojim javnim SMTP serverom, pošaljete poruku(e) i potom se diskonektujete.
Kao primer, kreiraćemo jednu malu formu sa slanje e-mail poruka:
Pokrenite Delphi i na praznu formu postavite četiri Label-e, tri Edit kontrole, jednu Memo kontrolu i jedno komandno dugme. Rasporedite ih kao na slici.
Postavite na formu i kontrolu TNSMTP. Kod ove kontrole možete podesiti i SMTP server na koji šaljete poruku, preko osobine "Host", mada će u većini slučajeva biti dovoljno da upišete "mail".
Kada ste postavili sve potrebne komponente, prećićemo na kodiranje. Prvo što treba da dodamo je programski kod koji je potreban za uspostavljanje konekcije sa serverom:

// ovde upisujete naziv hosta
SMTP.Host := 'smtp.eunet.yu';
SMTP.Connect;
Da ne zabravimo, prethodni kod dodajte u događaj "Click" komandnog dugmeta (Button1).
Pošto smo uspostavili konekciju sledi slanje same poruke sa svim potrebnim segmentima. Najpogodniji momenat za slanje poruke je po dešavanjeu događaja "OnConnect", kada je sigurno da je veza uspostavljena. A onda sledi i sam kod:

with SMTP.PostMessage do
begin
FromAddress:=Edit1.Text;
ToAddress:=Edit2.Text;
Subject:=Edit3.Text;
Body:=Memo1.Lines;
end;
SMTP.SendMail;
Ovo je sve što vam je potrebno za slanje e-mail poruka. Zapazite, da su osobine: ToAddress, ToBCC, ToCC i Body, osobine sa tipom podatka "TStringList". Ovo je zbog toga što data polja mogu da sadrže više linija teksta.

Copyright (c) Bojan Dmitrović from Prigrevica