Все оказалось проще, но всё же непонятно. Ниже уже работающий код с объяснениями. Сразу ремарка: в проекте у L_Indicator шрифт выставлен как
"Birch Std" с пробелом. Поэтому я его и пытался всегда использовать в run-time.
Делаю так:
В FormOnCreate проверяю наличие шрифта и, если его нет, извлекаю ресурс и регистрирую в системе:
Код:
if Screen.Fonts.IndexOf('Birch Std')=-1 then
begin
f_BirchStd:=ExtractFilePath(paramstr(0))+'FontBirchStd.otf';
TResourceStream.Create(hInstance, 'Font_BirchStd', RT_RCDATA).SavetoFile(f_BirchStd);
f_sys_B:=GetEnvironmentVariable('WINDIR');
f_sys_B:=f_sys_B+'\FONTS\BirchStd.otf';
CopyFile(PWideChar(f_BirchStd),PWideChar(f_sys_B),true);
DeleteFile(PWideChar(f_BirchStd));
hReg := TRegistry.Create;
hReg.RootKey := HKEY_LOCAL_MACHINE;
hReg.LazyWrite := false;
hReg.OpenKey('Software\Microsoft\Windows NT\CurrentVersion\Fonts',false);
hReg.WriteString('BirchStd (TrueType)','BirchStd.otf');
hReg.CloseKey;
hReg.free;
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
FNewFont_BirchStd:=true;
end;
Как можно увидеть, проверяю я наличие шрифта
"Birch Std" (с пробелом в названии), а регистрирую шрифт без пробела.
Для использования шрифта "сразу" в первом запуске в FormOnShow делаю так:
Код:
if FNewFont_BirchStd then
begin
if AddFontResource(PWideChar(f_sys_B))=0 then
MessageDlg('Не удалось установить шрифт "BirchStd"!',mtError,[mbOK],0)
else
begin
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
L_Indicator.Font.Name:='BirchStd';
end;
end;
Здесь тоже название шрифта без пробела. Если при регистрации и в L_Indicator.Font.Name:='BirchStd' ставить пробел, как было раньше, и как выставлен шрифт в дизайнере, то шрифт не опознается и не подключается, а вот без пробела работает.
Т.е. имя шрифта, регистрируемое в системе через реестр, с пробелом в имени, а по команде AddFontResource, его имя без пробела для этого шрифта. Для другого может быть по другому.
Почему так? Почему имя шрифта изменяется?