Форум
Написать нам
Страница 3 из 3«123
Модератор форума: Peter 
Форум MMB » Всё о программе Neo Book » Вопросы и ответы по NB » Проблема со шрифтами
Проблема со шрифтами
ВадимДата: Четверг, 28 Январь 2010, 01:49 | Сообщение # 61
Ветеран форума
Группа: Проверенные
Сообщений: 672
Репутация: 8
Награды: 2
Статус: Offline
Quote (mishem)
попробуй такую програму. Smart Install Maker.
Спасибо. Я думал о таком варианте, но хотелось бы самому уметь, только средствами NB. Не думаю, что там что-то космически сложное. Где-то не прописываю, вот шрифт и удаляется сам.

Сейчас делаю так:

Code

   FileExists "C:\WINDOWS\Fonts\CALIBRI.TTF" "[calibriN]"
   If "[calibriN]" "=" "False"
     MessageBox "Выберите действие" "В операционной системе Вашего компьютера не обнаружен|необходимый для работы шрифт Calibri (True Type).|Без этого шрифта программа будет отображаться неправильно.||Установить шрифт Calibri на Ваш компьютер?" "     Да     |     Нет     " "[InstCalibri]"
       If "[InstCalibri]" "=" "1"
         FileCopy "[PubDir]CALIBRI.TTF" "C:\WINDOWS\Fonts\CALIBRI.TTF"
         RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts\Calibri (TrueType)" "CALIBRI.TTF"
         AlertBox "Сообщение" "Шрифт Calibri (True Type) успешно установлен!"
       Else
         AlertBox "Сообщение" "Вы сможете установить шрифт и при другом запуске программы"
       EndIf
   EndIf

Шрифт при запуске проги копируется, тестер его видит в системной папке шрифтов, но после закрытия приложения шрифт из Fonts исчезает... Я понимаю, если бы я вместо FileCopyприменил бы ExtractFile- это еще было бы объяснимо... Есть идеи?


С уважением, Вадим
 
DEMBELДата: Четверг, 28 Январь 2010, 02:09 | Сообщение # 62
Наш дизайнер
Группа: Модераторы
Сообщений: 2314
Репутация: 25
Награды: 12
Статус: Offline
эээ... путь в реестре вроде как отличается в завис-ти от версии ОС. Первый вопрос - какая ОС у клиента?
Quote (Вадим)
Шрифт при запуске проги копируется, тестер его видит в системной папке шрифтов, но после закрытия приложения шрифт из Fonts исчезает...

второй - клиент является администратором в системе где запускается прога?, третий - если Vista/7 то программа запускается от имени администратора или нет?
 
ВадимДата: Четверг, 28 Январь 2010, 03:27 | Сообщение # 63
Ветеран форума
Группа: Проверенные
Сообщений: 672
Репутация: 8
Награды: 2
Статус: Offline
Quote ( DEMBEL )
путь в реестре вроде как отличается в завис-ти от версии ОС
Да, именно так. В системе Windows 98 нужный раздел реестра будет называться чуть иначе (без NT):

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts

В системе Windows 95 шрифты для подстановки определяются не в Реестре, а в файле win.ini

Начиная с платформы Windows NT эта ветка выглядит так:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

Quote ( DEMBEL )
клиент является администратором в системе где запускается прога
Вот это не догадался уточнить. Но ведь если бы был запрет, то вообще не удалось бы скопировать в папку. А так она вроде бы как отдаётся, но потом идет на попятную :D

А система у тестера: Win XP. Поэтому пока не заморачивался определением операционной системы. Но реализовать разные записи в реестр при разной системе не сложно.

Добавлено (28 Январь 2010, 03:27)
---------------------------------------------
Перерыл весь интернет, не встретил похожую проблему с установкой шрифта, чтобы он после копирования сам исчезал из директории... Установка шрифта должна ограничиваться копированием в системную папку шрифтов и прописыванием в реестр.

Может быть это сама NB убирает файл шрифта после закрытия приложения? Прибирается, так сказать. Может быть NB особо щепетильна в отношении системных папок вообще? Чтобы всякие вирусы не писали с ее помощью, например.
Есть информация на этот счет?


С уважением, Вадим
 
DEMBELДата: Четверг, 28 Январь 2010, 03:50 | Сообщение # 64
Наш дизайнер
Группа: Модераторы
Сообщений: 2314
Репутация: 25
Награды: 12
Статус: Offline
Quote (Вадим)
Может быть это сама NB убирает файл шрифта после закрытия приложения?

вполне вероятно что так и происходит собственно... но так вроде не должно происходить когда ты вручную копируешь файл и создаешь запись в реестре. Тут нужно проверить путем предварительного копирования и занесения в реестр вручную без участия нб, будет ли шрифт сохраняться. Если хочешь, поэкспериментируй у себя на машине, удали колибри и попробуй поставь сперва заново из нб, а потом вручную и проверь.
 
Alex3AДата: Четверг, 28 Январь 2010, 04:07 | Сообщение # 65
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2957
Репутация: 31
Награды: 10
Статус: Offline
Вадим, посмотри тут, шкрипт vb
 
ВадимДата: Четверг, 28 Январь 2010, 05:22 | Сообщение # 66
Ветеран форума
Группа: Проверенные
Сообщений: 672
Репутация: 8
Награды: 2
Статус: Offline
Quote (DEMBEL)
проверить путем предварительного копирования и занесения в реестр вручную без участия нб
У меня при копировании шрифтов вручную (просто командой "вставить" в папке шрифтов) происходит их автоматическая установка, о чем свидетельствуют появляющиеся сразу записи о них в реестре. Соответственно удаление шрифтов из системной папки автоматически приводит и к удалению записей в реестре. Т.е. на действия пользователя ограничение на добавление шрифтов не действует. По крайней мере в моей системе. Оно и логично, что у пользователя приоритет выше, чем у программы... Может тогда надо сымитировать нажатие клавиш для копирования шрифтов в системную папку? :D

Quote (Alex3A)
посмотри тут, шкрипт vb
Из описания я понял только, что используется схема из двух шагов, где первый - как у меня - копирование шрифта в системную папку шрифтов, а вот второй шаг мне не понятен. Указано, что используется для установки шрифта вызов API посредством "RunDll32.exe gdi32.dll". Что это значит? И как можно этим воспользоваться из NB? И что такого делает запуск функции API, кроме как прописывание шрифта в реестре?

С уважением, Вадим
 
ВадимДата: Четверг, 28 Январь 2010, 07:35 | Сообщение # 67
Ветеран форума
Группа: Проверенные
Сообщений: 672
Репутация: 8
Награды: 2
Статус: Offline
Сделал исходник с одной кнопкой, код которой копирует шрифт в Fonts и прописывает его в реестр. Надо было сразу так поступить, но кто же знал, что добавить шрифт окажется так не просто...

В общем, на моем компе вообще другая картина. Т.е. шрифт даже в папку шрифтов не может программно скопироваться :D . Вообще там не появляется. А появляется сообщение "Аccess denied!".

Наверное это от дополнительных настроек безопасности системы зависит.
А после нажатия ОК в реестр данные заносятся без проблем. В реестр значить пускають, а к шрифтам ни ногоЙ!

Т.е. видимо вся сложность именно в том, чтобы программно разрешить проекту доступ к системной папке. Наверное это как-то и делают с помощью API?
Инсталляторы также работают?

Если кому интересно - исходник в прикреплении (весь код на одной кнопке), плюс там же один испанский шрифт AntoniousJ Jencom (TrueType). Он используется исходником. Может кому заодно и понадобится, например, справку читать по плагину Эсперальты :D .
Код тот же самый, что я привел выше, только шрифт испанский указан.

Добавлено (28 Январь 2010, 07:03)
---------------------------------------------
Да, может стоит предупредить. Что запись в реестр будет верна для систем выше Windows 98.
Интересно, кто-то пользуется Win 9x? :)

Добавлено (28 Январь 2010, 07:20)
---------------------------------------------
Нет, все верно! Появляется! Точнее в папке Fonts шрифт КАК БЫ появляется, но на самом деле его там нет.
Т.е. благодаря записи в реестре в системной папке появляется запись имени шрифта, но если по этому имени щелкнуть правой кнопкой мыши и выбрать "свойства", то виндовс выдаст ошибку, что такой файл шрифта не найден (и покажет имя файла, а не имя шрифта).

Ну, хоть это узнал, что на самом деле файл даже и не появляется в папке Fonts.

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

Добавлено (28 Январь 2010, 07:35)
---------------------------------------------
А после закрытия приложения запись об имени шрифта из системной папки исчезает.
Но, что любопытно, теперь исчезает и запись в реестре, вслед за ней. Видимо так и было с самого начала, но я не заметил.

И запись в реестре все-таки (без реального шрифта в системной папке) не задерживается.

Попробовал вручную снять у папки Fonts атрибут "только чтение", но ни фига, он опять сам появился.

Прикрепления: 4815226.png(7Kb) · Antonious.rar(26Kb)


С уважением, Вадим
 
Alex3AДата: Четверг, 28 Январь 2010, 11:26 | Сообщение # 68
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2957
Репутация: 31
Награды: 10
Статус: Offline
Вадим, сделай загрузчик фонта в ммв и запускай его из нв :D
 
DEMBELДата: Четверг, 28 Январь 2010, 13:41 | Сообщение # 69
Наш дизайнер
Группа: Модераторы
Сообщений: 2314
Репутация: 25
Награды: 12
Статус: Offline
Quote (Alex3A)
сделай загрузчик фонта в ммв и запускай его из нв

да он разве не по тому же принципу работает?
--
как один из вариантов, попробуй сделать инсталлятор на прогу, в какой-то проге создания инсталляторов я видел установку шрифтов.
Quote (Вадим)
задача сейчас прояснилась

будем разбираться дальше потихоньку...
 
ВадимДата: Четверг, 28 Январь 2010, 15:13 | Сообщение # 70
Ветеран форума
Группа: Проверенные
Сообщений: 672
Репутация: 8
Награды: 2
Статус: Offline
Quote (Alex3A)

сделай загрузчик фонта в ммв и запускай его из нв
:D
Quote (DEMBEL)
да он разве не по тому же принципу работает?
Да, так и есть! Эта инфа мне тоже попадалась. В MMB сам принцип точно такой же - шрифт копируется во временную папку и система извещается, что туточки он, родимый. После закрытия проекта он исчезает. Только в NB это делать еще удобнее, не надо прописывать команду InstallFont, а просто галочку поставить при компиляции (есть целый раздел настроек) взять с собой "все шрифты проекта" или "только выделенные галочкой" или "никакие, винда сама распорядится" или "только шрифты не являющиеся базовыми для Windows".

С уважением, Вадим
 
Alex3AДата: Четверг, 28 Январь 2010, 15:39 | Сообщение # 71
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2957
Репутация: 31
Награды: 10
Статус: Offline
Вадим, а чего тебе надобнос...
при запуке проги фонт доступен, чего же еще?
А захламлять своими фонтами чужие компы не есть хорошо.
 
DEMBELДата: Четверг, 28 Январь 2010, 16:29 | Сообщение # 72
Наш дизайнер
Группа: Модераторы
Сообщений: 2314
Репутация: 25
Награды: 12
Статус: Offline
ну по-ходу то что шрифты/записи реестра пропадают после закрытия проги это так и должно быть.
ну а когда мы их руками копируем, то в чем дело? я сейчас лично попробовал вручную поставить калибри, и пока я не сделал это через пу->шрифты->установить... он был недоступен в программах, несмотря ни на что (возможно надо было перезагруз сделать, но не проверял).
 
mishemДата: Четверг, 28 Январь 2010, 19:49 | Сообщение # 73
Ветеран форума
Группа: Проверенные
Сообщений: 751
Репутация: 6
Награды: 2
Статус: Offline
Quote (DEMBEL)
как один из вариантов, попробуй сделать инсталлятор на прогу

DEMBEL, Я ему предложил такой вариант
Quote (Вадим)
Quote (mishem)
попробуй такую програму. Smart Install Maker

Она умеет и шрифт добавлять, и в реестре записи делать. Он отказался.

Я люблю думать что умею рисовать
 
DEMBELДата: Четверг, 28 Январь 2010, 21:05 | Сообщение # 74
Наш дизайнер
Группа: Модераторы
Сообщений: 2314
Репутация: 25
Награды: 12
Статус: Offline
Quote (DEMBEL)
он был недоступен в программах

ну я знаю почему, токо как это устранить вручную? Alex тоже уже наверное понял почему...

Добавлено (28 Январь 2010, 21:05)
---------------------------------------------
попробовал пару способов, чето не могу заставить шрифт заработать...

 
ВадимДата: Четверг, 28 Январь 2010, 21:45 | Сообщение # 75
Ветеран форума
Группа: Проверенные
Сообщений: 672
Репутация: 8
Награды: 2
Статус: Offline
Quote (Alex3A)
а чего тебе надобнос...
Шрифт почему-то не отображается в приложении на некоторых компьютерах. Скрины и описание проблемы тут.

Quote (mishem)
DEMBEL, Я ему предложил такой вариант
Smart Install Maker
Она умеет и шрифт добавлять, и в реестре записи делать. Он отказался.
Да нет, не то чтобы отказался. Совет хороший! Я знаю об этой проге, она действительно классная, судя по функциям! Давно у меня стоит, но не пользовался ни разу, да и в этот раз хотел обойтись своими силами. Ведь интересно же, в конце концов! :)

Quote (DEMBEL)
он был недоступен в программах

А чтобы проги шрифт видели надо в реестре его прописать. Или еще что-то есть?

С уважением, Вадим
 
DEMBELДата: Четверг, 28 Январь 2010, 22:30 | Сообщение # 76
Наш дизайнер
Группа: Модераторы
Сообщений: 2314
Репутация: 25
Награды: 12
Статус: Offline
Quote (Вадим)
А чтобы проги шрифт видели надо в реестре его прописать. Или еще что-то есть?

ну ПО ИДЕЕ да, в общем, нужно еще "дать знать" открытым программам в системе что доступен новый шрифт. Вот как это сделать я и думаю, вернее, думаю в этом ли проблема или нет. Возможно следует просто перезагруз сделать...
Попробуй удалить колибри(файл,реестр)->перезагрузить комп->поставить обратно ВРУЧНУЮ (и лучше не через Проводник->скопировать файл в fonts и написать в реестр)->снова перезагрузить и проверить доступен ли шрифт.
 
ВадимДата: Четверг, 28 Январь 2010, 23:20 | Сообщение # 77
Ветеран форума
Группа: Проверенные
Сообщений: 672
Репутация: 8
Награды: 2
Статус: Offline
Quote (DEMBEL)
попробовал пару способов, чето не могу заставить шрифт заработать...
Какие способы испробовал? Какие-то другие команды?

С уважением, Вадим
 
DEMBELДата: Четверг, 28 Январь 2010, 23:28 | Сообщение # 78
Наш дизайнер
Группа: Модераторы
Сообщений: 2314
Репутация: 25
Награды: 12
Статус: Offline
Quote (Вадим)
Какие-то другие команды?

да, системные кое-какие... чтобы
Quote (DEMBEL)
"дать знать" открытым программам в системе что доступен новый шрифт
но либо не пашет либо я неправильно вызываю... попробую потом еще раз. Либо вместо этого пробовать машину перезагружать как я писал выше.
 
Alex3AДата: Пятница, 29 Январь 2010, 03:47 | Сообщение # 79
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2957
Репутация: 31
Награды: 10
Статус: Offline
Шрифты это вещь щепетильная, в винде куча прибамбасов со шриффтами, есть ряд стандартных шрифтов, которые должны быть всегда. В принципе, при нарушении стандартных шрифтов, нарушается работа винды - запустил какую прогу а там фиг,
ничего то и не видно. Есть такая фича шрифт по умолчанию, это когда в проге не
указан конкретный, потом выбор размера в системных прогах. В общем дабы рьяные
юзвери не смогли поламать операционку, доступ к системной папке затруднен.
Выбрал не тот шрифт, хрен закроеш окно, или управление проги становится
недоступным. С другой стороны, множество програм использует свои собственные
шрифты, на ряду с системными, и держать их могут отдельно. Ну и конечно все
телодвижения оставляют свой след в реестре, по поиску поищите слово font,
найдете кучу веток для разных програм. Инсталироватьсвой шрифт в систему
можно стандартным методом, вы его знаете. Как более быстрая альтернатива,
можно, преварительно пошаманив, добавить в меню "отослать" папку фонт.
Добавления своего шрифта в системные не всегда приведет к тому что нужная
вам прога его увидит, у нее может быть другое место хранения шрифтов,
или в установленном вами шрифте может не оказаться нужной для этой проги
страницы, плюс всякия премудрости типа локалей и еще много разной чепухи.
Поможет ли перезагрука? Не всегда, все зависит от устройства конкретной
проги, не исключаю что могут быть и такие что не в состоянии подхватить
появившийся фонт. К примеру список фонтов для нее создается при инсталяции
и записывается в реестр, всякое бывает.
 
ВадимДата: Пятница, 29 Январь 2010, 08:36 | Сообщение # 80
Ветеран форума
Группа: Проверенные
Сообщений: 672
Репутация: 8
Награды: 2
Статус: Offline
Quote (DEMBEL)
"дать знать" открытым программам в системе что доступен новый шрифт
Это твое высказывание я немного недооценил. Респект, навел на мысль!

Quote (Alex3A)
множество программ использует свои собственные шрифты, на ряду с системными, и держать их могут отдельно
Да, и это совсем не мешает другим программам видеть этот шрифт, если о нем есть запись в реестре! И с чего я думал, что только из системной папки можно видеть? %)
Quote (Alex3A)
К примеру список фонтов для нее создается при инсталяции
и записывается в реестр, всякое бывает.
Весьма любопытно! Учтём, на будущее!

В общем, упорство в этот раз вознаградилось! :D

Проблема с установкой шрифта решена!
Мне удалось найти (собственно, они и не прятались) ДВА работающих способа контроля шрифта в проекте (ну, не считая стандартных для NB). Попробую подытожить основное нарытое по данной теме, так, чтобы народу полезнее было, в случае подобных трудностей. Поэтому опишу подробно.

КАК ПРОГРАММНО УСТАНОВИТЬ НУЖНЫЙ ПРОЕКТУ ШРИФТ В СИСТЕМУ ПОЛЬЗОВАТЕЛЯ

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

Основное решение – стандартное, в настройках проекта NB (во время компиляции проекта) проставить галочку "все шрифты…" или галочку "только эти…" (и выбрать свои используемые нестандартные шрифты).

Однако может случиться так, как случилось у меня – почему-то NB не смогла дать системе пользователя знать, что использовать нужно тот шрифт, который я прикрепил к проекту (Calibri True Type), либо она этот шрифт к проекту не прикрепила, в общем, что-то пошло не так... Выход в этом случае – установить нужный шрифт программно, наверняка.

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

Пишем код

Покажу на примере своего проекта, шрифт "Калибри" имеет 4 начертания, каждому соответствует свой файл шрифта, поэтому и в "багаж" мы сложим все 4 файла, после установки программы они окажутся в той же папке, где и исполняемый файл нашего проекта. Можно, конечно, добавить в код проверку на корректность установки шрифта, но наверное это уже лишнее. Надо все-таки доверять NB :).

Просто скопировать файл шрифта в системную папку C:\Windows\Fonts стандартными командами FileCopy или ExtractFile (или FileToVar / FileWrite через буфер обмена, с помощью глобальной переменной [Clipboard]) не получится, поскольку данная системная папка защищена - шрифт исчезнет сразу после закрытия Вашего приложения и программа просто не успеет им насладиться. Кроме того, новый шрифт становится доступным для программ только после перезагрузки системы, в противном случае проги его просто не увидят, даже если Вы шрифт скопировали и прописали в реестре.

Однако, скопировать в системную папку можно нестандартными командами. В частности это таки оказалось возможно, но с помощью команды npCopiarArchivos плагина NeoDouble Давида Эсперальты. В ниже приведенном коде не учтена проверка версии Windows, но проверить, определить платформу Windows (95, 98, ME, NT, 2000, XP) можно посредством глобальной переменной [WindowsPlatform] или командой npVersionWindows плагина NeoDouble.[/b]

После копирования с помощью этого плагина шрифт остаётся в системной папке и после закрытия приложения, а после перезагрузки компьютера становится виден всем программам (проверял на Word). Видимо копирование тут реализовано как-то иначе, "под столом", что-ли… :).

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

В соответствующей ветке реестра "параметр" – это имя шрифта, а значение – это путь до него. Если вместо абсолютного пути к файлу в значении указано просто имя файла (не путать с именем шрифта!), то подразумевается, что шрифт находится в системной папке Fonts. Именно там его программа и будет искать. А если указан абсолютный путь, то будет искать именно по этому абсолютному пути.

Пример кода:
(дает пользователю выбор – каким из двух способов устанавливать шрифт)

Code
FileExists "C:\WINDOWS\Fonts\CALIBRI.TTF" "[calibriN]"
     If "[calibriN]" "=" "False"
       MessageBox "Выберите действие" "В операционной системе Вашего компьютера не обнаружен|необходимый для работы шрифт Calibri (True Type).|Без этого шрифта программа будет отображаться неправильно.||У данного шрифта четыре вида начертания. |Возможно, программе потребуется установить все четыре.||Изменения вступят в силу только после перезагрузки компьютера.||Установить шрифт Calibri на Ваш компьютер?" "В системную папку Fonts|В папку программы Motive Power|Не в этот раз" "[InstCalibri]"
          If "[InstCalibri]" "=" "1"
            RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts\Calibri (TrueType)" "CALIBRI.TTF"
            npCopiarArchivos "[PubDir]CALIBRI.TTF" "C:\Windows\Fonts" "True"
            AlertBox "Сообщение" "Шрифт Calibri (True Type) успешно установлен!"
          EndIf
          If "[InstCalibri]" "=" "2"
            RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts\Calibri (TrueType)" "C:\Program Files\Motive Power\CALIBRI.TTF"
           AlertBox "Сообщение" "Шрифт Calibri (True Type) успешно установлен!"
          EndIf
          If "[InstCalibri]" "=" "3"
           AlertBox "Сообщение" "Программа будет работать, но многие надписи окажутся вне вашего поля зрения.||Рекомендуется установить шрифт при следующем запуске программы."
          EndIf
          If "[InstCalibri]" "=" "0"
           AlertBox "Сообщение" "Программа будет работать, но многие надписи окажутся вне вашего поля зрения.||Рекомендуется установить шрифт при следующем запуске программы."
          EndIf
      EndIf

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

Но Вы можете и определить место для копирования своего шрифта произвольно.Главное, в реестре потом не забыть указать где программам этот самый шрифт искать. Если копировать, то, по всей видимости, логичнее копировать через команду FileCopy (когда файлы идут "багажом") и командой ExtractFile (если файлы были вложенными в проект). Второй вариант не совсем удобен тем, что увеличивает вес самого исполняемого файла, а не только дистрибутива. Но всё зависит от целей. Если нужен просто экзешник, без установочной программы и файлы должны работать только вместе с проектом, то этот вариант подойдет больше первого.

Внести изменения в реестр пользователя можно и другим способом.
Этот способ может понадобиться, в случае, если программа уже установлена и Вам срочно нужно помочь исправить ситуацию без переустановки программы пользователем.
Для этого нам нужно сначала сделать файл .reg, а затем запустить его на компьютере пользователя (например, отправив рег-файл архивом ему на почту).
Чтобы создать такой reg-файл, заходим в редактор реестра (клавиши Win+R, команда regedit), находим нужный ключ и раздел реестра (для Windows выше 98-й):

Code
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
В данном разделе хранится список шрифтов зарегистрированных в Windows и пути доступа к ним. Каждый параметр представляет собой имя шрифта, а каждое значение параметра путь к файлу данного шрифта (или только название шрифта, если шрифт лежит в системной папке Fonts).

Делаем экспорт данных с раздела Fonts в реестре (для этого нажимаем по ней правой кнопкой мыши и выбираем "экспорт", выбираем место сохранения, задаем имя файлу, например, Calibri.reg и жмем ОК). Можно и вручную набрать нужное содержание этого рег-файла, но экспортом и быстрее, и мало шансов ошибиться, а ведь ошибка в одной букве может заставить Ваш компьютер удалить все программы, а затем взорваться… Шучу. Но таки, как известно, ошибаться в реестре не нужно все равно, поэтому вместо того, чтобы списывать путь в реестре - всегда копируйте его).
Далее открываем получившийся рег-файл через любой Блокнот и удаляем все лишние строки, оставив только саму шапку рег-файла, имя ключа и четыре (в моем случае) строки нужных нам параметров с их значениями. В блокноте результат в моем случае выглядит так:

Для установки в системную папку

Code
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
"Calibri (TrueType)"="CALIBRI.TTF"
"Calibri Bold (TrueType)"="CALIBRIB.TTF"
"Calibri Italic (TrueType)"="CALIBRII.TTF"
"Calibri Bold Italic (TrueType)"="CALIBRIZ.TTF"

Для регистрации шрифта в любой папке, например в папке проекта:

Code
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
"Calibri (TrueType)"=" C:\Program Files\Motive Power\CALIBRI.TTF"
"Calibri Bold (TrueType)"=" C:\Program Files\Motive Power\CALIBRIB.TTF"
"Calibri Italic (TrueType)"=" C:\Program Files\Motive Power\CALIBRII.TTF"
"Calibri Bold Italic (TrueType)"=" C:\Program Files\Motive Power\CALIBRIZ.TTF"

Теперь Вы можете, там где это нужно, запустить рег-файл вручную, программно или отправить его пользователю и попросить его запустить просто дважды щелкнув по нему и согласившись с изменениями (потому, что появится окно выбора).

Если нужно сэкономить на размере дистрибутива.
Если для Вас критичен размер проекта, а нужный файл(ы) шрифтов весит довольно много (к примеру, 4 файла Calibri весят 1,36 Мб, а это весьма заметно и для кого-то может быть критичным), то вместо того, чтобы инсталлировать шрифт можно просто управлять подстановкой шрифтов. Вы просто создаете правило, на случай, если нужного шрифта в системе нет, тогда она будет пользоваться тем шрифтом, который Вы ей определите сами (не отдавая этот выбор на волю лихого случая в геймерской машине… :D …). Для этого "химичим" точно также, но уже в этой ветке реестра:

Code
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes
Информация об альтернативных шрифтах, которые используются вместо тех которые не установлены в системе.

Программно (или рег-файлом) создаем нужные параметры со значениями, где (в данном ключе реестра - FontSubstitutes) параметр – это шрифт по умолчанию, а значение – это тот шрифт, который должен использоваться для подстановки. Например, раскрыв в редакторе реестра раздел FontSubstitutes, вы заметите, что шрифт Arial Cyr образуется из шрифта Arial с использованием таблицы преобразования 204.

Рег-файл (с именем: "вашеимя.reg") в этом случае выглядел бы так:

Code
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ FontSubstitutes]
"Arial Cyr,0"="Arial,204"

А команда записи в реестр командой NB выглядела бы так:

Code
RegistryWrite "HKEY_LOCAL_MACHINE" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes\Arial Cyr,0" " Arial,204"

В более щепетильных случаях (и, пожалуй, так будет правильнее) можно организовать сначала проверку на наличие того параметра значение которого вы собираетесь создать (или поменять, ежели оно есть). А вдруг это правило смертельно необходимо какой-то проге пользователя? Для этого логично использовать команду чтения значения реестра. И если таковой параметр уже есть (например, для этого шрифта уже правило создано) и Вы его менять не собираетесь, то можно предусмотреть для этого случая выбор другого правила. И так хоть до посинения, пока имя параметра или хотя бы его значение не окажется свободным.

ПРИМЕЧАНИЯ:

В системе Windows 98 нужные разделы реестра будут называться чуть иначе (без NT):

Code
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fon tSubstitutes

В системе Windows 95 шрифты для подстановки определяются не в Реестре, а в файле win.ini (раздел FontSubstitutes), что, в принципе, тоже самое.

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

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

Дополнительно о роли разных ключей реестра можно узнать тут (на примере Windows XP):
http://bit-bait.ucoz.ru/Reestr/reestr/right.htm

Если в папке "Шрифты" в панели управления отсутствуют в меню специфичные для неё пункты (например, "Установить новый шрифт"), то причина может быть одной из перечисленных:

* атрибут "Системный" не установлен на каталог FONTS;
* файл FONTEXT.DLL отсутствует или повреждён;
* файл DESKTOP.INI в каталоге WINDOWS\FONTS отсутствует или повреждён.

Для восстановления системного атрибута на каталоге FONTS перейдите в сеанс MS-DOS, в каталоге WINDOWS выполните команду ATTRIB FONTS +S и перезагрузите компьютер.

Для восстановления файлов FONTEXT.DLL и DESKTOP.INI их необходимо извлечь из инсталляционного комплекта с помощью программы EXTRACT.
Кстати, DESKTOP.INI – весьма интересный инструмент! С его помощью можно управлять всеми файлами в папке как определенным типом файлов и делать разные другие вещи.

hpwDllCall v1.03 - плагин обеспечивающий вызов DLL для NeoBook. Возможно, его применение позволило бы средствами самой NB (без плагинов) установить шрифт в системную директорию. Но это лишь гипотеза. Сам плагин, если кому нужно, лежит здесь:
http://www.neosoftware.com/neobook....&lid=13


С уважением, Вадим

Сообщение отредактировал Вадим - Понедельник, 01 Февраль 2010, 01:10
 
СергейДата: Пятница, 29 Январь 2010, 09:47 | Сообщение # 81
Необукер
Группа: Проверенные
Сообщений: 2236
Репутация: 23
Награды: 12
Статус: Offline
Quote (Вадим)
Сам плагин, если кому нужно, лежит здесь:
ковырял я этот плагин, у меня кроме его dll ни скакими другими неполучилось

 
ВадимДата: Пятница, 29 Январь 2010, 10:13 | Сообщение # 82
Ветеран форума
Группа: Проверенные
Сообщений: 672
Репутация: 8
Награды: 2
Статус: Offline
Quote (Сергей)
ковырял я этот плагин
А я в dll вообще пока ничего не соображаю. Просто был разговор о возможной работе с API, вот я инфу и добавил. Темный лес для меня... Но, чую, что там может быть много чего вкусного! :D

С уважением, Вадим
 
DEMBELДата: Пятница, 29 Январь 2010, 11:18 | Сообщение # 83
Наш дизайнер
Группа: Модераторы
Сообщений: 2314
Репутация: 25
Награды: 12
Статус: Offline
Quote (Вадим)
Но, чую, что там может быть много чего вкусного!

там все очень вкусное что касается всех системных функций. Но вызывать функции системных dll-библиотек можно не только через плагин, а через RunDll32. Например, вызовем функцию показа инфы о винде из shell32.dll:
rundll32 shell32.dll, ShellAboutA
Безопасное извл. устройства:
rundll32.exe shell32.dll, Control_RunDLL hotplug.dll
Таким образом доступны сотни системных функций.

Добавлено (29 Январь 2010, 11:18)
---------------------------------------------
так я не понял, ты решил проблему с установкой шрифта?

 
ВадимДата: Пятница, 29 Январь 2010, 13:04 | Сообщение # 84
Ветеран форума
Группа: Проверенные
Сообщений: 672
Репутация: 8
Награды: 2
Статус: Offline
Quote (DEMBEL)
Таким образом доступны сотни системных функций.
Правильно ли я понимаю, что их таким образом можно через Run вызвать и в NB? И где можно почитать об этом синтаксисе вызова через программу rundll32 функций библиотек? Т.е. где можно узать о том, как этим всем пользоваться? Они в каких-то своих переменных предоставляют информацию?

Quote (DEMBEL)
так я не понял, ты решил проблему с установкой шрифта?
:D :D :D Да, проблема со шрифтом полностью решена, слава богу! Поэтому я и подытожил собранные за два дня материалы и подробно описал решение для тех, кому может оно понадобиться.

Сейчас я доработал код, но по прежнему все 4 начертания устанавливаются по очереди и фиксируется факт этой установки, а пользователь может выбрать каким способом устанавливать шрифты - с копированием в системную папку или нет. Разница для него лишь в том, что при деинсталляции моей программы исчезнут и шрифты (если они находились в папке программы и были просто прописаны в реестре, а не скопированы в системную папку шрифтов). Т.е. оба варианта решения рабочие и позволяют любым программам на компьютере использовать установленный шрифт. В тексте я рассмотрел еще третье решение - через создание правила подстановки похожих шрифтов, но не проверял на практике, ибо это какая-то половинчатая мера (ну, кроме случаев особенного желания сэкономить на весе дистрибутива).

Успокаивает то, что можно контролировать шрифты жестко, без фокусов и сюрпризов.

Добавлено (29 Январь 2010, 13:04)
---------------------------------------------
Однако! У другого тестера, у моего брательника, эта проблема тоже была, и тоже решена. НО! Есть другая фишка, тоже касается шрифтов - на кнопках в проекте не отображаются надписи! Вообще. Девственно чистые плашечки, а не кнопки. Работают, что надо делают, но надписей на них нет.

Кто-нибудь сталкивался с таким???

Не успел с одним разобраться, как новый фокус...

Как будто в "свойствах экрана\оформление\дополнительно" элемент "Рельефные объекты" выставлен с белым шрифтом, но там выставлен черный, я проверил. Давал инструкции, дистанционно.


С уважением, Вадим
 
DEMBELДата: Пятница, 29 Январь 2010, 13:22 | Сообщение # 85
Наш дизайнер
Группа: Модераторы
Сообщений: 2314
Репутация: 25
Награды: 12
Статус: Offline
Quote (Вадим)
Правильно ли я понимаю, что их таким образом можно через Run вызвать и в NB?

ну да
Quote (Вадим)
И где можно почитать об этом синтаксисе вызова через программу rundll32 функций библиотек?

чтобы посмотреть функции и параметры требуется "расковырять" библиотеку, есть такие "хакерские" программки, на подобных же сайтах можно имеющуюся инфу посмотреть, но ее не так много. Ну и потом, потребуется поэкспериментировать с вызовом функции и ее параметрами чтобы получить 100% рабочий вариант, не всегда удается. А синтаксис в этом случае простой
Code
RunDll32 <.DLL>,<Функция> <Параметры>

вот например еще вариант
 
ВадимДата: Суббота, 30 Январь 2010, 05:13 | Сообщение # 86
Ветеран форума
Группа: Проверенные
Сообщений: 672
Репутация: 8
Награды: 2
Статус: Offline
Quote (DEMBEL)
вот например еще вариант
Да, я на эту тему обратил внимание, после твоего поста (и благодаря Информеру, слава Диме энд Юре!). Заинтересовало. И в сети попадалось. Мне кажется это тоже очень перспективная тема, для расширения возможностей NB. Но мне пока существующих хватает, поэтому шибко не вбуривался в тему установки чего либо через файл *.inf
А вообще тема хорошая! Спасибо! Надо мне Windows поизучать, а то все как-то кусками, то там, то сям... Вот эта прога, rundll32, например, в книге "Недокументированные и малоизвестные возможности Windows XP" называется гениальной программой и почти забытой самими программистами Microsoft. В общем, матчасть, матчасть...

Добавлено (30 Январь 2010, 05:13)
---------------------------------------------
Обсуждение проблемы отображения надписей на кнопках перенес в новую тему, поскольку тема эта не про шрифт, а, скорее, про объекты вообще (поскольку у тестера не отобразился еще и один чек-бокс, на что я не сразу обратил внимание). И, кроме того, шрифт на кнопках все равно должен быть системным, если я правильно понимаю.


С уважением, Вадим
 
Форум MMB » Всё о программе Neo Book » Вопросы и ответы по NB » Проблема со шрифтами
Страница 3 из 3«123
Поиск: