A TMetaFile osztály implementációja a Graphics unitban található. EMF és WMF állományok tárolására szolgál. Az Enhanced property értékéből tudhatjuk meg, hogy a kettő közül melyik típust olvastuk be a TMetaFile objektumba.
Amikor lemezről a memóriába töltődik az állomány tartalma, akkor ott az mindig EMF formátumban kerül tárolásra.
Egy TMetaFile objektumot, ugyanúgy mint mást, a Create metódussal hozhatunk létre.
Egy lemezen lévő állományt a LoadFromFile metódussal nyithatunk meg.
MF.LoadFromFile(Edit1.Text);
Ha az MF tartalmát egy Stream változóból szeretnénk betölteni, akkor használhatjuk a következő metódust.
procedure LoadFromStream(Stream: TStream);
Ha már betöltöttünk egy MetaFile-t, akkor azt az alábbi utasítással helyezhetjük el a vágólapon.
A Clipboard objektum használatához a uses listában fel kell sorolnunk a Clipbrd unit nevét.
A vágólap tartalmát szintén az Assign metódussal olvashatjuk be a MetaFile-ba. A vágólap tartalma akár egy Word-ből kimásolt szövegrész is lehet.
A TMetaFile osztály rendelkezik pár tulajdonsággal, amely a betöltött képről szolgáltat adatokat. A kép képpontokban mért szélességét és magasságát a Width és Height értékei adják meg. Az MMWidth és MMHeight tulajdonságok egy olyan értéket adnak vissza, amely a kép szélességének és magasságának milliméterben számított 0.01-szerese. Ha a kép milliméterekben mért nagyságára vagyunk kíváncsiak, akkor azt a következő módon kérdezhetjük le.
wmm.Caption:=IntToStr(Round(MF.MMWidth*0.01));
lhmm.Caption:=IntToStr(Round(MF.MMHeight*0.01));
Ha a kép létrehozásakor eltárolták benne a szerző nevét, vagy készítettek hozzá egy szöveges leírást, akkor azokat a CreatedBy és Description, String típusú tulajdonságokon keresztül kérdezhetjük le.
Ha rajzolni akarunk magára a képre, akkor segítségül kell hívnunk a TMetaFileCanvas osztályt. Maga a TMetaFile osztály nem rendelkezik Canvas tulajdonsággal. A TMetaFileCanvas objektumot akkor tudjuk hozzárendelni egy TMetaFile-hoz, amikor a Create metódussal létrehozzuk.
mc:=TMetafileCanvas.Create(MF,0);
Ha az MF tartalmát át akarjuk másolni az mc-re, akkor a következő eljárást használjuk.
with mc do begin
Draw(0,0,MF);
Bármilyen módosítást végzünk az mc objektumon, annak az MF-ben is nyoma marad. Ha végeztünk a rajzolással, akkor nyugodtan felszabadíthatjuk az mc objektum által lefoglalt memóriaterületet, a változások már szerepelnek az MF által tárolt képben.
A TMetaFile osztály Palette tulajdonsága tárolja a kép által használt színpalettát. A paletta színeit a GetPaletteEntries eljárással kérdezhetjük le. Ez nem a TMetaFile osztály metódusa.
Először létre kell hoznunk egy tömböt, amely az egyes elemeket tárolni fogja.
var pe: array of TPaletteEntry;
A következő algoritmus lekérdezi a paletta első 50 színét, majd megjeleníti azokat a Form-on.
SetLength(pe,50);
GetPaletteEntries(MF.Palette,0,50,pe[0]);
for i:=0 to 49 do begin
with Canvas do begin
Brush.Color:=RGB(pe[i].peRed,pe[i].peGreen,pe[i].peBlue);
FillRect(Rect(20+i*3,280,20+i*2+3,300));
end;
end;
A TPaletteEntry struktúra külön tartalmazza az egyes RGB színösszetevőket.
A módosított képet a SaveToFile metódussal menthetjük el.
MF.SaveToFile(SaveDialog1.FileName);
A metódus a megadott állománynév kiterjesztéséből meghatározza a fájl formátumát is. Ehhez, természetesen EMF vagy WMF kiterjesztéseket kell megadni.