Склонение по падежам в Дельфи
Библиотека Morpher.dll служит для склонения фамилий, имен и отчеств, а также наименований должностей, отделов,
организаций и практически всего, что склоняется в русском языке (подробнее о технологии склонения).
Подключить функции склонения к вашей программе на Дельфи очень просто – достаточно
поместить библиотеку Morpher.dll в рабочий каталог программы, подключить модуль Morpher.pas
и в вашем распоряжении окажется функция склонения Inflect:
ShowMessage (Inflect ('Иванов Иван Иванович', pTvor));
В модуле Morpher.pas определены константы с номерами падежей:
type
TPadeg = (pImen = 1, //Именительный (кто? что?)
pRod = 2, //Родительный (кого? чего?)
pDat = 3, //Дательный (кому? чему?)
pVin = 4, //Винительный (кого? что?)
pTvor = 5, //Творительный (кем? чем?)
pPred = 6, //Предложный (о ком? о чем?) без предлога
pPredO = 7, //Предложный (о ком? о чем?) с предлогом О/ОБ/ОБО
pPredV = 8 //Местный (где?) с предлогом В/НА
);
А также другие константы – параметры функции Inflect. Например, если вы хотите, чтобы имя любовь склонялось как любови
(даже если оно написано с маленькой буквы), то подскажите модулю склонения, что это ФИО, а не нарицательное:
ShowMessage (Inflect ('любовь', pRod, false, [fFio]));
Использование библиотеки иллюстрирует тестовый пример на Дельфи:
Пример включает в себя модуль Morpher.pas, служащий оберткой для функций, экспортируемых библиотекой.
Вот перечень функций модуля:
Inflect – функция склонения по падежам и числам
function Inflect (
s: WideString; // строка для склонения
padeg: TPadeg; // требуемый падеж
plural: Boolean = false; // true, если требуется множественное число
flags: TFlags = [] // дополнительные указания (см. TFlags)
): TResult; // строка в нужном падеже и числе и код ошибки
TResult
имеет следующий вид:
TResult = record
Text : WideString;
ErrorCode : Integer;
end;
Возможные коды ошибок:
-2 | Строка для склонения пустая. |
-3 | В строке для склонения не найдено русских слов. |
-4 | Слово уже во множественном числе. |
-5 | Слово не имеет множественного числа. |
-6 | Неправильное значение параметра "падеж". Допустимые значения: 1..8. |
-17 | Слово не имеет нужной формы. |
В случае, если ErrorCode < 0
, поле Text содержит сообщение об ошибке.
GetGender – функция определения рода (пола)
function GetGender (
s: WideString;
flags: TFlags = []
): TGender;
Где TGender определен как:
TGender = (gMuzh = 0, // мужской род
gZhen = 1, // женский род
gSred = 2, // средний род
gMnog = 3 // множественное число
);
В случае неудачи результат, преобразованный к SmallInt, дает код ошибки. Возможные коды ошибок:
-2 | Строка для склонения пустая. |
-3 | В строке для склонения не найдено русских слов. |
Получить сообщение об ошибке можно с помощью функции GetErrorMessage:
function GetErrorMessage (errorCode : Integer) : PWideChar;
Функция Spell – пропись чисел и денежных сумм
function Spell (
Num : double; // число / сумма
Unit_ : WideString; // единица измерения (рубль, метр, календарный день)
padeg : TPadeg = pImen // падеж
): TResult; // результат
Возможные коды ошибок:
-2 | Строка для склонения (единица измерения) пустая. |
-3 | В строке для склонения не найдено русских слов. |
-7 | Неправильное значение параметра "падеж". Допустимые значения: 1..6. |
-14 | Число слишком большое. Допустимо не более 30 цифр перед запятой. |
-15 | Число слишком маленькое. Допустимо не более 30 цифр после запятой. |
-16 | Слишком много цифр после запятой в денежной сумме. Обычно допустимо не более двух цифр после запятой, а для белорусских рублей сумма должна быть целой. |
-17 | Слово не имеет нужной формы. |
Для денежных единиц функция Spell выдает строку следующего формата:
Сто двадцать три тысячи четыреста пятьдесят шесть рублей 00 копеек
Для остальных единиц измерения формат выдачи такой:
21 (Двадцать один) календарный день
Функция Unlock
Каждый экземпляр библиотеки имеет свой защитный код. Перед вызовом функций библиотеки нужно сначала вызвать функцию Unlock и передать ей код.
Иначе библиотека вызовет сбой программы.
Пример вызова функции Unlock есть в тестовом примере. Ваш код вы получите вместе с библиотекой.
Технические характеристики библиотеки
Поддерживаемые версии Дельфи: Delphi 2009 и выше.
Работоспособность библиотеки и тестового примера проверялась на следующих версиях Дельфи:
- Delphi 2009 (12.2)
- Delphi XE3 (14.6)
- Delphi XE7
Библиотека не имеет зависимостей кроме KERNEL32.DLL.
Библиотека полностью потокобезопасна, т.е. пригодна для использования в многопоточных приложениях.
Для установки не требуется регистрация библиотеки в системном реестре.
Возможные проблемы и способы их решения
Проблема: При запуске программы возникает ошибка: "Приложение Morper.dll не является образом программы для Windows NT."
Решение: Эта ошибка возникает, когда разрядность вашего приложения не совпадает с разрядностью библиотеки.
Используйте версию библиотеки (32 или 64 бита), разрядность которой совпадает с разрядностью вашего приложения.
Проблема: При нажатии на кнопку Просклонять в тестовом примере возникает ошибка: "Access violation at address 0F6469D0 in module Morpher.dll. Read of address 00000000."
Решение: Укажите в вызове функции Unlock ваш лицензионный код.
История изменений
Дата |
Версия |
Описание |
26.04.2015 |
2.0.0 |
В данном релизе API библиотеки сильно поменялся, утратив обратную совместимость:
-
Функции, возвращающие строку (Inflect и Spell), раньше возвращали ее через параметр-указатель (PWideChar).
При этом вызывающая функция должна была обеспечить достаточное место под результат.
Для определения того, сколько места будет достаточно, использовались различные эмпирики вроде
"поделить длину входной строки на 3 и прибавить на всякий случай 5".
Для функции Spell эмпирика получалось уж очень сложной и неочевидной, поэтому было решено отказаться от
данного подхода в пользу следующего: память под выходную строку выделяет вызываемая функция, а вызывающая,
получив значение, вызывает дополнительно функцию FreeStr, которая освобождает память.
Было решено заодно переделать по новому образцу и функцию Inflect.
- Функция Inflect раньше возвращала Integer - автоматически определенный род или код ошибки.
Так как теперь она возвращает строку, определение рода взяла на себя новая функция GetGender.
-
Функция SpellNumber упразднена и заменена более универсальной функцией Spell, которая строит пропись
не только чисел, но и денежных единиц (функция "сумма прописью").
При этом API модуля-обертки Morpher.pas изменился не так значительно и в некоторых случаях обратная совместимость была сохранена:
- Функция Morpher.Inflect потеряла перегрузку с дополнительным параметром
var rod: TGender .
Определением рода теперь занимается функция GetGender.
-
Функция Morpher.Inflect раньше в качестве признака ошибки возвращала пустую строку, теперь - сообщение об ошибке.
Учитывая то, как редко программисты проверяют возвращаемые значения на признак ошибки, это скорее плюс.
|
04.03.2015 |
1.3.2 |
Исправлена ошибка в функции SpellNumber. Ошибка проявлялась для сумм с числом копеек 0x. В результате выдавалось x0 копеек вместо 0x."
|
17.08.2014 |
1.3.0 |
Исправлена ошибка в прописи чисел вида ... x1y abc, где x=1..9, y=1..4, abc - любые 3 цифры, а ... - любая последовательность цифр, в т.ч. нулевой длины.
Пример числа: 311 000. Ошибка проявлялась только в родительном падеже (трёхсот одиннадцати ТЫСЯЧИ вместо трёхсот одиннадцати ТЫСЯЧ).
|
07.05.2014 |
1.2.2 |
Пополнение словаря.
|
20.12.2013 |
1.2.0 |
Исправлена ошибка, при которой в некоторых случаях не учитывался указанный пользователем пол.
Например, указание одной фамилии Гецик и женского пола приводило к неправильному склонению этой фамилии.
|