Esetünkben a 800x600-as képernyőfelbontást vesszük alapul, mert ez még hasznos lehet jó néhány helyen. A program az ettől az értéktől nagyobb felbontások esetén képes lesz önmagát is arányosan átméretezni. A programkódot most nem a Form, hanem a Project fájl forráskódjához kell hozzáírni. Ezt a Project menü View Source menüpontjában jeleníthetjük meg. Úgymond itt készülnek el a project-ben található Form-ok. Esetünkben a következőképpen alakítjuk át mindezt.
A uses részhez hozzáadjuk a Dialogs, Classes, TypInfo és a Windows unit-okat.
uses
Forms,
Dialogs,
Classes,
TypInfo,
Windows,
Unit1 in 'Unit1.pas' {Form1};
Felveszünk két konstans értéket, melyek az alapul vett képernyőfelbontást tartalmazzák.
const
ScreenWidth: LongInt = 800;
ScreenHeight: LongInt = 600;
Deklaráljuk a változókat.
var
i, j: Integer;
NewFormWidth: Integer;
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Lekérdezzük a GetSystemMetrics függvény segítségével az aktuális képernyőfelbontás x koordinátáját, azaz a képernyő szélességét. Ezt átadjuk a NewFormWidth nevű változónak.
NewFormWidth:=GetSystemMetrics(SM_CXSCREEN);
with Application do
for i:=0 to ComponentCount-1 do
begin
Először megkeressük az összes automatikusan létrehozandó Form-ot.
if Components[i] is TForm then
Mindegyiknek sorban beállítjuk az új szélességi és magassági értékeket.
with (Components[i] as TForm) do
begin
A Form Scaled tulajdonságát igazra állítjuk, hogy az átméretezhető legyen.
Ha a jelenlegi képernyő szélessége nem egyezik meg az alapul vett 800 pixel értékkel, akkor a Form Height és Width paramétereinek új értéket adunk.
if Screen.Width <> ScreenWidth then
begin
Height:=longint(Height)*longint(Screen.Height) div
ScreenHeight;
Width:=longint(Width)*longint(Screen.Width) div
ScreenWidth;
A ScaleBy függvény segítségével átméretezzük a Form-ot és a rajta található összes objektumot a Screen.Width/ScreenWidth hányados által megadott százalékkal. Ha az aktuális képernyőméret kisebb, akkor arányosan csökkentjük, ha nagyobb, akkor növeljük a For-nak és a komponenseinek a méretét.
ScaleBy(Screen.Width, ScreenWidth);
Ezután a Form-on levő összes komponens betűméretét is átméretezzük, hogy az arányos legyen azok új méretével. Ehhez meg kell keresnünk a komponensek Font property-jét a GetPropInfo függvény segítségével.
for j:=0 to ControlCount-1 do
with Components[j] do
if GetPropInfo(ClassInfo, 'font')<>nil then
Ha a vizsgált komponens rendelkezik Font tulajdonsággal, akkor annak új betűméretét adunk.
Font.Size:=(NewFormWidth div ScreenWidth)*Font.Size;
end;
end;
end;
Végül a programot lefuttatjuk.
Hogy a hatás tökéletes legyen, a project-ben létrehozott Form-ok Position tulajdonságát feltétlenül állítsuk poScreenCenter-re.
A mellékelt példaprogramban létrehoztunk egy Form-ot, melyre felhelyeztünk egy Label-t, egy Memo-t, valamint egy nyomógombot. Ezek mind rendelkeznek Font property-vel, így jól megfigyelhető rajtuk a program működése.