Sign in Join
Wiki copytemporary

spelling/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11# Использование hunspell с Lazarus
22
33> **Note:** Эта страница актуальна по состоянию на август 2018 года, но все меняется .....
44
55Эта страница посвящена использованию библиотеки hunspell с Lazarus. Он описывает модель, которая работает, вроде как. Вам почти наверняка понадобится внести некоторые изменения для ваших конкретных целей, но, надеюсь, эта страница послужит вам хорошим началом.
66
77Во-первых, на форуме есть несколько ссылок на некоторый код, который будет работать с библиотекой hunspell. Модуль hunspell.pas в значительной степени основан на этих блоках кода. У большинства нет информации о лицензии, и делается предположение, что она является «общеизвестной» и, следовательно, свободна от каких-либо ограничений. Я добавил немного, что решает проблему поиска файлов библиотеки и словаря. И установил разумный интерфейс.
88
99Кроме того, пользователь [[https://forum.lazarus.freepascal.org/index.php?action=profile;u=55059 rvk]] с форума создал Windows 64-битную DLL, так как для пользователей Windows не было никакой альтернативы.
1010
1111# О библиотеке Hunspell
1212
1313Hunspell - это активный проект с открытым исходным кодом, распространяемый по открытой лицензии Mozilla. Библиотека hunspell используется в таких продуктах, как Libra Office, Open Office и Firefox. Его можно заставить работать на Windows, Linux и Mac (и, возможно, на кучах других платформ). См. ссылки на платформоспецифичные страницы ниже. Словари Hunspell легко доступны и, возможно, уже установлены на многих машинах. Даже если вы не можете получить доступ к библиотеке другого приложения, вы можете использовать его словарь.
1414
1515Словари Hunspell поставляются в виде пары файлов *.dic и *.aff. Например, австралийский словарь состоит из en_AU.dic и en_AU.aff. Префикс 'en' обозначает его английский, а суффикс 'AU' говорит о его специфичности специально для Австралии. Как говорящий по-английски, я отмечаю, что словари en_US, кажется, всегда установлены, и я добавляю австралийские. Я не знаю, насколько распространен этот шаблон в не-англоязычных системах.
1616
1717Словари можно найти здесь <https://github.com/LibreOffice/dictionaries>, а также некоторую информацию, связанную с этим, здесь <https://wiki.documentfoundation.org/Development/Dictionaries>
1818
1919# Замечание насчет словарей
2020
2121В некоторых случаях для корректного отображения предлагаемых слов словари должны быть закодированы в UTF-8. Если вы заметили, что некоторые слова отображаются неправильно — например, яблоко на польском — это jabłko, а вы получаете jab�ko, — это означает, что словари pl_PL.aff и pl_PL.dic должны быть преобразованы в UTF-8. Чтобы преобразовать словари в UTF-8 в Linux Debian (это должно работать в любом Linux, конвертированные словари можно использовать в Windows - проверьте также [эту ветку форума](http://forum.lazarus.freepascal.org/index.php/topic,44298.0.html)) выполните следующие действия:
2222
23231\. Запустить терминал как root
2424
25-`  su`
25+```text
26+ su
27+```
2628
27292\. Если он еще не установлен, установите hunspell (hunspell-pl для польского словаря — подробнее на [Debian Hunspell package](https://packages.debian.org/search?keywords=hunspell))
2830
29-`  apt-get install hunspell`\
30-`  apt-get install hunspell-pl`
31+```text
32+ apt-get install hunspell
33+ apt-get install hunspell-pl
34+```
3135
32363\. Перейдите в /usr/share/hunspell/, где хранятся словари, и создайте папку dic
3337
34-`  cd /usr/share/hunspell/`\
35-`  mkdir dic`
38+```text
39+ cd /usr/share/hunspell/
40+ mkdir dic
41+```
3642
37434\. Преобразуйте, например, словарь pl_PL.aff и pl_PL.dic. Используйте [ISO-8859-2](https://en.wikipedia.org/wiki/ISO/IEC_8859-2) (для Восточной Европы), [ISO-8859-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1) (или ISO-8859-15) для Западной Европы, [ISO-8859-5](https://ru.wikipedia.org/wiki/ISO_8859-5) для кириллицы и т.д.
3844
39-`  iconv -f ISO-8859-2 -t UTF-8 /usr/share/hunspell/pl_PL.aff | sed 's/^SET ISO8859-2$/SET UTF-8/g' > dic/pl_PL.aff`\
40-`  iconv -f ISO-8859-2 -t UTF-8 /usr/share/hunspell/pl_PL.dic > dic/pl_PL.dic`
45+```text
46+ iconv -f ISO-8859-2 -t UTF-8 /usr/share/hunspell/pl_PL.aff | sed 's/^SET ISO8859-2$/SET UTF-8/g' > dic/pl_PL.aff
47+ iconv -f ISO-8859-2 -t UTF-8 /usr/share/hunspell/pl_PL.dic > dic/pl_PL.dic
48+```
4149
42505\. Скопируйте папку dic или словари из папки dic в свое приложение.
4351
4452# Платформозависимость
4553
4654## Linux
4755
4856Во многих дистрибутивах Linux по умолчанию установлен Hunspell вместе с соответствующими языковыми словарями. Если нет, то, вероятно, это просто случай использования менеджера пакетов дистрибутива. Если ничего не помогает, возьмите исходник с сайта hunspell github и создайте его самостоятельно. Пользователи Linux любят это.
4957
5058Чтобы проверить, установлена ли у вас библиотека hunspell, попробуйте эту команду
5159
52-` ldconfig -p | grep hunspell `
60+```text
61+ ldconfig -p | grep hunspell
62+```
5363
5464Точно так же вы можете найти некоторые словари с помощью
5565
56-` ls -l /usr/share/hunspell `
66+```text
67+ ls -l /usr/share/hunspell
68+```
5769
5870Если это не сработает, попробуйте
5971
60-` find /usr -name *.aff `
72+```text
73+ find /usr -name *.aff
74+```
6175
6276это займет немного больше времени.
6377
6478## Windows
6579
6680Установка библиотеки hunspell на Windows является более серьезной проблемой. По-видимому, нет предварительно скомпилированного 'комплекта', и большинство приложений Windows, которые используют Hunspell, похоже, статически связывают его, поэтому не осталось никаких hunspell.dll для использования. Но просто, чтобы быть уверенным, попробуйте поискать `*hunspell*.dll`. На сайте Hunspell github приведен рецепт его создания, но он включает установку MSYS2 и довольно сложен. Получающаяся DLL также нуждается вдобавок в паре gcc DLL.
6781
6882К счастью, пользователь rvk с форума Lazarus создал нам хорошую статически (т.е. автономно) связанную DLL-библиотеку с использованием Microsoft Visual Studio Community 2015. Таким образом, вы можете использовать и распространять эту DLL-библиотеку вместе с вашей программой, подпадающей под действие публичной лицензии Mozilla.
6983
7084Вы найдете эту DLL в комплекте с файлом лицензии на <https://github.com/davidbannon/hunspell4pas>, щелкните «DLL», щелкните по файлу dll, и вы увидите кнопку «Загрузить». Не забудьте также получить файл лицензии, он должен распространяться, так или иначе, с вашим приложением.
7185
7286------------------------------------------------------------------------
7387
7488Прим.перев.: Вы также можете посмотреть исходники интерфейса Hunspell для Lazarus здесь: [<https://github.com/cutec-chris/hunspell>](https://github.com/cutec-chris/hunspell)
7589
7690------------------------------------------------------------------------
7791
7892## Mac
7993
8094На Mac'е автора, по-видимому, была установлена библиотека Hunspell при установке Sierra. Но, может быть, просто возможно, это пришло вместе с Firefox. Я хотел бы получить обратную связь .... \[уже установлено на Mojave и Catalina\]
8195
8296> **Note:** См <https://opensource.apple.com/tarballs/hunspell/> для загрузки исходников v1.2.8.
8397
8498Чтобы проверить, установлена ли у вас библиотека hunspell, попробуйте эту команду
8599
86-` find / 2>&1 | grep "\hunspell"`
100+```text
101+ find / 2>&1 | grep "\hunspell"
102+```
87103
88104она будет выполняться некоторое время, в зависимости от того, сколько файлов в вашей системе. Скорее всего, она найдет несколько файлов, включая некоторые, в вашем каталоге XCode. Однако конечным пользователям, вероятно, не будет установлен XCode. Один особенно интересный файл для меня был
89105
90-` /usr/lib/libhunspell-1.2.dylib `
106+```text
107+ /usr/lib/libhunspell-1.2.dylib
108+```
91109
92110Версия 1.2 немного старше, чем где-либо, но работала нормально. Если вы не можете найти пригодную для использования библиотеку, я предлагаю вам установить его с помощью менеджера пакетов, такого как MacPorts, Fink или brew. Следующая проблема заключается в том, что вам понадобятся словари. Аналогичная команда
93111
94-` find / 2>&1 | grep "\.aff"`
112+```text
113+ find / 2>&1 | grep "\.aff"
114+```
95115
96116опять же, медленная, она ищет по всему вашему диску. Я нашел команду
97117
98-` /Applications/Firefox.app/Contents/Resources/dictionaries/en-US.aff `
118+```text
119+ /Applications/Firefox.app/Contents/Resources/dictionaries/en-US.aff
120+```
99121
100122И быстрый 'ls' заверил меня, что есть соответствующие файлы en-US.dic, так что все хорошо.
101123
102124Более опытный пользователь Mac может предложить лучшие стратегии поиска. Пожалуйста!
103125
104126# Модуль Hunspell
105127
106128При первоначальном создании этой страницы (2017?) я допустил серьезную ошибку и использовал код, у которого не было четкой лицензии или истории. Было высказано предположение, что тем самым я нарушил лицензию Hunspell, как и все, кто использовал ее с тех пор.
107129
108130Чтобы исправить эту ситуацию, я выпустил новую версию Hunspell Wrapper, которая имеет довольно небольшую часть, только определения функций, с Hunspell (Лицензия: MPL 1.1/GPL 2.0/LGPL 2.1) и Hunspell Unit (Лицензия: Clear BSD License) в отдельных файлах. С точки зрения кодирования это почти идентично тому, что было здесь раньше.
109131
110132См. <https://github.com/davidbannon/hunspell4pas>
111133
112134Я удалил оболочку hunspell, которая раньше находилась на этой странице. Тот, что на Github выше, является заменой, вам нужны hunspell.pas и hunspell.inc. Оставшаяся часть файла представляет собой базовый test/demo проект Lazarus командной строки, который заменяет Demo 1.
113135
114136## Demo 2 в полном графическом интерфейсе
115137
116138Демо графического интерфейса Lazarus имеет больше смысла и была протестирована на Linux, Mac и Windows. Но это немного сложнее, \[чем\] скопировать и вставить.
117139
118140Для этой демо вам понадобится форма с двумя TMemo: Memo1 и MemoMsg. Кнопка ButtonSpell, Tlistbox Listbox1. Сделайте следующие обработчики событий: FormCreate для главной формы; дважды щелкните по Listbox1 и \[дважды\] кликните по ButtonSpell.
119141
120142Сначала вы должны создать объект hunspell и посмотреть, нашел ли он свою библиотеку, вот пример метода FormCreate () ....
121143
122144``` pascal
123145uses hunspell;
124146var
125147 Form1: TForm1;
126148 Sp: THunspell;
127149 DictPath : AnsiString;
128150
129151procedure TForm1.FormCreate(Sender: TObject);
130152begin
131153 SetDefaultDicPath();
132154 Sp := THunspell.Create();
133155 if Sp.ErrorMessage = '' then begin
134156 MemoMsg.append('Library Loaded =' + Sp.LibraryFullName);
135157 ButtonSpell.enabled := CheckForDict();
136158 end else
137159 MemoMsg.append(SP.ErrorMessage);
138160end;
139161```
140162
141163В этом примере мы пишем сообщение о статусе в MemoMsg, это простой способ увидеть, что происходит. ButtonSpell НЕ включен, пока не будут установлены словари. Ожидаем этого ....
142164
143165Теперь нам нужны два метода: один читает назначенный каталог и ищет возможные файлы словарей, другой управляет решениями. Если мы найдем только один словарный набор, используем его, если мы не найдем - пожалуемся. Но если мы найдем несколько, и это наиболее вероятно, мы должны спросить пользователя, какой словарь (то есть язык) он хочет использовать.
144166
145167``` pascal
146168function TForm1.FindDictionary(const Dict : TStrings; const DPath : AnsiString) : boolean;
147169var
148170 Info : TSearchRec;
149171begin
150172 Dict.Clear;
151173 if FindFirst(AppendPathDelim(DPath) + '*.dic', faAnyFile and faDirectory, Info)=0 then begin
152174 repeat
153175 Dict.Add(Info.Name);
154176 until FindNext(Info) <> 0;
155177 end;
156178 FindClose(Info);
157179 Result := Dict.Count >= 1;
158180end;
159181
160182function TForm1.CheckForDict() : boolean;
161183begin
162184 Result := False;
163185 EditDictPath.Caption := DictPathAlt;
164186 if not FindDictionary(ListBox1.Items, DictPath) then
165187 MemoMsg.Append('ERROR - no dictionaries found in ' + DictPath);//[прим.перев.]: словари в DictPath не найдены
166188 if ListBox1.Items.Count = 1 then begin // Один [словарь] вернулся точно.
167189 if not Sp.SetDictionary(AppendPathDelim(DictPath) + ListBox1.Items.Strings[0]) then
168190 MemoMsg.Append('ERROR ' + SP.ErrorMessage)
169191 else
170192 MemoMsg.Append('Dictionary set to ' + DictPath + ListBox1.Items.Strings[0]);// [прим.перев.]: словарь (первый из списка ListBox1) установлен в DictPath
171193 end;
172194 Result := SP.GoodToGo; // если count был точно один или FindDict не вернул ничего и ничего не изменилось
173195end;
174196```
175197
176198Ах, вы спросите, но где нам искать словари? К сожалению, у меня нет хорошего решения для этого. Вот где я нашел свой -
177199
178200``` pascal
179201procedure TForm1.SetDefaultDicPath();
180202begin
181203 {$ifdef LINUX}
182204 DictPath := '/usr/share/hunspell/';
183205 {$ENDIF}
184206 {$ifdef WINDOWS}
185207 DictPath := ExtractFilePath(Application.ExeName);
186208 //DictPath := 'C:\Program Files\LibreOffice 5\share\extensions\dict-en\';
187209 {$ENDIF}
188210 {$ifdef DARWIN}
189211 DictPath := '/Applications/Firefox.app/Contents/Resources/dictionaries/';
190212 //DictPathAlt := ExtractFilePath(Application.ExeName);
191213 {$endif}
192214end;
193215```
194216
195217Возможно, если другие пользователи сообщат, где они нашли пригодные для использования словари Hunspell, мы можем составить список для каждой платформы. Или просто выберите легкий путь и попросите пользователя найти несколько словарей и поместить их в каталог приложений на Windows и Mac. Ваши мысли очень приветствуются ....
196218
197219Пока, если в указанном каталоге есть ровно один словарь, все хорошо. Но что, если их несколько? Наш ListBox1 содержит их список, если пользователь дважды щелкнет один из них, он вызовет этот метод -
198220
199221``` pascal
200222procedure TForm1.ListBox1DblClick(Sender: TObject);
201223begin
202224 if ListBox1.ItemIndex > -1 then
203225 ButtonSpell.enabled := Sp.SetDictionary( AppendPathDelim(DictPath) + ListBox1.Items.Strings[ListBox1.ItemIndex]);
204226 if SP.ErrorMessage = '' then begin
205227 MemoMsg.Append('Good To Go =' + booltostr(Sp.GoodToGo, True));
206228 MemoMsg.Append('Dictionary set to ' + AppendPathDelim(DictPath) + ListBox1.Items.Strings[ListBox1.ItemIndex]);
207229 end else
208230 MemoMsg.append('ERROR ' + SP.ErrorMessage);
209231end;
210232```
211233
212234Предполагая, что у нас теперь есть все, что нужно, мы можем нажать кнопку ButtonSpell и вызвать это -
213235
214236``` pascal
215237procedure TForm1.ButtonSpellClick(Sender: TObject);
216238begin
217239 if not Sp.Spell(Edit1.text) then begin
218240 Memo1.Lines.BeginUpdate;
219241 Sp.Suggest('badspeller', Memo1.lines);
220242 Memo1.Lines.EndUpdate;
221243 end else
222244 Memo1.Lines.Clear;
223245end;
224246```
225247
226248Memo1 теперь содержит несколько советов о лучших способах написания \[слова\] неграмотному!
227249
228250Важно! Не забудьте освободить наш объект hunspeller, утечки памяти - зло!
229251
230252``` pascal
231253procedure TForm1.FormDestroy(Sender: TObject);
232254begin
233255 Sp.free;
234256 Sp := nil;
235257end;
236258```
237259
238260Этот модуль делает значительно больше, но он представлен здесь в его наиболее урезанной форме для удобства чтения.
239261
240262> **Note:** для новичков в Lazarus, методы с "(Sender: TObject)", показанные выше, не могут быть просто вставлены в ваш исходник, сначала используйте инспектор объектов формы, чтобы создать события, а затем вставьте мой пример кода в метод.
241263
242264## Demo 3 - Lazspell - Tmemo
243265
244266В этом примере использовался компонент TMemo.
245267
246268![](/wiki-images/b/b3/Lazspell.gif)
247269
248270Lazspell - пример проверки орфографии - из <https://github.com/Raf20076/Lazspell>
249271
250272## Demo 4 - Lazspell 2-version 2 - TRichMemo
251273
252274В этом примере использовался компонент TRichMemo.
253275
254276![](/wiki-images/8/8c/Lazspell-ver2.gif)
255277
256278Lazspell 2 v2 - пример проверки орфографии - изm <https://github.com/Raf20076/Lazspell-2-version-2>
257279
258280## Demo 5 - Простая проверка орфографии
259281
2602821\. Запустите IDE Lazarus
261283
2622842\. Кликните Project -\> New Project -\> Choose -\> Application. Вы только что создали новое приложение. Теперь сохраните его
263285
2642863\. Кликните File -\> Save as. Выберите папку, в которой будет сохранено ваше приложение. Сначала будет сохранен project1.lpi, затем unit1.pasunit1.pas
265287
2662884\. Поместите hunspell.pas и hunspell.inc (from <https://github.com/davidbannon/hunspell4pas>) в вашу папку
267289
2682905\. Поместите libhunspell.dll в папку с вашим приложением (вы должны загрузить ее отсюда <https://github.com/Raf20076/Lazspell> или <https://github.com/davidbannon/hunspell4pas>) в любом случае или соберите ее самостоятельно.
269291
2702926\. Поместите словарь в папку приложения (оба файла), например pl_PL.aff, pl_PL.dic. Словари должны быть закодированы в UTF8. Скачать их можно отсюда <https://github.com/Raf20076/Lazspell/tree/master/dict>
271293
2722947\. Положите на Form1 компонент TButton (Button1) с вкладки Standard
273295
2742968\. Положите на Form1 компонен TMemo (Memo1) с вкладки Standard
275297
2762989\. Положите на Form1 компонен TListbox (ListBox1) с вкладки Standard (здесь будут отображаться слова с ошибками)
277299
27830010\. Кликните по кнопке Button1 на Form1 затем перейдите в ObjectInspector, щелкните по вкладке Events, затем дважды щелкните рядом с событием OnClik: это создаст событие OnClick, и код вставки (см. код всего приложения), начинающийся с
279301
280302``` pascal
281303
282304{Check spelling}
283305 var
284306 i : Integer;
285307 MAX : Integer;
286308 FillInArrayWithWords:TStringArray;
287309 FillInString1: String;
288310 FillInString2: String;
289311```
290312
291313до
292314
293315``` pascal
294316
295317//Если слова нет в словаре, показать его в Listbox как ошибку
296318```
297319
29832011\. Перейдите в ObjectInspector и щелкните Form1, затем щелкните вкладку Events, затем дважды щелкните рядом с OnCreate, это создаст событие OnCreate и вставит код (см. код всего приложения)
299321
300322``` pascal
301323 SpellCheck := THunspell.Create(True);
302324 SpellCheck.SetDictionary('pl_PL.dic');//загружаем словарь
303325 SpellCheck.GoodToGo := True;
304326```
305327
30632812\. Оставаясь в ObjectInspector, щелкните Form1, затем щелкните вкладку Events, затем дважды щелкните рядом с OnDestroy, это создаст событие OnDestroy и вставит код (см. код всего приложения)
307329
308330``` pascal
309331 SpellCheck.free;
310332 SpellCheck := nil;
311333```
312334
31333513\. Затем в вашем коде разместите такие функции, как `ArrayValueCount` и т.д.
314336
315337См. ниже код всего приложения, чтобы сравнить его с вашим.
316338
317339``` pascal
318340//SpellChecker by Raf20076, Poland 2019
319341
320342unit Unit1;
321343
322344{$mode objfpc}{$H+}
323345
324346interface
325347
326348uses
327349 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
328350 LazFileUtils, LCLProc, LazUtils, LazUtf8;
329351
330352type
331353 TForm1 = class(TForm)
332354 Button1: TButton;
333355 Label1: TLabel;
334356 Label2: TLabel;
335357 ListBox1: TListBox;
336358 ListBox2: TListBox;
337359 Memo1: TMemo;
338360 procedure Button1Click(Sender: TObject);
339361 procedure FormCreate(Sender: TObject);
340362 procedure FormDestroy(Sender: TObject);
341363 end;
342364
343365var
344366 Form1: TForm1;
345367
346368implementation
347369
348370uses hunspell;//поместите hunspell.pas и hunspell.inc в папку вашего приложения
349371 //из https://github.com/davidbannon/hunspell4pas
350372
351373var
352374 SpellCheck: THunspell;
353375
354376{$R *.lfm}
355377
356378procedure TForm1.FormCreate(Sender: TObject);
357379begin
358380 SpellCheck := THunspell.Create(True);
359381 SpellCheck.SetDictionary('pl_PL.dic');//загружаем словарь
360382 SpellCheck.GoodToGo := True;
361383end;
362384
363385{Извлекаем слова из строки: НЕсимволы, пробелы, возврат каретки}
364386
365387function ArrayValueCount(const InputArray: Array of string): Integer;
366388{Подсчет элементов в массиве}
367389var
368390 i:Integer;
369391begin
370392 result := 0;
371393 for i := low(InputArray) to high(InputArray) do
372394 if InputArray[i] <> ' ' then // 'между ними один пробел'
373395 inc(result);
374396end;
375397
376398function StripOffNonCharacter(const aString: string): string;
377399{Удаляем НЕсимволы из строки}
378400var
379401 a: Char;
380402begin
381403 Result := '';
382404 for a in aString do begin //под знаками препинания цифры, которые нужно удалить из строки
383405 if not CharInSet( a, ['.', ',', ';', ':', '!', '/',
384406 '?', '@', '#', '$', '%', '&', '*', '(', ')', '{',
385407 '}', '[', ']', '-', '\', '|', '<', '>', '''', '"', '^',
386408 '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '_', '+',
387409 '=', '~']) then //'„', '”'])эти метки делают ошибку: ожидается порядковое выражение, необходимо исправить
388410 begin
389411 Result := Result + a;
390412 end;
391413 end;
392414end;
393415
394416function ReplaceCarriageReturn(s: string) : string;
395417{Заменяем возврат каретки одним пробелом}
396418var
397419 i: Integer;
398420begin
399421 Result:=s;
400422 for i := 1 to Length(Result) do
401423 if Result[i] in [#3..#13] then
402424 Result[i] := ' ';//'Между ними один пробел'
403425end;
404426
405427procedure TForm1.Button1Click(Sender: TObject);
406428{Проверяем орфографию}
407429var
408430 i : Integer;
409431 MAX : Integer;
410432 FillInArrayWithWords:TStringArray;
411433 FillInString1: String;
412434 FillInString2: String;
413435begin
414436 ListBox1.clear;
415437 ListBox1.Items.Clear;
416438
417439 FillInString1 := ReplaceCarriageReturn(Memo1.Lines.Text);//берем текст из Memo1; заменяем возврат каретки
418440 //одним пробелом (используя функцию ReplaceCarriageReturn) и помещаем внутрь FillInString1
419441
420442 FillInString2 := StripOffNonCharacter(FillInString1);//удаляем все НЕсимволы из FillInString1
421443 //(используя функцию StripOffNonCharacter) и помещаем строку без НЕсимволов внутрь FillInString2
422444
423445 FillInArrayWithWords := FillInString2.split(' '); //разделяем строку на слова с помощью ' ' одного пробела
424446 //(используя .split) и помещаем слова по отдельности в массив FillInArrayWithWords
425447
426448 MAX := ArrayValueCount(FillInArrayWithWords); //узнаем, сколько элементов в массиве
427449 //(используя функцию ArrayValueCount)
428450
429451 for i := 0 to MAX -1 do
430452 if not SpellCheck.Spell(FillInArrayWithWords[i]) then
431453 ListBox1.Items.add(FillInArrayWithWords[i]);
432454 //Берем слово из массива и проверяем по словарю через hunspell (используя функцию SpellCheck.Spell)
433455 //Если слова нет в словаре, показываем его в Listbox, как ошибку
434456end;
435457
436458procedure TForm1.FormDestroy(Sender: TObject);
437459begin
438460 SpellCheck.free;
439461 SpellCheck := nil;
440462end;
441463
442464end.
443465```
444466
445467Когда вы запустите свое приложение и введете какой-либо текст в Memo, а затем нажмете кнопку, приложение проверит, обнаружены ли какие-либо ошибки, и, если они будут найдены, отобразит их в ListBox. Основная проблема заключалась в том, как удалить возврат каретки и НЕсимволы, а затем как разбить текст на отдельные слова. Это непростая задача. Поэтому для этого есть три функции: функция `ReplaceCarriageReturn`, функция `StripOffNonCharacter` и функция `FillInString2.split`. Функция `FillInString2.split` на самом деле использует функцию `.split` из `SysUtils`. Надеюсь, код всего приложения не требует пояснений.
446468
447469## Дальнейшее чтение и ссылки
448470
449471<https://github.com/hunspell/hunspell>
450472
451473<https://github.com/Homebrew> - вероятно, разумный способ получить Hunspell на вашем Mac, если его еще нет.
452474
453475<https://github.com/tomboy-notes/tomboy-ng/releases> - содержит 64-битную Windows DLL в tomboy-ng_win64_\<ver\>.zip
454476
455477<https://github.com/cutec-chris/hunspell>
456478
457479---
458480*From the Free Pascal wiki, page "spelling/ru", as it stood on 2022-10-04 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history