Главная » C++, C++ Builder » Работа с ресурсами в CBuilder

0

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

В данной главе мы рассмотрим несколько других вариантов использования ресурсов в вашем приложении. Что такое ресурс? В основном это данные, связанные с вашим приложением. Ресурсы не могут непосредственно содержать код, но могут  содержать   информацию, используемую кодом вашего приложения. Примером ресурсов могут служить строки текста, меню и растровые рисунки (bitmaps). Эта информация передается вместе с вашим исполняемым файлом или может храниться в динамически загружаемой библиотеке (DLL).

Мы исследуем некоторые менее известные варианты использования ресурсов. Мы построим библиотеку DLL, состоящую только из ресурсов, в CBuilder и другой среде разработки (в данном случае Visual C++) и покажем, как загружать из нее информацию во время работы программы.

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

Само собой, вы научитесь создавать файлы ресурсов. Хотя в основном вы будете строить файлы ресурсов с помощью программы Borland Resource Workshop (поставляется с Borland  C++)  или другой (например, Resource Editor в Visual C++), вы также можете построить полностью функциональный ресурс сами, набирая текст вручную. Это все не так страшно, как звучит, и скоро вы научитесь это делать.

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

Зачем нужны ресурсы?

Вероятно, первый вопрос, который у вас возник, — зачем нам использовать ресурсы? В конце концов, CBuilder сам загружает свои данные из ресурса, зачем же подменять собой систему и пытаться ее переиграть по ее правилам? Ответ в том, что ресурсы можно использовать  более широко, чем это делает CBuilder. CBuilder хранит данные статически в файлах ресурсов. Вы же можете держать данные в ресурсе, а затем получать их во время работы, основываясь на каком-то своем критерии. Вы даже можете изменять вид меток статического текста, основываясь на данных из ресурса.

Зачем вам может понадобиться что-либо подобное? Одним словом — для интернационализации . Возможность хранить информацию для каждого языка отдельно в таблицах строк в ресурсном файле является лучшей альтернативой хранению отдельных таблиц для каждого языка. Это будет все более и более важно, так как программное обеспечение становится все более глобальным. Вам придется думать о том, как версии вашей программы будут работать не только  в  Америке  и Англии, но также и во Франции, Испании, Германии, Израиле, России и многих других странах.

Чтобы не сойти с ума в такой ситуации, лучше всего иметь одну общую версию программы.

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

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

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

Единственный способ удовлетворить нужды всех трех групп — использовать ресурсы. Единственная альтернатива — поставлять три разных программных продукта или же держать в программе так много логического кода, определяющего группу, что она станет  «поперек  себя шире». Давайте рассмотрим, как же вы можете использовать ресурсы для решения своих задач более простым способом, чем переписывание одного и того же кода три раза с различными вариациями.

Строковые ресурсы

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

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

Вот в чем заключается концепция строковых ресурсов. Они хранятся или в программе, в которой

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

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии