Lazarus, отображение интерфейсных элементов в разных ОС

Сегодня мы поговорим о кроссплатформенном программировании 🙂 и его проблемах. Есть такая штука — Lazarus. Это не что иное, как open source реализация знакомого многим Delphi. Практически все 1 в 1, да еще и изначальная кроссплатформенность. Код написаный на Windows, без проблем переноситься на Linux, WinCE, Mac или куда пожелаете. Поддержка множества графических библиотек для построения интерфейсов (gtk, gtk2, win32, wince, carbon, cocoa, fpgui) делает очень быстрым разработку интерфейса программы, а простота языка (freepascal) позволяет стремительно писать код. Это не панацея, но для некоторых вещей — вполне достойное решение.

Но т.к. графические виджеты, по разному выглядят в разных ОС, встает проблема, как их синхронизировать и корректировать в зависимости от графической подсистемы. Обычно, самое что бросается в глаза — это разница размеров и начертания шрифтов между Linux и Windows. Привести примерно к одному виду позволит небольшой хак.

В обработчике события OnCreate последней формы (если у вас 4 формы, то это будет Form4:)) разместите следующий код, который пробежит по всем формам и всем виджетам и в зависимости от ОС поменяет размеры и названия шрифтов. Или, как вариант, можно в файле описания проекта (project.lpr), после секции создания форм Application.CreateForm().

Вуаля!

procedure TForm4.FormCreate(Sender: TObject);
var
fn: string;
fs, i, f: integer;
co: TComponent;
begin
{$IFDEF WINDOWS}
fn := 'Arial';
fs := 8;
{$ELSE}
fn := 'default';
fs := 8;
{$ENDIF}

for f := 0 to screen.FormCount - 1 do
begin

for i := 0 to Screen.Forms[f].ComponentCount - 1 do
begin
co := Screen.Forms[f].Components[i];
if co is TControl then
begin
TControl(co).Font.Name := fn;
TControl(co).Font.Size := fs;
if (co is TBitBtn) or (co is TEdit) or (co is TComboBox) then
TControl(co).Font.Style := [fsBold];
end;
end;
end;

end;

p.s. Данный полухак использовал в SMSSender