morpher.ru +7 (925) 336 9960
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 ваш лицензионный код.

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

Дата Версия Описание
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 Исправлена ошибка, при которой в некоторых случаях не учитывался указанный пользователем пол. Например, указание одной фамилии Гецик и женского пола приводило к неправильному склонению этой фамилии.


 

Библиотеки

© Сергей Слепов, 2003 - 2024.