Képnézegető fejlesztése III.

 

 

A Kedvencek elkészítése után készítsünk egy „diabemutatót” is a programba, hiszen a legtöbb képnézegető program ilyen szolgáltatással is rendelkezik.

 

Hogy is csinálnánk? Természetesen nagyon egyszerűen, hiszen eddig sem volt semmi őrdöngős az egész programban! Felteszünk a formra egy Timert, és innen egyszerűen továbbléptetjük a kiválasztott fájlt a FileListBox-ban, majd meghívjuk ennek az OnClick metódusát, ami egyszerűen elvégzi a kép megjelenítését!

 

Ennek megfelelően kezdjünk is neki a munkának. Egyrészt kell egy gomb a ToolBar-ra, amivel ki/be kapcsolhatjuk ezt a funkciót. Tegyük is ezt fel, a Style propertyjét állítsuk tbsCheck-re, hiszen a funkciót ki-be kell kapcsolnunk. Aztán jó lenne, ha valahogy a megjelenítés sebességét is be tudnánk állítani! Erre tegyünk ugyan ide egy TupDown komponenest, amivel majd a Timer intervallumát állíthatjuk. Tegyünk fel egy Ttimer-t is a formra, de ne engedélyezzük. Az Interval értéke 1000-en áll, vagyis másodpercenként fog meghívásra kerülni az OnTimer eventje. Itt kell a FileListBox léptetését megoldani. A Timert leállítjuk, megvizsgáljuk, hogy nem értük e el az utolsó fájlt is, mert akkor nincs mit csinálni tovább, egyébként a következő fájlra lépünk, és a FileListBox1Click meghívásával megjelenítjük a fájlt, majd a Timert visszakapcsoljuk. (A kikapcsolás tulajdonképpen azért is kell, mert előfordulhat, hogy a kép megjelenítése tovább tart, mint a timer ciklusa, ezzel ráadásul azt érjük el, hogy minden kép ugyan annyi ideig látszik a képernyőn, és ez a célunk!)

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

            // Kép léptetés

            Timer1.Enabled:=False;

            if FileListBox1.ItemIndex+1>=FileListBox1.Items.Count then

                        begin

                        // Timert le kell állítani, és megszünettni a lejátszást!!!

                        ToolButton4.Down:=False;                  // Kikapcsoljuk a lejátszást!

                        exit;

                        end;

            // Léptetés!

            FileListBox1.ItemIndex:=FileListBox1.ItemIndex+1;

            FileListBox1Click(nil);             // Új fájl megjelenítése

            Timer1.Enabled:=True;                        // Timer újabb engedélyezése

end;

 

A lejátszó gomb lenyomásával kell elindítanunk a Timert, tehát semmi más dolgunk nincs, mint a Timer engedélyezése, vagy letiltása a gomb állásától függően:

 

procedure TForm1.ToolButton4Click(Sender: TObject);

begin

            Timer1.Enabled:=ToolButton4.Down;

end;

 

Ezt már ki is próbálhatjuk, és mennie kell a lejátszásnak!

 

A „nehezével” már meg is vagyunk! Még a lejátszás sebességét kéne állítanunk a TUpDown gombbal. Azért ez sem olyan bonyolult dolog, hiszen a gomb le vagy fel léptetésével a Timer Interval property-jének az értéket kell állítani, mondjuk 1/10 másodperccel. Figyeljünk azért arra, hogy egy bizonyos határon túl ne lehessen csökkenteni tovább az értéket, ezt a UpDown komponens min, max és a position property-jével állíthatjuk be!:

 

 

procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);

begin

            // Idő léptetése fel-le a bemutatóhoz!!!

            if Button=btNext then

                        Timer1.Interval:=Timer1.Interval-100

            else

                        Timer1.Interval:=Timer1.Interval+100;

end;

 

 

Ezzel már megy is a bemutató, és majdnem minden kész, de mivel mi megint figyelünk a felhasználóra, ezért a szokásos módon most is gondoskodunk a Timer és az UpDown komponens fontos paramétereinek mentéséről, illetve visszatöltéséről a szokásos FormCreate, és a FormClose eventekben!

 

Képzeljük el azt az esetet, hogy éppen egy klassz képet látunk, és meg kéne állítani a lejátszást, de mire az egérrel elérjük a leállító gombot, addigra már tovább lépett a kurzor, tehát jó lenne valami egyszerű megoldás a lejátszás megállítására. Erre a legegyszerűbb megoldás az igen sok helye alkalmazott ESC billentyű leütése! Mi is alkalmazzuk ezt. A Form OnKeyPress eventnél egyszerűen lekezeljük az ESC leütését, és a lejátszást leállítjuk. Ahhoz, hogy ez az event működjön a Form KeyPreview property-jét True-ra kell állítani, különben a Form nem kapja meg a leütött billentyű üzenetet!!

 

Egy érdekesség azért ebben a függvényben is van! ESC leütésekor a számítógép sípol, de a Key:=#0-val ez kiküszöbölhető!!

 

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin

            // Lejátszás kikapcsolása az ESC leütésére!

            if (Key=#27) and (ToolButton4.Down) then

                        begin

                        Key:=#0;                                 // NE SIPOLJON!!!

                        Timer1.Enabled:=False;           // Timer leállítása

                        ToolButton4.Down:=False;      // Lejátszó gomb kikapcsolása

                        end;

end;

 

Ezzel meg is volnánk!

Sajnos találtam hibát a programban, a ’Kép ablak mérethez igazítása’ gomb kikapcsolásakor a kép megjelenítés nem jó, mert az Image Strech property-je True-n marad! Ezt a FileOpen függvényben tudjuk igen egyszerűen javítani:

 

procedure TForm1.FileOpen(PictureName: string);

var s: string;

begin

                        if Uppercase(FileName)=Uppercase(PictureName) then         // Már be van töltve, nem kell!!

                                   exit;

                        s:=GetExt(PictureName);

                        try

                        FileName:=PictureName;

                        if FileExists(FileName) then

                                   begin

                                   Image1.Stretch:=ToolButton3.Down;   // ITT A HIBA!!!

                                   Image1.Align:=alNone;

                                   Screen.Cursor:=crHourGlass;

                                   Image1.Picture.LoadFromFile(FileName);

                                   // Állítsuk be a méreteket

                                   ScrollBox1.HorzScrollBar.Position:=0;

                                   ScrollBox1.HorzScrollBar.Range:=Image1.Picture.Width;

                                   ScrollBox1.VertScrollBar.Position:=0;

                                   ScrollBox1.VertScrollBar.Range:=Image1.Picture.Height;

                                   Image1.Align:=alClient;

 

                                   // Kép ablak mérethez van igazítva!!!

                                   if ToolButton3.Down then

                                               PictureStretch;

       

                                   StatusBar(nil);

                                   end;

                        except

                        end;

                        Screen.Cursor:=crDefault;

end;

 

A javítás után még egy apróságot készítsünk el a programban. A képek nézegetése közben valószínű, hogy találunk olyat, amire már nem igazán van szükségünk, tehát ki szeretnénk törölni. Oldjuk meg ezt az egyszerű feladatot is. Tegyünk a FileListBox-hoz egy PopupMenu-t, amibe tegyünk egy „Kijelölt fájl törlése” menüpontot, ennek az OnClick eventjében oldjuk meg a törlést. (Ezt a popupmenüt még másra is fogjuk később használni!) Tegyünk gyorsító billentyűt is a menühöz, mert így a funkciót egy billentyű leütésével is el lehet érni!

 

procedure TForm1.FileDeleteClick(Sender: TObject);

var i: integer;

begin

            // A kiválasztott fájl törlése

  if FileListBox1.ItemIndex>-1 then                 // Van kijelölt fájl!!!

                        begin

if (not DeleteConfirm) or (MessageDlg('Fájl törlés:'+#13+FileListBox1.FileName+#13+'Biztosan töröljem?',

mtConfirmation, [mbYes, mbNo], 0) = mrYes) then

            begin

if DeleteFile(FileListBox1.FileName) then

            begin

 i:=FileListBox1.ItemIndex;

 FileListBox1.Items.Delete(i);

             if i<FileListBox1.Items.Count then

            FileListBox1.ItemIndex:=i

 else

            FileListBox1.ItemIndex:=FileListBox1.Items.COunt-1;

 // Megjelenítés

 FileListBox1Click(nil); 

 end;

end;

                        end;

end;

 

A függvényben van egy DeleteConfirm nevű változó, amit a Form-ban deklaráltunk. Azt a célt szolgálja majd, hogy a beállításoknál meg lehessen adni azt, hogy a fájl törlésekor rákérdezzen e a program a tényleges törlésre, vagy rákérdezés nélkül egyszerűen törölje az állományt. (Én például nem szeretem a felesleges kérdéseket, szeretek gyorsan dolgozni, tehát én ezt a változót majd False-ra fogom állítani a beállításokban, de ez még a jövő!)

 

Mára ennyi elég is lesz! Remélem mindenki látja, hogy nem is olyan őrdöngős ez az, ha részekre bontjuk, megpróbáljuk jól átgondolni a teendőket, és figyelmesen írjuk a kódokat!

 

Azért nem kell még elkeseredni, még rengeteg ötletem van a fejlesztésre, hogy minél „profibb” programunk legyen!

 

A forrás a lefordított programmal megtalálható a CD-n!

 

Pammer Pál - pp@freeweb.hu