HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Delphi 6 Form-ok konvertálása Delphi 5 Form-má


Példaprogram letöltése

4753 bájt

A Delphi legújabb verziójáról jó és rossz egyaránt elmondható, de az biztos, hogy a kompatibilitás hagy némi kívánnivalót maga után. Ha megnyitunk mondjuk egy Delphi 5-ben készült project-et Delphi 6-ban, majd elmentjük – akár változtatás nélkül – akkor nagy a valószínűsége annak, hogy Delphi 5-ben többé nem fogjuk tudni megnyitni. Ennek az az oka, hogy a Delphi 6 eltérő formátumban menti el a DFM fájlt, aminek következtében a Delphi 5-ben történő megnyitáskor „Error reading form ...” hibaüzenetet kapunk. A mellékelt program lehetőséget ad arra, hogy az ilyen DFM fájlokat konvertáljuk Delphi 5 formátumra, valamint azt is megnézzük, hogy hogyan tudunk egy Delphi parancssori segédprogrammal egy vagy akár több DFM fájlt konvertálni szöveges formátumból bináris formátumba, vagy vissza.

A hiba oka elsősorban annak köszönhető, hogy a Delphi 6 a DFM fájlokban a kiterjesztett ASCII karaktereket speciális formában tárolja a fájlban, a fájl formátumától (szöveges vagy bináris) függetlenül. Az ilyen DFM fájlokat a Delphi nem tudja értelmezni, és ezért megnyitni sem.
A mellékelt segédprogram nem tesz mást, mint megnyitja a megadott DFM fájlt, és a speciális karaktereket módosítja úgy, hogy azok a Delphi 5-ben is beolvashatók legyenek. Fontos, hogy a segédprogram Delphi 6-ban készült, azért, hogy bármilyen DFM fájlt be tudjon olvasni.
A DFM fájlt egy Memo komponensbe olvassuk be. Mivel a fájl lehet szöveges és bináris formátumú, először ellenőrizni kell, hogy a megadott fájl milyen formátumban van tárolva. Ehhez a fájl első bájtját kell csak beolvasni, amihez egy TFileStream típusú objektumot használunk fel. Ha a bájt értéke $FF, akkor a fájl bináris, és a beolvasás kicsit bonyolultabb. Ha ettől eltérő, akkor szöveges formátumban van tárolva, tehát a Memo komponens Lines objektumának LoadFromStream metódusával egyszerűen betölthetjük a TFileStream objektumból.
Bináris formátumnál létre kell hoznunk egy TMemoryStream típusú objektumot is. Ha ez megtörtént, akkor az ObjectResourceToText metódussal beolvassuk a fájl tartalmát a MemoryStream-be a FileStream-ből. Ezután már e Memo komponens Lines objektumának LoadFromStream metódusával betölthetjük a szöveges formátumú DFM-et a MemoryStream-ből.
A DFM fájl beolvasását tehát megoldottuk, következhet a konvertálás. Erről annyit kell tudni, hogy a Delphi 6 a speciális (pl. magyar ékezetes) karaktereket nem karakterként tárolja, hanem a következőképpen: a fájlba a karakter kódja kerül szöveges formátumban egy # karakter után. Például az „é” betű helyett „#233”-at tárol el (természetesen idézőjel nélkül). Ezeket a kódokat kell nekünk felcserélnünk a megfelelő karakterekre.
Létrehoztunk egy d6tod5.ini nevű fájlt, ami nevével ellentétben nem egy szabványos ini fájl, csak nagyon hasonlít rá a szerkezete. A különbség csak annyi, hogy ebben nincsenek szekciók. Ebben a fájlban tároljuk a karaktereket, és a hozzájuk tartozó kódot kód=karakter formátumban, pl.:
233="é"
237="í"
225="á"
...
A fájl csak a copyright („©” ) karaktert, valamint a magyar ékezetes karaktereket tartalmazza, de tetszés szerint bővíthető.
A konvertálás során (Button3 - OnClick) betöltjük a fájl tartalmát egy TStringist objektumba. A Memo komponens tartalmát (DFM fájl) kitesszük egy lokális sztring változóba (s), a gyorsabb feldolgozás érdekében. Egy ciklusban beolvassuk a karakter kódokat a TStringList objektum Names property-jének segítségével, az aktuális kódot a v változóban tároljuk el. Ezután beolvassuk a kódhoz tartozó sztringet az objektum Values property-jén keresztül. Ha az érték idézőjelek közé van téve, akkor a MidStr függvény felhasználásával töröljük a sztring elején és végén található idézőjeleket. A MidStr függvény a Delphi 6-ban jelent meg, bár régebbi basic implementációkban már megtalálható volt (pl. Visual Basic). Gyakorlatilag megegyezik a Copy függvénnyel.
Ha megvan a kód és a hozzá tartozó karakter (vagy sztring), akkor a StringReplace függvénnyel kicseréljük a kódot a megadott karakterre. A kódoknak három előfordulása lehet:
  • sztring legelején (pl. #201’let’ = ’Élet’)
  • sztring közben (pl. ’M’#233’gsem’ = ’Mégsem’)
  • sztring legvégén (pl. ’Kandall’#243 = ’Kandalló’)
Mindhárom esetre külön StringReplace függvényt kell használnunk, mivel a kód előtt, illetve mögött lévő aposztróf karaktereket is el kell távolítani.
A konvertált DFM mentése szöveges formátumban történik, mivel a Delphi 5 ezt is be tudja olvasni, és most ez a cél. Ha a DFM-et beolvassuk Delphi 5-be, akkor különböző hibaüzeneteket kaphatunk, hogy bizonyos property-k, vagy azok értékei hiányoznak, hibásak. Ezen szerencsére az Ignore All gombbal átléphetünk, és újra használhatjuk a Form-ot Delphi 5-ben.
A bevezetőben szó volt arról, hogy bemutatunk egy olyan kis segédprogramot, amivel DFM állományokat konvertálhatunk bináris, vagy éppen szöveges formátumba. Ez a segédprogram a Delphi Bin könyvtárában található convert.exe program.
A convert.exe egy parancssorból használható program, aminek szintaxisa a következő:
convert.exe  [-i] [-s] [-t | -b] <filespec(s) | @filelist>
A kacsolók jelentése a következő:
  • -i: a konvertált fájl felülírja az eredetit. Akkor van jelentősége, amikor binárisból szöveges formátumra konvertáljuk a fájlokat. Ha nem adjuk meg, akkor a konvertált fájl kiterjesztése .dfm helyett .txt lesz.
  • -s: az alkönyvtárakban is keres (rekurzív)
  • -t: szöveges formátumba konvertál
  • -b: bináris formátumba konvertál
C:\Munka\>convert –s –i –t *.dfm

Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2002 évkönyv 232. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |