Показать сообщение отдельно
  #9  
Старый 25.09.2014, 13:46
limbast limbast вне форума
Прохожий
 
Регистрация: 24.09.2014
Сообщения: 2
Версия Delphi: Delphi XE2
Репутация: 10
По умолчанию

Все оказалось проще, но всё же непонятно. Ниже уже работающий код с объяснениями. Сразу ремарка: в проекте у 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, его имя без пробела для этого шрифта. Для другого может быть по другому.
Почему так? Почему имя шрифта изменяется?
Ответить с цитированием