Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2009, 00:12   #1
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
Сообщение Добавление шрифта

Доброго времени суток, уважаемые знатоки.
У меня возникла такая проблема, если запускать приложение на другом компе где не установлен нужный шрифт - приложение не хочет работать, как выход сделал следующее:
1) при старте делаю проверку наличия шрифта
2) если шрифта нету - то устанавливаю его

но все же приложение выбивает с ошибкой об неустановлденом шрифте.. все последующие запуски (без перезагрузки компа) происходят нормальо..
Как можна решить данную кроме как после установки шрифта запускать свою копию и тихонько закрывать приложение??

пишу на API с использованием GDI+.
проверку и установку делаю так:

Код:
//установка шрифта, файл шрифта лежит в ресурсах программы
function InstallFont:boolean;
var FindHandle, ResHandle: THandle;
    ResPtr: Pointer;
    siz, f, br:cardinal;
    pch:PChar;
    phkResult:HKEY;
begin
Result:=false;
FindHandle:=FindResource(HInstance, 'MTCORSVA', 'TTF');
if FindHandle<>0
 then begin
  siz:=SizeofResource(HInstance, FindHandle);
  ResHandle:=LoadResource(HInstance, FindHandle);
  if ResHandle<>0
   then begin
    ResPtr:=LockResource(ResHandle);
    if ResPtr<>nil
     then begin
      pch:='C:\WINDOWS\Fonts\MTCORSVA.TTF';
      f:=CreateFile(pch, GENERIC_WRITE, FILE_SHARE_WRITE, nil, 2, FILE_ATTRIBUTE_NORMAL, 0);
      WriteFile(f, ResPtr^, siz, br, nil);
      CloseHandle(f);
      if RegCreateKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts', 0, nil,
                        REG_OPTION_NON_VOLATILE, KEY_WRITE, nil, phkResult, nil)=ERROR_SUCCESS
       then begin
        pch:='MTCORSVA.TTF';
        RegSetValueEx(phkResult, 'Monotype Corsiva', 0, REG_SZ, pch, Length(pch)+1);
        RegCloseKey(phkResult);
        pch:='C:\WINDOWS\Fonts\MTCORSVA.TTF';
        AddFontResource(pch);
        SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
        Sleep(1000);
        Result:=true;
       end;
     end;
   end;
  FreeResource(FindHandle);
 end;
end;

var FF : GpFontFamily;
begin
  if GdipCreateFontFamilyFromName('Monotype Corsiva', NIL, FF)<>Ok
   then begin
    if not LoadFont
     then ExitProcess(0);
   end;
  GdipDeleteFontFamily(FF);
//дальше код программы
end;
буду благодарен за любые интересные ответы.
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 28.03.2009, 01:00   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом:
{$IFDEF WIN32}
AddFontResource(PChar(my_font_PathN ame{AnsiString}));
{$ELSE}
var
ss: array [ 0..255 ] of Char;

AddFontResource(StrPCopy(ss, my_font_PathName));
{$ENDIF}
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

Убрать его по окончании работы:
{$IFDEF WIN32}
RemoveFontResource(PChar(my_font_Pa thName));
{$ELSE}
RemoveFontResource(StrPCopy(ss, my_font_PathName));
{$ENDIF}
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

Где my_font_PathName - полный путь к файлу со шрифтом.
mihali4 вне форума Ответить с цитированием
Старый 28.03.2009, 01:01   #3
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Сам пока не пробовал, но вот есть интересная статья...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 28.03.2009, 01:15   #4
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

mihali4, я работаю тока под 32-х разрядной ВинХР, поэтому проверка
{$IFDEF WIN32} тут лишняя.. и если ты смотрел код то у меня есть сообщения
AddFontResource
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

DomiNick, спасиба за статью, описаный там метод работать не будет.. чирбы гарантировано установить шрифт в систему - нада прописать его в реестре (см. мой код). и еще отличие моего метода и того что в даной - разные способы извлечения ресурса, и в статья не приведена проверка на его наличие.
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение размера шрифта Nando Microsoft Office Excel 4 07.03.2009 16:45
Настройка шрифта Vladya Помощь студентам 2 16.11.2008 20:41
Размер шрифта Gorychev HTML и CSS 6 25.05.2008 11:42
Неправильное отображение шрифта chingiz Общие вопросы Delphi 2 25.01.2008 18:47
Сохранение шрифта в реестре GAGARIN-NEW Общие вопросы Delphi 4 07.12.2007 22:11