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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2012, 02:46   #1
DIMMUA
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 13
Вопрос Свой шрифт в программе и ео сохранение

Здравствуйте. Помогите решить проблему… Делаю программу, в которой можно использовать разные шрифты. Как-бы настроить схему оформления, и потом, передать эту другому человеку. Пользователь может выбрать один из уже установленных шрифтов в системе (компонент FontDialog) или методом перетаскивания добавить свой шрифт (AddFontResource).

Вот допустим, у вас есть файл «C:\Шрифты\МойШрифт.TTF» вы его перетащили в программу и нажали кнопку «Сохранить». Я взял ваш файл из «C:\Шрифты\МойШрифт.TTF», скопировал к себе в папку с программой и при загрузке программы делаю:

Код:
AddFontResource(МойШрифт.TTF);
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
Label1.Font.Name:=МойШрифт
Если вы выбрали шрифт из компонента FontDialog, то я при загрузке программы прочту имя файла из ini файла и все.

А проблема вот в чем, допустим, вы какой-то дизайнер, у вас в системе установлено куча шрифтов и вам не нужно ничего перетаскивать. Т.е. вы просто выбираете их из компонента FontDialog. Нажимаете кнопку «Сохранить»и в файле ini появиться такая запись:

[Шрифт]
Название=МойСуперШрифт

Далее вы передаете свою схему обычному человеку, у которого нет вашего шрифта. И схема оформления не запуститься, ведь программа будет пытаться сделать:

Label1.Font.Name:= ini.ReadString('Шрифт', 'Название', '');

Как решение проблемы, хочу сделать, чтобы при нажатии на кнопку «Сохранить» в папку с программой всегда сохранялся файл шрифта. Чтобы меня не волновало, откуда шрифт у «Label1». Я просто узнаю
font:= Label1.Font.Name и дальше зная имя «font» надо мне как-то найти этот шрифт, а как…. Вот я не знаю.
И. если не сложно, объясните, куда AddFontResource устанавливает шрифт? Как добавляю шрифт, то в папке Font нет изменений, и в реестре тоже ничего не меняется… Но откуда же тот Word узнал о новом шрифте?

Спасибо за внимание.

P.S. Если вам кажется, что изобретаю велосипед, не стесняйтесь, рад любой критике, бо чувствую, как-то не так надо решить эту задачу...
DIMMUA вне форума Ответить с цитированием
Старый 06.07.2012, 03:09   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

т.е. вы предлагаете тупо воровать шрифты у дизайнера? интересное решение )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 06.07.2012, 07:57   #3
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

AddFontResource выполняет временную регистрацию шрифта, действует только в текущей пользовательской сессии (до перезагрузки/разлогивания пользователя).

Для постоянной регистрации шрифта в системе, файл шрифта необходимо поместить в Windows\Fonts

Цитата:
И. если не сложно, объясните, куда AddFontResource устанавливает шрифт? Как добавляю шрифт, то в папке Font нет изменений, и в реестре тоже ничего не меняется… Но откуда же тот Word узнал о новом шрифте?
ProcMon показал что при вызове AddFontResource используется CreateFileMapping, так что шрифт "устанавливается" в оперативную память

Последний раз редактировалось astecenko; 06.07.2012 в 08:36.
astecenko вне форума Ответить с цитированием
Старый 06.07.2012, 09:32   #4
DIMMUA
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 13
По умолчанию

astecenko, спасибо за разъяснение. Получается, функцией RemoveFontResource можно и пренебречь.. все равно комп шрифт временный

veniside нет, ну почему же воровать . Дизайнер же добровольно поделиться созданной им схемой оформления (или скорее всего я буду просить знакомых дизайнеров, чтобы они мне сделали несколько разных схем). Смысл сохранения шрифтов в папке, чтобы ему облегчить работу, чтобы он не парился по поводу "а вдруг этого шрифта нет на других компьютерах", чтобы просто создавал схему, а о её переносимости он думать не должен.
DIMMUA вне форума Ответить с цитированием
Старый 06.07.2012, 12:35   #5
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

DIMMUA если компьютер выключается/включается или пользователь залогинивается/разлогинивается - то можно наверное и не вызывать RemoveFontResource. А вот если пользуются гибернацией, и с программкой активно работают, то память может утечь не хило.
astecenko вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сохранение действий в программе после закрытия fins Общие вопросы Delphi 9 01.07.2015 18:59
Свой шрифт в TextOut apromix Общие вопросы Delphi 1 17.01.2010 16:34
Свой шрифт в программе apromix Общие вопросы Delphi 9 25.11.2009 15:47
Собственный шрифт в программе apromix Мультимедиа в Delphi 2 18.08.2009 15:26