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