Képnézegető fejlesztése V.

 

 

Mielőtt tovább mennénk, gondoljuk végig, jól működik-e a programunk így! Nézzük meg a megvalósított Drag&Drop üzemmódot! A programba be van építve, de a felhasználó honnan tudja majd, hogy van ilyen szolgáltatás, hiszen leírást nem írunk, meg nem is olvassa el senki! A legjobb megoldás talán egy külön gomb lenne, és annak lehetne Drag&Drop funkciója is, de a gomb lenyomásakor is menne a másolás. Ráadásul mivel itt tudni kéne, hogy melyik alkönyvtárba kell menteni, ezért ezt a csoportos mentés gombjai közé tehetnénk, és az ott megadott alkönyvtárba másolnánk! A TFileListBox Popup menüjébe is be lehetne rakni a kétféle másolást, így gyorsabban el lehetne érni a funkciót. Azon is el lehetne gondolkodni, hogy a mentés, törlés, - funkciókat a TFileListBox fölé rakott gombsorból érjük el, hiszen ezek a funkciók az itt lévő fájlokra vonatkoznak, ráadásul a gombsort inkább megtalálja mindenki, mint a PopupMenut, de a legjobb megoldás talán mind a kettő lenne!

A speciális mentés paramétereinek a beállítását is megvalósíthattuk volna egy dialógus ablakban, de úgy gondoltam, hogy így a beállítás gyorsabb, ráadásul a paraméterek mindig látjuk is a képernyőn!

Mint látható egy program látványának, kezelhetőségének megvalósítása nem is olyan egyszerű feladat. Sok megoldás közül választhatunk, ráadásul nem vagyunk egyformák, a megszokott dolgok igen befolyásolnak minket, pedig lehet, hogy azok egyáltalán nem optimálisak! Talán ezért célszerű olyan programot készíteni, amit a felhasználó a lehetőségekhez képest minél inkább saját ízlése és megszokása szerint alakíthat át. Ez ebben a példában még nem is olyan veszélye, de például egy szövegszerkesztő esetében igen fontos dolog, mert akkor fogják az új programot használni, ha minél inkább olyanná tudják tenni a felületetet, a funkciók elérését, mint amit már megszokott! Hiába tud az új program több mindent, ha nem áll kézre, és a munka lassúbb mint a régivel, akkor igen kevesen veszik a fáradságot az új megtanulására!

Ezután a „kis” kitérő után folytassuk az érdemi munkát! Kanyarodjunk vissza a fájlok másolásához, és a fent leírt ötletet valósítsuk meg, vagyis tegyünk fel egy új gombot a ToolBar1-re, és ennek a lenyomására történjen meg a kijelölt fájlok másolása, valamint ehhez a gombhoz is rendeljük hozzá a mentés gomb OnDragDrop, és az OnDragOver eventjét. Természetesen most kiemeltem az  OnDragDrop függvényből a tényleges másolást egy külön függvénybe, és ezt az új függvényt hívom meg a megfelelő helyről!

Azt hiszem, sikerült a „saját kardomba dőlni”, mert így átalakítva a programot, kiderül, hogy van vele néhány probléma. Az új gomb feleslegessé, sőt zavarossá teszi a mentés gomb OnDragDrop funkcióját, tehát onnan vegyük is ki! (Természetesen az új gombnál maradjon meg a hívás!) Ezzel feleslegessé vált a mentés gomb Hintjének állítása, mert az már hagyományos mentés funkciót lát el!

A másik probléma, hogy az új gyors mentés gombnál nem tudom állítani a mentés alkönyvtárát. Eredetileg a SavePictureDialog alkönyvtárára hivatkoztunk, de most úgy tudom ezt változtatni, hogy megnyitom a sima mentés ablakot, és ott kiválasztom az alkönyvtárat, de ez igen zavaros, és főleg honnan fogja tudni ezt a felhasználó? Ezek után nincs más megoldás, mint  egy TEdit komponens felrakása a ToolBar-ra, ahol megadhatjuk a cél alkönyvtár nevét. (Ez az alkönyvtár lesz a csoportos konverzió alkönyvtára is!) Vagyis egy ilyen „kis” változtatás, mint egy új gomb felrakása rengeteg bonyodalmat, és átírni valót hoz magával, tehát ezért kell először alaposan átgondolni a funkciókat, és a szolgáltatásokat, hogy után ne kelljen bűvészkedni! (Azért a most törlésre kerülő részben is volt néhány trükk, mint a Hint előállítása, a DragDrop funkció!) Tegyük meg önállóan a változtatásokat, egy kis gyakorlásnak jó lesz ez is, mert ebből egyértelműen kiderül, hogy ki értette az eddig leírt dolgokat! Akinek ez mégsem megy, az megtalálja a CD-n a tényleges forrást!

A módolás közben még néhány változtatást eszközöltem a programban, de ezek inkább csak a felületet érintik. Néhány gomb képét kicseréltem, és a Csoportos konverzió, (mentés másként volt a régi gomb neve!) lekerült a ToolBar2-re, így a csoportos módosítást a megnyitott ablakban lehet elindítani majd! A ToolBar2-ben az edit mezők Enabled tulajdonságát az előttük lévő CheckBox állapotától tettem függővé, mindezt a SaveAsHint függvénybe írtam bele. Így talán szebb, használhatóbb lett a program, de a munka végéig még biztos fog néhányszor változni a form! Mindenki alakítsa saját szája íze szerint a képernyőt, had legyenek egyéni programok. Más megvalósításokat szívesen megnéznék, a legszebbet fel is tehetnénk a CD-re! Bárki nyugodtan küldje el a levélcímemre az Ő formját, hátha az övé lesz a legszebb!

 

A „nagy” módolás után térjünk vissza a konkrét problémákhoz. A „szakirodalom” azt mondja, hogy úgy kell a programot elkészíteni, hogy a felhasználó mindig tudja, mit csinál a program, és a műveletekről kapjon „visszajelzést”! A mi esetünkben ez azt jelenti, hogy több fájl másolásakor ugyan kitesszük a „homokórát”, de egy idő után a felhasználó lehet, hogy azt hiszi, meghalt a gépe, mert a programunk csak „homokórázik”, de más nem történik. Ezért valamilyen módon jelezzük a másolás tényét a felhasználónak. A másolás tényét egy ProgressBar-ral jelezhetnénk, esetleg ki is írhatnánk a másolt állomány nevét is. Miután a másolás FileStream-el történik, igazából csak az átmásolt fájlok számát tudjuk ábrázolni a ProgressBar-ral.

A legszebb megoldás az lenne, ha a ProgressBart a StatusBar-ra tennénk, másoláskor megjelenítenénk, menne a csík szépen, a másolás végén pedig eltüntetnénk, így a StatusBar-on megjelenített adatokat nem zavarná, de kellő információt tartalmazna! Mivel azonban a StatusBar nem tud alaphelyzetben más komponenst fogadni, ezért ez nem járható út sajnos, mást kell kitalálnunk! (Azért így zárójelben megjegyzem, hogy a StatusBar átalakítása igen könnyen megoldható, de itt most nem írunk új komponenseket, talán majd legközelebb!)

Azért az ötletet ne vessük el teljesen, próbáljuk valahogy „szimulálni”. Ha alulra feltennénk egy Panelt, és abba tennénk bele a szükséges elemeket, az valami hasonló megjelenést adhatna. Természetesen alap esetben ez a Panel nem látszana, de másoláskor egyszerűen kicserélnénk a StatusBar-ral, majd a másolás után mindent visszaállítanánk eredeti formájába!

Próbáljuk meg ezt a megoldást, elég egyszerűnek néz ki, de talán működik! Tegyünk fel egy Panelt a formra, az Align tulajdonságát állítsuk alBottom-ra! A Visible tulajdonságát állítsuk Falsra, hiszen alap esetben nem látszik! Tegyünk rá egy ProgressBar-t, állítsuk az Align tulajdonságát alLeft-re, majd tegyünk fel egy másik panelt alClient tulajdonsággal, ebbe írjuk majd a másolt fájl nevét. Ezzel már meg is vagyunk, akkor jöhet a kódolás.

Mivel a másolás gomb lenyomásakor csak az aktuális fájlt másolhatjuk,  ezért itt nincs szükség a ProgressBar megjelenítésére, csak az új csoportos fájl másolás gomb lenyomásakor. Itt is csak akkor kell a megjelenítés, ha egynél több fájlt másolunk!  Ennek megfelelően javítsuk ki az  OnDragDrop-ból kiszedett Gyorsmasolas függvényünket:

procedure TForm1.GyorsMasolas;

var s: string;

i: integer;

begin

 if (Edit1.Text<>'') and (Uppercase(Edit1.Text)<>Uppercase(DirectoryListBox1.Directory))then

 begin

 Screen.Cursor:=crHourglass;

 ProgressBar1.Max:=FileListBox1.SelCount;

 ProgressBar1.Position:=0;

 // Csak akkor jelenítjük meg, ha több fájlt kell másolni!!

 if ProgressBar1.Max>1 then

 Panel8.Visible:=True;

 // StatusBar eltüntetése, ha kell!!!

 StatusBar1.Visible:=not Panel8.Visible;

 for i:=0 to FileListBox1.Items.Count-1 do

 begin

                          if FileListBox1.Selected[i] then begin

 // ProgressBar léptetése

 ProgressBar1.Position:=ProgressBar1.Position+1;

  // Fájl név kiírása

 Panel9.Caption:='Másolás: '+DirectoryListBox1.Directory+'\'+FileListBox1.Items[i];

 // Engedélyezzük az üzenetek haladását, mert különben nem látni a fájl nevét!!!!!

 Application.ProcessMessages;

 // Cél nevének előállítása

 s:=Edit1.text;

 if s[Length(s)]<>'\' then

 s:=s+'\';

 if DirectoryExists(s) then

 begin

 s:=s+ExtractFileName(FileListBox1.Items[i]);

// Tényleges mentés!!

 Save(DirectoryListBox1.Directory+'\'+FileListBox1.Items[i],s,False);

 end

 else

 ShowMessage('Nem létezik a cél alkönyvtár:'+#13+Edit1.Text);

 end;

end;

 // Visszaállítás

 Panel8.Visible:=False;

 StatusBar1.Visible:=True;

 Screen.Cursor:=crDefault;

 end;

end;

Elég olvashatatlan lett a forrás így tördelve, de a lényeget leírom. A ProgressBar Max értéke a kijelölt fájlok számát kapja meg, Position értéket pedig nullázzuk. Egy dologra kell figyelni, hogy másolás közben a képernyő nem tud frissülni, mivel az üzenetek továbbítása leáll, így nem jelenik meg a másolt fájl neve. Ezen azonban igen könnyen tudunk segíteni, az Application.ProcessMessages engedélyezi és továbbítja az üzeneteket, így a képernyő már gond nélkül frissül.

Befejezésül már csak egy funkciót építsünk be a programba, ez pedig a Cél alkönyvtár kiválasztása legyen. Ezt a SelectDirectory hívással valósítjuk meg, ami megnyit egy alkönyvtár kiválasztó ablakot. Az eredményt természetesen az Edit1-be írjuk be!

A következő részben végre rátérünk az érdemi munkára, és a tényleges konverziós függvényeket fogjuk megírni! Természetesen ezeket úgy fogjuk elkészíteni, hogy a csoportos konverziók is működjenek!

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

Pammer Pál - pp@freeweb.hu