Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.10.2013, 09:15
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
Вопрос Как подгрузить свой шрифт

Ситуация.
Имеется какой-либо шрифт (*.ttf, *.fon, *.otf) не установленный в системе.
Он находится в папке с программой.
Как использовать этот шрифт в своей программе, например в Memo или Label не устанавливая его в систему? Гугл не помог
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #2  
Старый 31.10.2013, 10:35
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от SCrat.ORS
Как использовать этот шрифт в своей программе, например в Memo или Label не устанавливая его в систему? Гугл не помог
Поскольку знаю, что шрифт можно временно установить, открыв его на просмотр штатной утилитой FontView, посмотрел tdump-ом, какие функции она импортирует. Нашлись AddFontResource и RemoveFontResource.

Учись способам решения задач.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #3  
Старый 31.10.2013, 10:42
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Подключить во время запуска в Form.OnCreate:
Код:
AddFontResource('SomeFont.ttf');
Memo1.Font.Name:= 'SomeFont';
Удалить при завершении в Form.OnDestroy
Код:
RemoveFontResource('SomeFont.ttf');
Ответить с цитированием
  #4  
Старый 31.10.2013, 10:45
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

т.е. сначала установить его, использовать, а потом удалить... как-то это грубо получается...
А без установки ни как...? Может как-то можно компоненте передать сторонний шрифт какой-нибудь winapi функцией?
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #5  
Старый 31.10.2013, 10:51
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Код:
AddFontResourceEx('somefont.ttf',FR_PRIVATE,0);
FR_PRIVATE:
Устанавливает, что только процесс, который вызвал функцию AddFontResourceEx, может использовать этот шрифт. Когда имя шрифта соответствует общедоступному шрифту, частный шрифт должен быть выбранным. Когда процесс завершает работу, система удалит все шрифты, установленные процессом при помощи функции AddFontResourceEx.
Код:
RemoveFontResourceEx('somefont.ttf',FR_PRIVATE,0);
Freeman, Alegun, Похоже что так, спасибо!
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #6  
Старый 24.09.2014, 11:38
limbast limbast вне форума
Прохожий
 
Регистрация: 24.09.2014
Сообщения: 2
Версия Delphi: Delphi XE2
Репутация: 10
По умолчанию

Проблемы с установкой шрифта не возникает, но проблема в том, что шрифт доступен не сразу при запуске программы, а только на второй и последующие запуски.
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) делаю после AddFontResource.
AddFontResource пробовал делать и в FormOnCreate и в FormOnShow, и после SendMessage делаю Label.Font.Name - всё безрезультатно!
Шрифт появляется только на второй запуск программы...
Ответить с цитированием
  #7  
Старый 24.09.2014, 16:01
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

А если сделать это в файле проекта ДО первого вызова Application.FormCreate
Ответить с цитированием
  #8  
Старый 24.09.2014, 20:29
phomm phomm вне форума
Новичок
 
Регистрация: 07.10.2013
Адрес: Тюмень
Сообщения: 50
Версия Delphi: 7/2007/XE+/FPC
Репутация: 22
По умолчанию

Я занимался сходной задачей и пришёл в решению, описаному тут http://programmersforum.ru/showthread.php?t=180046
Ответить с цитированием
  #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, его имя без пробела для этого шрифта. Для другого может быть по другому.
Почему так? Почему имя шрифта изменяется?

Последний раз редактировалось limbast, 25.09.2014 в 13:48.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter