morpher.ru 8 (499) 647 86 54
nowhere@morpher.ru
 
 

Склонение по падежам в Дельфи

Библиотека 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 ваш лицензионный код.

История изменений

Дата Версия Описание
20.12.2013 1.2.0 Исправлена ошибка, при которой в некоторых случаях не учитывался указанный пользователем пол. Например, указание одной фамилии Гецик и женского пола приводило к неправильному склонению этой фамилии.
07.05.2014 1.2.2 Пополнение словаря.
17.08.2014 1.3.0 Исправлена ошибка в прописи чисел вида ... x1y abc, где x=1..9, y=1..4, abc - любые 3 цифры, а ... - любая последовательность цифр, в т.ч. нулевой длины. Пример числа: 311 000. Ошибка проявлялась только в родительном падеже (трёхсот одиннадцати ТЫСЯЧИ вместо трёхсот одиннадцати ТЫСЯЧ).
04.03.2015 1.3.2 Исправлена ошибка в функции SpellNumber. Ошибка проявлялась для сумм с числом копеек 0x. В результате выдавалось x0 копеек вместо 0x."
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 раньше в качестве признака ошибки возвращала пустую строку, теперь - сообщение об ошибке. Учитывая то, как редко программисты проверяют возвращаемые значения на признак ошибки, это скорее плюс.

Комментарии

Максим 20.06.2016 14:25 UTC

При обращении к сервису из Delphi (через компонент-клиент http) получаю результат

<error>
5
<message>
</message>
</error>

Что это значит? Для запроса использую следующий Url
http://api.morpher.ru/webservice.asmx/GetXml?s=слово



Сергей Слепов 20.06.2016 20:12 UTC

Код ошибки 5 означает "Не найдено русских слов" (Список кодов ошибок). Скорее всего, вы не закодировали запрос при помощи URL Encode.



Добавить комментарий


 

Библиотеки

Заметили опечатку? Выделите слово мышкой и нажмите Ctrl-Enter. Система Orphus

© Сергей Слепов, 2003 - 2017. Перепечатка материалов сайта только с разрешения автора.