Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Какой самый корркетный способ добавления шрифта в систему ?


массив ©   (2004-08-23 03:20:00) 

Есть такой не очень корректный способ :

----------------------
Чтобы установить шрифт в систему, необходимо скопировать файл шрифта в 'Windows\Fonts' и добавить ключ в реестр:

'Software\Microsoft\Windows\CurrentVersion\Fonts'

Этот ключ указывает на файл шрифта. Далее запускаем API функцию 'AddFontRecource'. В заключении нужно уведомить систему широковещательным сообщением.

uses Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
 hReg: TRegistry;
 hBool : bool;
begin
 CopyFile('C:\DOWNLOAD\FP000100.TTF',
          'C:\WINDOWS\FONTS\FP000100.TTF', hBool);
 hReg := TRegistry.Create;
 hReg.RootKey := HKEY_LOCAL_MACHINE;
 hReg.LazyWrite := false;
 hReg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Fonts',
              false);
 hReg.WriteString('TESTMICR (TrueType)','FP000100.TTF');
 hReg.CloseKey;
 hReg.free;
 //Добавляем ресурс шрифта
 AddFontResource('c:\windows\fonts\FP000100.TTF');
 SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
 //Убираем блокировку ресурса
 RemoveFontResource('c:\windows\fonts\FP000100.TTF');
 SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
end;

----------------------

Но во-первых папка Fonts может быть где угодно, и её точный адрес надо смотреть в ключах реестра.
А во-вторых, точно ли, что эти ключи реестра на всех виндос в одном и том же месте ? И может быть есть какой способ добавить шрифт без копания в реестре, через функции, или каким-нибудь более корректным способом ?


Mim1   (2004-08-26 07:50:00) [1]


> Попробовал запустить - сработало. Правда у меня Windows
> ME.

Код после else был пропущен компилятором.

> Директива {$IFDEF WIN32} - она действует только при компиляции
> проекта

да

> или когда программа запускается на Win32?

нет

>  когда запускается на NT, то действует то, что после {$ELSE}
> ?

нет (по крайней мере старше NT4)


массив   (2004-08-26 04:18:00) [2]


> Mim1 ©   (25.08.04 08:15) [6]
> Секция в else не сработает так как var внутри процедуры
> никогда не сработает.

Попробовал запустить - сработало. Правда у меня Windows ME.

Директива {$IFDEF WIN32} - она действует только при компиляции проекта или когда программа запускается на Win32? А когда запускается на NT, то действует то, что после {$ELSE} ?


Mim1   (2004-08-25 08:15:00) [3]

Секция в else не сработает так как var внутри процедуры никогда не сработает.


массив   (2004-08-25 03:14:00) [4]


> Юрий Зотов ©   (23.08.04 07:23) [2]
> См. SHGetSpecialFolderLocation

Да. С этой функцией более корректно.


> Iconka ©   (23.08.04 09:38) [3]
> Это вполне корректный способ.

А "ручное" добавление ключа в реестр - это корректно? Точно ли, что этот ключ во всех Виндосах находится на одном и том же месте, и нет ли стандартной функции для этой процедуры?

---------------
------------------------------

Нашёл ещё пример более корректного добавления шрифта в разных Виндос :

var
 MyFont : string;
begin
 MyFont := 'MyFont.ttf';
 {$IFDEF WIN32}
   AddFontResource(PChar(MyFont)); // AnsiString
 {$ELSE}
   var
     s1 : array [0..255] of Char;
   try
     AddFontResource(StrPCopy(s1, MyFont));
   except
   end;
 {$ENDIF}
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);


Для чего эти PChar и StrPCopy ? Почему нельзя добавить просто стринг ? Для чего массивы создавать ?
Нужно ли после этой процедуры удалять фонт, также сложно, как и добавлять с PChar и StrPCopy ?


Mim1   (2004-08-24 15:05:00) [5]

А должен ли фрифт для нормальной работы находится в папке шрифтов, насколько мне известно это совсем необязательно.
Так что при запуске просто регистрируйте шрифт и используйте сколько угодно.

Широковещательное сообщение нужно для оповещения других программ о том что зарегестрирован новый шрифт, нужно ли вам это делать.

ИМХО Новый шрифт может незарегестрироваться при отсутствии прав администратора, так что лучше воспользоваться первым ответом и возложить обязанности ухода за шрифтами на инсталятор. Инсталятор на конечной машине будет запускать администратор, так что проблемм с правами не возникнет.


Iconka   (2004-08-23 09:38:00) [6]


> Есть такой не очень корректный способ

Это вполне корректный способ.

Только не нужно делать:

RemoveFontResource('c:\windows\fonts\FP000100.TTF');
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);


Юрий Зотов   (2004-08-23 07:23:00) [7]

См. SHGetSpecialFolderLocation


Mim1   (2004-08-23 05:14:00) [8]

Как выход можно добавлять шрифт при помоши инсталятора.


Наверх

Титульная страница Поиск, карта сайта Написать письмо