A paradox táblák alkalmasak képek tárolására. A paradox mezőtulajdonságok között szerepel a „Graphic” típus. Ezt képek tárolására fejlesztették ki. Nagy hátránya azonban, hogy csak BMP formátumú képek befogadására alkalmas. A BMP formátumról köztudott, hogy rengeteg helyet foglal. Szükségünk lehet arra, hogy hálózatos programok készítése során képeket tároljunk egy adatbázisban. Programunk teljesítményét nagyon rontja a BMP formátum használata.
Egy kis trükk segítségével azonban univerzálissá tehetjük a paradox tábla Graphic mezőjét.
A paradox adattáblák Graphic és Binary mezőinek felépítése tulajdonképpen egyforma. A mezők tartalma nem a db állományba kerül, hanem az mb kiterjesztésű fájlba. Gyakorlatilag a kettő közül bármelyikben elhelyezhetünk objektumokat, így képeket is. Az eltárolt képnek egyetlen tulajdonságát kell megjegyeznünk, ez pedig a kiterjesztése. A kép kiterjesztése meghatározza annak formátumát (leszámítva a szándékos átnevezéseket).
Amennyiben JPG képekkel szeretnénk dolgozni, Delphi programunk forráskódjában a uses kulcsszó után fel kell venni a JPEG unit hivatkozást. Ez a unit tartalmazza a JPG képek kezeléséhez szükséges leírásokat.
A mellékelt példaprogram bemutatja a képek adattáblába történő elmentését és annak visszatöltését.
A képek eltárolásához a Kepek.db paradox 7 típusú adattáblát használja. Az adattábla a következő mezőkből áll:
| Megnevezés |
Típus |
Hossz |
Leírás |
| Nev |
Alpha |
20 |
A kép eredeti neve és elérési útja |
| Kiterjesztes |
Alpha |
3 |
A kép kiterjesztése |
| Kep |
Graphic |
|
A kép |
A Table1 komponensre duplán kattintva megjelenik a tábla mezőszerkesztője. Fontos, hogy itt meg legyenek adva a tábla mezői. Ezt úgy lehet elérni, hogy egyet kattintunk az egér jobb gombjával a mezőszerkesztőn, majd kiválasztjuk az „Add fields…” menüpontot. Ezután a mezőkre úgy is tudunk hivatkozni, hogy egymásután beírjuk a TTable komponens nevét és a mező nevét. Pl.: Table1Kep. Erre később szükségünk lesz.
Próbáljuk ki a példaprogramot és nézzük meg annak működését az alábbi lépések szerint.
A „…” gomb lenyomására megnyílik egy tallózás ablak. Keressünk egy tetszőleges képet, majd kattintsunk az OK gombra. A kép neve megjelenik a „Kép elérési útja” mezőben. Kattintsunk a „Kép hozzáadása a táblához” gombra. Ekkor a kiválasztott kép bekerül a táblába, amit a gomb alatt elhelyezkedő DBGrid komponens segítségével nyomon is követhetünk.
Most nézzük a forráskódot, hogy mi is zajlik a háttérben.
Ahhoz, hogy képet helyezzünk el az adattáblában, szükségünk van két változóra:
Blob : TBlobStream;
Stream : TMemoryStream;
A két objektum más-más tulajdonsággal rendelkezik. A TBlobStream képes arra, hogy egy bináris mezőbe értéket írjon, vagy onnan értéket olvasson be. A TMemoryStream viszont képes arra, hogy fájlból olvasson be, illetve fájlba írjon ki adatokat. Mindkettőnek van egy CopyFrom metódusa, amellyel egy másik Stream változó tartalmát át tudja másolni saját magába. A kettő együttes használatával megvalósítható az, hogy egy fájlból beolvassuk a képet a memóriába, majd onnan beírjuk azt az adattáblába. A beolvasás és a beírás kódja a következő:
Stream:=TMemoryStream.Create;
Stream.LoadFromFile(Edit1.Text);
Blob:=TBlobStream.Create(Table1Kep,bmWrite);
Blob.CopyFrom(Stream,0);
Blob.Free;
Stream.Free;
A TBlobStream létrehozásánál az adatbázis mező nevét a fentebb leírt módon lehet csak megadni. A Create metódus második paraméterében kell megadni a hozzáférés módját a tábla mezőjéhez. Ez itt bmWrite, azaz írás.
Fontos, hogy eltároljuk a kép kiterjesztését is, hiszen ez meghatározza a kép formátumát. Például egy JPG formátumú képet nem lehet BMP-ként feldolgozni.
Térjünk vissza példaprogramunkhoz.
Ha felvettük a képet az adattáblába, akkor most kattintsunk a „Kép megjelenítése” gombra. Ekkor a jobb oldalon megjelenik a kép. A kép megjelenítéséhez TImage komponenst használunk, nem TDBImage-et. A megjelenítési eljárás a beírásnak az ellenkezője. Most az adattáblából beolvassuk a képet a memóriába, majd onnan kiírjuk lemezre. Végül a TImage Picture.LoadFromFile metódusával betöltjük a képet, fájlból. A betöltés algoritmusa a következő:
Stream:=TMemoryStream.Create;
Blob:=TBlobStream.Create(Table1Kep,bmRead);
Stream.CopyFrom(Blob,0);
Stream.SaveToFile('Kep.'+Table1.FieldByName('Kiterjesztes').AsString);
Image1.Picture.LoadFromFile('Kep.'+Table1.FieldByName('Kiterjesztes').AsString);
Vegyük észre, hogy a TBlobStream Create metódusában most bmRead szerepel, azaz olvasás. Amikor elmentjük a képet fájlba, ugyanazt a kiterjesztést adjuk neki, mint ami eredetileg volt, ugyanis a TImage ez alapján fogja betölteni a képet.
Az eljárás korántsem olyan bonyolult, mint amilyenek első ránézésre tűnik és rengeteg helyet és időt megspórolhatunk vele. Ez egy hálózatos program írása során nagy kincs.