Delphi - Flash animációkat tartalmazó állományok konvertálása

forráskód letöltése
A Flash animációkat tároló .SWF állományok alapértelmezésben nem futtatható fájlok. Az Internet Explorer egy megnyitott példányára kell dobnunk őket ahhoz, hogy megtekinthetők legyenek. Van azonban mód arra, hogy futtatható állományokat készítsünk ezekből az állományokról. Cikkünkben elkészítünk egy komponenst, mely képes lesz ennek megvalósítására.
A mellékelt példaprogram megnyitása előtt a FlashConverter.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component – Install Component menüpontot. A mellékelt program futtatását megelőző lépésekről a cikk bevezetőjében olvashat.
Bevezető
A megoldáshoz a Macromedia Flash lejátszóját is fel kell használnunk. Ennek érdekében gondoskodnunk kell arról, hogy a lejátszó rendelkezésre álljon rendszerünkben. Amennyiben ezzel nem rendelkezünk, akkor letölthetjük azt a következő webhelyről:
http://zugdidi.iatp.org.ge/odishi/games/
A weblapon válasszuk a SAFlashPlayer.exe linket, és elérhető lesz a futtatható állomány. A link a cikk írásakor volt elérhető, mely természetesen meg is változhatott.
Konvertáló komponens
A TFlashConverter komponenst feltelepítve elérhetjük és a Form-ra dobva elérhetjük az Execute metódust, mely elvégzi a konvertálást. A metódus három bemenő paraméterrel rendelkezik.
  • Az első paraméter a forrás Flash állomány elérési útvonalát tartalmazza (.SWF)
  • A második paraméter a generálandó futtatható állomány elérési útvonalát tartalmazza
  • A harmadik paraméter a SAFlashPlayer.exe lejátszó alkalmazás elérési útvonala lesz
Az Execute metódusban elsőként létrehozunk egy TFileStream objektumot a generálandó EXE számára.
dStream := TFileStream.Create(desc, fmCreate);
Majd létrehozunk egy ilyen objektumot a lejátszó adatfolyama számára.
lStream := TFileStream.Create(player, fmOpenRead or fmShareExclusive);
A következő lépés, hogy a cél adatfolyam bájtjait a most létrehozott lejátszó adatfolyamba másoljuk.
try
  dStream.CopyFrom(lStream, 0);
finally
  lStream.Free;
end;
Létrehozunk egy adatfolyam objektumot a forrás állomány számára is.
sStream := TFileStream.Create(source, fmOpenRead or fmShareExclusive);
A forrás adatfolyam bájtjait a cél adatfolyamba kell másolnunk.
dStream.CopyFrom(sStream, 0);
Végül az adatfolyam objektum tartalmát az új állományba írjuk.
flag := $FA123456;
dStream.WriteBuffer(flag, SizeOf(Integer));
SwfFileSize := sStream.Size;
dStream.WriteBuffer(SwfFileSize, SizeOf(Integer));
A mellékelt példában meg kell adnunk a SAFlashPlayer.exe alkalmazás elérési útvonalát, majd a generálást végző nyomógombra kell kattintanunk.
Amennyiben a megadott elérési útvonal létezik, akkor meghívjuk a komponens Execute metódusát.
if FileExists(edit1.Text) then begin   FlashConverter1.Execute(ExtractFilePath(Application.ExeName)+ 'sample.swf',ExtractFilePath(Application.ExeName) + 'sample.exe',edit1.Text);
...
A művelet végén futtatjuk is a generált sample.exe állományt a CreateProcess metódussal.