Проверка правописания delphi

You can use Aspell (Win32 version: http://aspell.net/win32/).

In your Delphi project you could use the command line pipe interface: aspell pipe:

C:ProgrammeAspellbin>aspell pipe
@(#) International Ispell Version 3.1.20 (but really Aspell 0.50.3)

hello
*

world
*

helllo
& helllo 18 0: hello, Helli, hell lo, hell-lo, hell, Heall, hallo, he'll, hullo,  Heller, heller, hellos, Jello, jello, Halli, Holli, hallow, hollow

wourld
& wourld 12 0: world, would, wold, whorled, wield, weld, wild, wooled, whirled, worlds, woulds, word

A customer would like it if a spellings checker is added to an existing Delphi application. The texts that need to be checked are in multiple memo fields and the language is Dutch, which tends to limit my options.
So, what are my options for adding a dutch spellings checker to a Delphi/WIN32 application?

(Preferably something not webbased because the client has no direct Internet connection.)

It doesn’t have to be free! The customer will pay if it’s possible. :-)

Addictive Software offers an option, but I prefer to have more alternatives.

asked Jan 21, 2011 at 11:57

Wim ten Brink's user avatar

Wim ten BrinkWim ten Brink

25.8k20 gold badges80 silver badges147 bronze badges

2

I use Addict, lots of languages (including Dutch) and good support:
AddictiveSoftware.com

answered Jan 21, 2011 at 12:07

Holgerwa's user avatar

HolgerwaHolgerwa

3,4209 gold badges42 silver badges50 bronze badges

Addictive software, as mentioned above, is one of the main ones.

But the TRichView component includes parsers for several spell-checkers that work out with Delphi. Check out their list and links that include:

  • Addict 3 and 4 by Addictive Software (shareware VCL component)
  • HunSpell by László Németh (DLL, open source)
  • ExpressSpellChecker by Developer Express Inc. (commercial VCL component)
  • EDSSpell 7 by OneDomain (shareware VCL component)
  • ASpell by Kevin Atkinson (DLL, license: LGPL)
  • VSSpell 8.0 by ComponentOne LLC (shareware ActiveX, discontinued)
  • VSSpell 3.0 by Visual Components, Inc (shipped with some versions of Delphi, ActiveX)
  • LS Speller by Luzius Schneider (based on former work of Alexander Obukhov) (freeware, uses ISpell and MS Office spell checkers (via CSAPI)).
  • Polar SpellChecker Component by Polar (shareware ActiveX)

answered Jan 22, 2011 at 2:56

lkessler's user avatar

lkesslerlkessler

19.8k36 gold badges132 silver badges202 bronze badges

1

Jedi JVCL library has a JvSpellChecker component with a demo (in jvclexamplesJvSpellChecker fodler)

Alternate option using MS Word:
Spell Checking from Delphi code using MS Word — Office Automation in Delphi
http://delphi.about.com/od/kbcontrolole/ss/word_automation.htm

answered Jan 21, 2011 at 12:25

TridenT's user avatar

TridenTTridenT

4,8791 gold badge31 silver badges56 bronze badges

Студворк — интернет-сервис помощи студентам

Пожалуйста, помогите! Как лучше организовать проверку набранного в программе, написанной на Delphi, текста?

Мне нужно написать текстовый редактор, с возможностью проверки орфографии набранного в нем текста(редактор написать могу, но проблема с проверкой орфографии).

Учусь на программного инженера, на 1-м курсе и проходим пока что Pascal, да и то, только работу со строками и файлами проходим.
А нужно меньше чем за 2 месяца написать вон ту программку, о которой говорил выше=(

Перечитал море информации по поводу проверки орфографии, но даже если и нахожу где-то путевое, то примеров, как написать, нету.

Хотелось бы сделать проверку, не используя Word, но похоже это тяжело.

Может можно как-то быстро сравнивать введенный в программу текст с базой слов, хранящейся в .dll ?

Ну или пусть будет с использованием Word, но мне все равно нужны четкие примеры в картинках или видео-уроках.
Так как я сам не осилю за полтора месяца во всем этом разобраться, да еще и в учебное время(

Проще говоря, буду очень признателен, если кто-то поделится хорошей информацией и примерами по этому поводу!) Спасибо!

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Пока собираюсь с мыслями по поводу написания одной большой статьи про использование Ribbon Controls решил между делом поразбираться с API Яндекс.Спеллера в Delphi.

Во-первых, следует объяснить тем, кто не в курсе, что это за API.

Яндекс.Спеллер – это сервис проверки правописания, который помогает находить и исправлять орфографические ошибки. Работа сервиса основана на использовании орфографических словарей для трех языков — русского, украинского и английского.

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

В целом, работа с API Яндекса никогда не вызывали, по крайней мере у меня, особых осложнений. В основном вся работа основывается на работе с двумя-тремя методами, у которых пара-тройка входных параметров. Самое «сложное» — это правильно разобрать ответ сервера.

Судя по тому, что написано в документации к Яндекс.Спеллеру, для нас наиболее важно научиться использовать метод checkText.. Его мы сегодня и рассмотрим.

Метод checkText Яндекс.Спеллера

Метод проверяет орфографию в указанном отрывке текста. Для использования метода допустимо использовать как GET так и POST запросы. При этом размер передаваемого текста в POST-запросе не должен превышать 10000 символов.

Чтобы лишний раз не копипастить документацию я просто приведу ссылку на описание метода.  Судя по тому, что сказано в документации, наша работа с сервисом будет состоять из двух частей:

  1. Отправка POST-запроса с текстом для проверки
  2. Получение ответа и парсинг XML.

Для работы нам понадобиться совсем немного модулей: SysUtils, Classes,  XMLIntf,xmldom, XMLDoc;

Ну и для отправки запросов я использовал httpsend из библиотеки synapce. Вы, если хотите, можете использовать тот же IdHTTP из Indy.

Первое, что делаем — это объявляем все константы, которые могут потребоваться нам для работы, а именно:

  • Коды ошибок Яндекс.Спеллера
  • Константы настроек Яндекс.Спеллера
  • Ну и, чтобы вообще было хорошо — создадим несколько ресурсных строк для описания ошибок

У меня получилось следующее:

resourcestring
  rcERROR_TEXT_LENGTH = 'Общая длина передаваемого текста превышает 10000 символов!';
  rcERROR_UNKNOWN_WORD = 'Слова нет в словаре';
  rcERROR_REPEAT_WORD = 'Повтор слова';
  rcERROR_CAPITALIZATION = 'Неверное употребление прописных и строчных букв';
  rcERROR_TOO_MANY_ERRORS = 'Текст содержит слишком много ошибок';
 
const
  IGNORE_UPPERCASE = 1;
  IGNORE_DIGITS = 2;
  IGNORE_URLS = 4;
  FIND_REPEAT_WORDS = 8;
  IGNORE_LATIN = 16;
  NO_SUGGEST = 32;
  FLAG_LATIN = 128;
 
  ERROR_UNKNOWN_WORD = 1;
  ERROR_REPEAT_WORD = 2;
  ERROR_CAPITALIZATION = 3;
  ERROR_TOO_MANY_ERRORS = 4;

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

type
TBadWord = record
  Word: string;//слово с ошибкой
  ErrCode: integer;//код ошибки
  ErrMsg : string;//описание ошибки
  Pos:integer;//позиция слова с ошибкой (отсчет от 0);
  Row:integer;//номер строки (отсчет от 0)
  Col:integer;//номер столбца (отсчет от 0);
  Len:integer;//длина слова с ошибкой
  Variants: TStringList; //варианты правильного написания
end;

И ещё пару типов

type
  TBadWords = array of TBadWord;
type
  TTextFormat = (tfPlain, tfHTML);

Теперь можно отправлять данные на сервер и анализировать ответ. Для этого я создал такую функцию:

function CheckGrammar(const aText:string; Options:integer=0;lang:string='ru,en';format:TTextFormat=tfPlain):TBadWords;
 
implementation
 
function CheckGrammar(const aText:string; Options:integer;lang:string;format:TTextFormat):TBadWords;
var Query: TStringStream;
  Doc: IXMLDocument;
  List,Variant: IDOMNodeList;
  i,j:integer;
begin
try
  Query:=TStringStream.Create('');
  Query.WriteString('text='+aText+'?='+lang+'&options='+inttostr(Options));
  case format of
    tfPlain: Query.WriteString('&format=plain&ie=1251');
    tfHTML:  Query.WriteString('&format=html&ie=1251');
  end;
  if Length(Query.DataString)>10000 then
    raise Exception.Create(rcERROR_TEXT_LENGTH);
  with THTTPSend.Create do
    begin
       Document.LoadFromStream(Query);
       MimeType:='application/x-www-form-urlencoded';
       if HTTPMethod('POST','http://speller.yandex.net/services/spellservice/checkText') then
         begin
           Doc:=NewXMLDocument();
           Doc.LoadFromStream(Document);
           List:=Doc.DOMDocument.getElementsByTagName('error');//получаем список ошибок
           SetLength(Result,List.Length);//устанавливаем длину массива
           for i:=0 to List.length-1 do
             begin
               //запоминаем атрибуты ошибки
               with List.item[i] do
                 begin
                   Result[i].ErrCode:=StrToInt(attributes.getNamedItem('code').nodeValue);
                   Result[i].Pos:=StrToInt(attributes.getNamedItem('pos').nodeValue);
                   Result[i].Row:=StrToInt(attributes.getNamedItem('row').nodeValue);
                   Result[i].Col:=StrToInt(attributes.getNamedItem('col').nodeValue);
                   Result[i].Len:=StrToInt(attributes.getNamedItem('len').nodeValue);
                 end;
                case Result[i].ErrCode of
                  ERROR_UNKNOWN_WORD:Result[i].ErrMsg:=rcERROR_UNKNOWN_WORD;
                  ERROR_REPEAT_WORD:Result[i].ErrMsg:=rcERROR_REPEAT_WORD;
                  ERROR_CAPITALIZATION:Result[i].ErrMsg:=rcERROR_CAPITALIZATION;
                  ERROR_TOO_MANY_ERRORS:Result[i].ErrMsg:=rcERROR_TOO_MANY_ERRORS;
                end;
//читаем дочерние элементы
               Variant:=List.item[i].childNodes;
               Result[i].Word:=(List.item[i].firstChild as IDOMNodeEx).text;
               Result[i].Variants:=TStringList.Create;
               for j:=1 to Variant.length-1 do //оставшиеся дочерние узлы - варианты
                 Result[i].Variants.Add((Variant.item[j]as IDOMNodeEx).text);
             end;
   end;
end;
finally
FreeAndNil(Query);
end;
end;

Разберемся, что здесь происходит. Вначале создается тело нашего POST-запроса в зависимости от входных параметров. При этом, обратите внимание на последний необязательный параметр: ie=1251. Можно было бы обойтись и без него, но для этого необходимо переводить наш параметр aText в кодировку utf-8.

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

MimeType:='application/x-www-form-urlencoded';

Определяет заголовок (Headers) Content-Type. Если не использовать заголовок или использовать другое его значение — сервис вернет нам ошибку «Unrecognized Content Type … «. Отправляем запрос и анализируем XML-документ.

Анализ как таковой проводится элементарно:

  1. Получаем список всех узлов error — размер списка и будет размером массива, который возвращает функция
  2. Далее проходим по порядку по каждому из узлов списка (цикл по i) и читаем все атрибуты попутно занося в элемент массива описание ошибки в зависимости от значения атрибута code.
  3. Получаем для каждого узла List.item[i] список дочерних узлов.
  4. Исходя из описания API первым дочерним узлом всегда является слово с ошибкой — читаем первый дочерний узел и заносим его значение в поле Word
  5. Остальные дочерние узлы (если они имеются) — это варианты правильного написания слова. Создаем цикл по j и читаем значения оставшихся узлов.

Вот и все. Остается продемонстрировать работу функции на примере. Использовать можно, например так:

CheckGrammar('синхрафазатрон в дубне', 5);

При этом проверка будет проходить с использованием опций: IGNORE_UPPERCASE и IGNORE_URLS.

Можно вызвать метод и так:

CheckGrammar('синхрафазатрон в дубне', IGNORE_UPPERCASE+ IGNORE_URLS, 'ru');

Так будет проверяться только русский текст, опять же используя опции из предыдущего примера.

0
0
голоса

Рейтинг статьи

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Проверка орфографии из кода Delphi с использованием MS Word - автоматизация делопроизводства в Delphi - Наука

Проверка орфографии из кода Delphi с использованием MS Word — автоматизация делопроизводства в Delphi — Наука

Содержание

  • Что такое (OLE) автоматизация? Что такое сервер автоматизации? Что такое клиент автоматизации?
  • OLE Automation
  • Подключение к Word: «Привет, слово» Раннее связывание или Позднее связывание
  • Delphi> = 5 — Серверные компоненты Office XX
  • Delphi 3,4 — Раннее связывание
  • Delphi 2 — Позднее связывание
  • Запуск (Автоматизация) Word Silently
  • «Легкий» путь
  • Проект проверки правописания — TWordApplication, TWordDocument
  • TWordApplication, TWordDocument
  • Проект проверки правописания — Проверка правописания / замена
  • Наконец: исходный код Delphi
  • Тезаурус? Тезаурус!

Что такое (OLE) автоматизация? Что такое сервер автоматизации? Что такое клиент автоматизации?

Предположим, вы разрабатываете редактор HTML, например HTML Kit. Как и в любом другом текстовом редакторе, ваше приложение должно содержать какую-то систему проверки орфографии. Зачем покупать компоненты для проверки орфографии или писать их с нуля, если вы легко можете использовать MS Word?

OLE Automation

одно приложение может контролировать другоеклиент автоматизациисервер автоматизации

Автоматизация (также известная как OLE Automation) — это функция, которую программы используют для предоставления своих объектов инструментам разработки, языкам макросов и другим программам, поддерживающим автоматизацию. Например, Microsoft Outlook может предоставлять объекты для отправки и получения электронной почты, для планирования, а также для управления контактами и задачами.

Используя Word Automation (сервер), мы можем использовать Delphi (клиент) для динамического создания нового документа, добавить текст, который мы хотим проверять правописание, и затем Word проверяет правописание. Если мы будем минимизировать Microsoft Word, наши пользователи могут никогда не узнать! Благодаря OLE-интерфейсу Microsoft Word, мы можем немного отойти от Delphi и найти способы обмана при разработке нашей версии редактора Блокнота :)

Есть только один глюк;) Пользователям приложения необходимо установить Word. Но не позволяй этому остановить тебя.

Конечно, чтобы полностью освоить использование автоматизации в ваших приложениях, вы должны иметь подробные рабочие знания о приложениях, которые вы интегрируете — в данном случае MS Word.

Чтобы ваши «офисные» программы работали, пользователь должен владеть приложением, которое действует как сервер автоматизации. В нашем случае MS Word должен быть установлен на компьютере пользователя.

Подключение к Word: «Привет, слово» Раннее связывание или Позднее связывание

Есть несколько основных шагов и три основных способа автоматизации Word из Delphi.

Delphi> = 5 — Серверные компоненты Office XX

TWordApplicationTWordDocument

Delphi 3,4 — Раннее связывание

Библиотеки типов

Чтобы использовать библиотеку типов Word в Delphi (версия 3 или 4), выберите Project | Импортируйте библиотеку типов… и выберите файл msword8.olb, расположенный в каталоге «Office» Microsoft Office.Это создаст файл «Word_TLB.pas», который является переводом паскаля объекта библиотеки типов. Включают Word_TLB в списке использований любого модуля, который будет обращаться к свойствам или методам Word. Ссылка на методы Word с использованием библиотеки типов называется раннее связывание.

Delphi 2 — Позднее связывание

Позднее связывание

следует избегать, если это возможно, поскольку использовать библиотеки типов гораздо проще и быстрее — компилятор помогает, отлавливая ошибки в исходном коде. При использовании позднего связывания Word объявляется как переменная типа Variant. Это, в частности, означает, что для вызова методов и доступа к свойствам вы должны знать, что они из себя представляют.

Запуск (Автоматизация) Word Silently

В примере в этой статье будут использоваться «серверные» компоненты, поставляемые с Delphi. Если у вас есть более ранняя версия Delphi, я предлагаю вам использовать раннее связывание с библиотекой типов Word.

использования Word_TLB; ... вар WordApp: _Application; WordDoc: _Document; VarFalse: OleVariant; начать WordApp: = CoApplication.Create; WordDoc: = WordApp.Documents.Add (EmptyParam, EmptyParam); {код проверки орфографии, как описано далее в этой статье} VarFalse: = False; WordApp.Quit (VarFalse, EmptyParam, EmptyParam); конец; необязательные параметры EmptyParam

Для автоматизации Word с помощью переменной Variant (позднее связывание) используйте этот код:

использования ComObj; ... вар WordApp, WordDoc: вариант; начать WordApp: = CreateOleObject ('Word.Application'); WordDoc: = WordApp.Documents.Add; {код проверки орфографии, как описано далее в этой статье} WordApp.Quit (False) конец;

«Легкий» путь

перегрузки

Эти методы и определяет несколько версий с различным количеством параметров.

Проект проверки правописания - TWordApplication, TWordDocument

Для создания проекта проверки орфографии нам понадобятся две формы: одна используется для редактирования текста, а другая - для просмотра предложений по написанию ... но давайте пойдем с самого начала.

Запустите Delphi. Создайте новый проект с одной пустой формой (по умолчанию form1). Это будет основной формой проверки орфографии в проекте MS Word. Добавить один TMemo (Стандартная вкладка) и два TButtons к форме. Добавьте текст в заметку, заполнив свойство Lines. Конечно, с некоторыми опечатками. Выберите вкладку Серверы и добавьте TWordApplication и TWordDocument к форме. Измените имя компонента TWordApplication с WordApplication1 на WordApp, WordDocument1 на WordDoc.

TWordApplication, TWordDocument

Опубликованная собственность ConnectKind используется для управления подключением к недавно запущенному экземпляру Word или к уже запущенному экземпляру. Установите для ConnectKind значение ckRunningInstance.

Когда мы открываем или создаем файл в Word, мы создаем объект Document. Обычная задача при использовании автоматизации Word - указать область в документе, а затем что-то с ней сделать, например вставить текст и проверить орфографию. Объект, представляющий непрерывную область в документе, называется Range.

Проект проверки правописания - Проверка правописания / замена

Идея состоит в том, чтобы пройтись по тексту в заметке и разобрать его в слова, разделенные пробелом. Для каждого слова мы вызываем MS Word для проверки орфографии. Модель автоматизации Word содержит метод SpellingErrors, который позволяет проверять орфографию текста, содержащегося в некотором диапазоне.

Диапазон определен, чтобы содержать только слово, только что проанализированное. Метод SpellingErrors возвращает коллекцию слов с ошибками. Если эта коллекция содержит больше нуля слов, мы идем дальше. Вызов метода GetSpellingSuggestions, передающий неправильно написанное слово, заполняет коллекцию SpellingSuggestions предложенных заменяющих слов.

Мы передаем эту коллекцию в форму SpellCheck. Это вторая форма в нашем проекте.

Чтобы добавить новую форму в проект, используйте File | New Form. Пусть у него будет имя 'frSpellCheck'. Добавьте три компонента TBitBtn в эту форму. Два EditBox-ов и один ListBox. Обратите внимание на еще три ярлыка. Метка «Нет в словаре» «связана» с полем редактирования edNID. EdNID просто отображает слово с ошибкой. В списке lbSuggestions будут перечислены элементы в коллекции SpellingSuggestions. Выбранное предложение правописания помещается в поле редактирования edReplaceWith.

Три кнопки BitButton используются для отмены проверки орфографии, игнорирования текущего слова и для изменения слова с ошибкой на одно слово в поле редактирования edReplaceWith. Свойство ModalResult компонентов BitBtn используется при ссылке на то, что пользователь нажал. Для кнопки «Игнорировать» свойство ModalResult имеет значение mrIgnore, «Изменить» на mrOk и «Отмена» на mrAbort.

FrSpellCheck имеет одну строковую переменную Public с именем sReplacedWord. Эта переменная возвращает текст в edReplaceWith, когда пользователь нажимает кнопку «Изменить».

Наконец: исходный код Delphi

Здесь идет процедура анализа и проверки орфографии:

процедура TForm1.btnSpellCheckClick (Отправитель: TObject); вар colSpellErrors: ProofreadingErrors; colSuggestions: SpellingSuggestions; j: целое число; StopLoop: Boolean; itxtLen, itxtStart: Integer; varFalse: OleVariant; начать WordApp.Connect; WordDoc.ConnectTo (WordApp.Documents.Add (EmptyParam, EmptyParam)); // основной цикл StopLoop: = False; itxtStart: = 0; Memo.SelStart: = 0; itxtlen: = 0; в то время как не StopLoop начать {разбить текст заметки на слова.} itxtStart: = itxtLen + itxtStart; itxtLen: = Pos ('', Copy (Memo.Text, 1 + itxtStart, MaxInt)); если itxtLen = 0 затем StopLoop: = True; Memo.SelStart: = itxtStart; Memo.SelLength: = -1 + itxtLen; если Memo.SelText = '' затем Продолжать; WordDoc.Range.Delete (EmptyParam, EmptyParam); WordDoc.Range.Set_Text (Memo.SelText); {проверка правописания} colSpellErrors: = WordDoc.SpellingErrors; если colSpellErrors.Count <> 0 затемначать colSuggestions: = WordApp.GetSpellingSuggestions (colSpellErrors.Item (1) .Get_Text); с участием frSpellCheck начать edNID.text: = colSpellErrors.Item (1) .Get_Text; {заполните список с предложениями} lbSuggestions.Items.Clear; для j: = 1 до colSuggestions.Count делать lbSuggestions.Items.Add (VarToStr (colSuggestions.Item (j))); lbSuggestions.ItemIndex: = 0; lbSuggestionsClick (Sender); ShowModal; кейс frSpellCheck.ModalResult из mrAbort: перерыв; mrIgnore: Продолжить; Mrok: если sReplacedWord <> '' тогда начинай Memo.SelText: = sReplacedWord; itxtLen: = длина (sReplacedWord); конец; конец; конец; конец; конец; WordDoc.Disconnect; varFalse: = False; WordApp.Quit (varFalse); Memo.SelStart: = 0; Memo.SelLength: = 0; конец;

Тезаурус? Тезаурус!

В качестве бонуса у проекта есть код для использования Словарь тезаурус, Использовать тезаурус довольно просто. Мы не разбираем текст, для выбранного слова вызывается метод CheckSynonyms. Этот метод отображает свой собственный диалог выбора. После выбора нового слова содержимое диапазона документов Word используется для замены исходного слова.

Понравилась статья? Поделить с друзьями: