![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какой самый корркетный способ добавления шрифта в систему ?
массив © (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]Как выход можно добавлять шрифт при помоши инсталятора.