TLanguages в C++Builder (исходники)Источник: CPPBUILDER Тарас Сорока
Модуль Sysutils.hpp богат на различные полезные и удобные функции и классы. Этот модуль, пожалуй, одна из наиболее удавшихся Borland и полезных в работе программиста на C++Builder вещей. Однако, как показывает опыт общения с разработчиками, многим из них известно в этом модуле далеко не все. Так давайте восполним пробелы и рассмотрим малоизвестный класс TLanguages. Говоря откровенно, данный класс может пригодиться в работе отнюдь не всем (если не сказать, немногим) разработчикам, что, однако, никак не противоречит тому, что об этом классе надо знать, благо это знание не обременит. Класс TLanguages предназначен для получения списка локалей, доступных в системе. Сразу надо оговориться, что "локаль" (locale) и "раскладка клавиатуры" (keyboard layout) - вещи разные и не взаимозаменяемые. Понятие "локаль" шире понятия "раскладка клавиатуры", и включает в себя собственно раскладку клавиатуры, а так же, кроме нее, настройки даты, времени, десятичного разделителя, денежного знака и еще ряд других специальных параметров. Так вот, TLanguages получает именно список доступных локалей. Данная информация берется непосредственно из операционной системы. TLanguages унаследован непосредственно от TObject и имеет следующие свойства:
Свойство Count представляет собой количество доступных локалей. Свойство Ext представляет собой индексированное свойство для получения стандартного трехбуквенного расширения для локали. Для английского языка (американского), например, расширение будет представлять собой сочетание"ENU", для русского "RUS", для итальянского "ITA", и так далее… Свойство ID представляет собой индексированное свойство для получения идентификатора локали в виде строки. Свойство LocaleID представляет собой индексированное свойство для получения идентификатора локали в виде целого числа. Свойство Name - это, опять же, индексированное свойство, возвращающее стандартное имя Windows для локали. Свойства NameFromLCID и NameFromLocaleID менее полезны, но тоже интересны. NameFromLCID предназначено для получения имени локали по строковому представлению ее идентификатора (это то, что мы получаем, читая свойство ID). NameFromLocaleID - делает то же, что и NameFromLCID, но для числового идентификатора локали (это то, что мы получаем, читая свойство LocaleID). Обратите внимание, что все свойства класса TLanguages имеют доступ только для чтения (read-only). Так же обратите внимание .что все свойства, за исключением NameFromLCID и NameFromLocaleID, являются индексированными. Теперь о методах. За исключением конструктора и деструктора, у TLanguages всего лишь один метод: IndexOf. Он возвращает индекс локали по ее идентификатору. То есть, предположим, что итальянская локаль перечислена третьей в TLanguages. Тогда вызов:
вернет 2. (индексация начинается с нуля, об этом не забываем). При ненахождении локали с указанным числовым идентификатором метод IndexOf вернет -1. Перед, собственно. написанием кода осталось сказать последнее: нет необходимости создавать экземпляр TLanguages через оператор new. Для этого есть специальная функция, Languages(), также объявленная в Sysutils.hpp и возвращающая указатель на объект TLanguages. Теперь попробуем применить полученные знания на практике. Создайте тестовый проект в C++Builder примрно следующего вида:
Рисунок 1. Тестовый проект для TLanguages. Запустите проект и нажмите кнопку "Старт". Вот то, что у вас должно получиться:
Рисунок 2. Запущенный проект. Теперь разберемся, как это сделано. Обработчик события OnClick кнопки StartButton представляет собой следующее:
Для вывода информации о локалях мы используем TreeView как наиболее подходящий для этой цели компонент. И в цикле
добавляем в список новый элемент, в который, в свою очередь, добавляем всю информацию о локалях. Строка
добавляет новый элемент в TreeView. Строка
формирует содержимое колонки "Ext" в TreeView: заносит в новый элемент списка трехбуквенное расширение локали. Строка
формирует содержимое колонки "ID" в TreeView: заносит в новый элемент списка строковый идентификатор локали. Строка
формирует содержимое колонки "LocaleID" в TreeView: заносит в новый элемент списка числовой идентификатор локали. Обратите внимание, что строковый идентификатор представлен в шестнадцатеричном виде, а числовой - в десятичном. Для представления числового идентификатора также в шестнадцатеричном виде строку
надо заменить на
И, наконец, последняя строка в цикле
заполняет четвертую колонку, "Name", названием данной локали, занося данное название в новый элемент списка. Вот, собственно, и все, что надо знать о классе TLanguages. Как говорится: "простенько, и со вкусом", ибо незачем изобретать велосипед там, где он уже изобретен ранее. Теперь, по крайней мере, когда вам понадобится получить список локалей и краткую информацию о них, вы сделаете это за несколько минут. |