Problém rozlišení obrazovky resp. velikosti písma

vložil Radek Červinka 13. února 2011 21:26

Nedávno šel v konferenci problém ohledně různého DPI (nebo velikosti písma) při navrhování programu a za běhu. Sice jsem přispěl řešením, ale jelikož se jedná o jednoduché řešení, je škoda kdyby zapadlo.

Například následující okno:

Originál

A mějme na vývojovém počítači 96DPI. Pokud na testovacím počítači např. nastavíme větší velikost písma (což je celkem častý případ, v našem případě se pak jedná o 144 DPI), tj.

Nastavení

zobrazí se formulář následovně:

Chyba

Je vidět, že písmo sice odpovídá systému - viz. titulek okna (pro porovnání s ostatními aplikace v systému), ale velikost okna má problém a jsou tam i další problémy.

Pokud ve vlastnostech formuláře nastavíme Scaled = True, AutoSize = False dostaneme následující (pokud tedy používáme správné škálovatelné fontu - truetype atd). Toto podle mne odpovídá tomu, co chce uživatel dosáhnout velkými fonty.

Dobré

V konferenci následně Lukáš Gebauer nastínil i následující řešení - citace:

Muj figl je jednoduchy, ale funguje spolehlive. Muzes programovat na malych ci velkych fontech, nevadi to. A uzivatel muze mit take male ci velke fonty.

Postup:

1. na formularich pouzivat jen skalovatelne fonty (truetype, opentype)

2. propetry formulare autoscroll a scaled dat na false.

3. do OnCreate formulare pridat radky:

  if Screen.PixelsPerInch <> PixelsPerInch then
    ScaleBy(Screen.PixelsPerInch, PixelsPerInch);

A je to. Kdo nevidel, neuveri. ;-)

Výsledek:

Alternativní řešení

Toto podle mne ale není úplně korektní řešení, jelikož velikost fontů v aplikaci neodpovídá fontům v systému (titulek x tlačítka x ostatní aplikace), ale má naopak jinou výhodu - tj. že přesně odpovídá velikost aplikace navrhované velikosti - což třeba v případě práce s grafikou může být výhodné.

V podstatě ale které řešení použijete je jen na Vás.

Tagy: , ,

Praxe

Komentáře

15.2.2011 11:14:47 #

JaroB

Zajímalo by mě, jak upravím výšku např. panelu podle tohoto schématu ručně (přepočet např. min 45 a max 85 px), v některých případech se tomu nelze vyhnout. Děkuji

JaroB

23.2.2011 12:48:20 #

Tomáš Halabala

Nevím jestli jsem dobře pochopil dotaz, ale já u svých programů používám nastavení Scaled = True, AutoSize = False a u těch komponent, které potřebují přepočet (například protože se sami nepřizpůsobí) jej udělám v OnCreate takto:
if Scaled AND (PixelsPerInch <> DesignTimePixelsPerInch) then
  // Spočítám si zvětšní:
  ScaleFactor := PixelsPerInch / DesignTimePixelsPerInch;
  // a pak touto hodnotou vynásobím a zaokrouhlím velikosti komponent (fontů), které chci napravit
  // u většiny programů se tomu nevyhnu
end;

DesignTimePixelsPerInch je hodnota PixelsPerInch formuláře při vývoji aplikace, tedy měla by to být hodnota přenesená ze systému, ve kterém program tvoříte.

Dočasnou změnou PixelsPerInch v object inspectoru si pak vyzkouším jak funguje změna velikosti celého okna. Ale pozor, doporučuji dát si pozor na nastavení této vlastnosti a nikdy nezapomenout před uzavřením projektu tam vrátit původní hodnotu. Už se mi stalo, že jsem na to jednou zapomněl a po znovuotevření projektu byl formulář zvětšený i v návrháři.

Tomáš Halabala

24.2.2011 11:42:31 #

David Lebeda

Ono je taky potřeba se pokusit vyhýbat některým způsobům umisťování komponent na form. Pokud bude např. na formu Grid (alClient) a pod nim 4 panely s alBottom, je celkem šance, že při zvětšení fontů se ty panely pod gridem promíchají. Myslím si, že to souvisí s tím, že jak se interně volá ScaleBy, že to bere komponenty postupně a při přeskládání se dočasně nový left a top zvětšovaného panelu dostane pod jiný dosud nezvětšený panel a Delphi pak usoudí, že ten má být nahoře. Řešením je panely vršit - tj. např. grid alClient a jeden panel alBottom, do toho panelu jeden panel alBottom, na d něj panel alClient a do něj další panely... Je tam sice pak přepanelováno, ale uživatel to nevidí (panelům se vypnou okraje) a nelze je přeházet nesprávným způsobem.

David Lebeda

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců