Delphi - A képernyő felbontásától független alkalmazás készítése

forráskód letöltése
A most bemutatásra kerülő cikkben annak járunk utána, miként is tudunk olyan alkalmazásokat készíteni, melyek képesek a képernyő aktuális felbontásához igazítani a megjelenésüket. Az átméretezés során az adott alkalmazás mindig ugyanabban a pozícióban fog megjelenni, és képes a rajta található komponensek méretének megnövelésére illetve csökkentésére is.
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.
program Project1;
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.
          Scaled:=True;
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.
  Application.Run;
end.
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.