Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 27.11.2016
Сообщений: 11
1

Текстовый редактор + проверка орфографии

01.12.2016, 18:56. Показов 3286. Ответов 2

Author24 — интернет-сервис помощи студентам
Зачастил я тут. Вообщем - суть следующая: нужно написать текстовый редактор с организацией проверки орфографии используя алгоритм Левенштейна. На Lazarus'е. Текст следующий (просто RichMemo, в котором каждый вводимый символ проходит проверку на то, является он знаком препинания или нет, и если нет - заносится в "текущее слово". После того, как считывается знак препинания или пробел, слово становится "цельным" и проходит проверку: рассчитывается расстояние Левенштейна с каждым из слов в словаре (Текстовый файл) и на форму в label (пока что так) выводится 3 варианта "исправления". Если слово найдено, то в отдельный label записывается True - значит слово написано без ошибки. False - с ошибкой.):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, LazUTF8, SysUtils, FileUtil, RichMemo, Forms, Controls, Graphics, Dialogs,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    RichMemo1: TRichMemo;
    procedure FormCreate(Sender: TObject);
    procedure RichMemo1Change(Sender: TObject);
    procedure RichMemo1KeyPress(Sender: TObject; var Key: char);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  s: string;
  slovo,sl1, s1, s2: string;
  onn, m, n, tr: Integer;
  slovar: string;
  slovechko,slovozavr,slovechko2,slovechko3: string;
  d:array[0..500,0..500] of integer;
  r1,r2:array [1..100] of Integer;
 
implementation
 
{$R *.lfm}
 
procedure proverka;
var a: string;
    f: TextFile;
    function swap(c1:char; c2:char):integer;
begin
    if c1=c2 then
        swap:=0
    else
        swap:=1;
end;
 
function min(a:integer;b:integer;c:integer):integer;
begin
    if (a<b) and (a<c) then
        min:=a
    else
        if(b<c) and (b<a) then
            min:=b
        else
            min:=c;
end;
 
      function LevenShtein: string;
      var i,j: integer;
          begin
            n:=length(s1);
            m:=length(s2);
 
            for i:=0 to n do
              for j:=0 to m do
                  d[i,j]:=0;
 
            for i:=1 to n do
             d[i,0]:=d[i-1,0]+1;
 
            for j:=1 to m do
             d[0,j]:=d[0,j-1]+1;
 
            for i:=1 to n do
            begin
                for j:=1 to m do
               begin
                  d[i,j]:=min(d[i-1,j]+1,d[i,j-1]+1,d[i-1,j-1]+swap(s1[i],s2[j]));
               end;
             end;
             if d[n,m]=0 then tr:=1;
             if d[n,m]=1 then LevenShtein:=s1 else if d[n,m]<=2 then LevenShtein:=s1;
          end;
begin
a:='';
AssignFile(f,'lop2v2.txt');
Reset(f);
slovechko:='';
slovechko2:='';
slovechko3:='';
s2:=sl1;
while not eof(f) do
  begin
    readln(f,s1);
    slovozavr:=LevenShtein;
    if tr=1 then Break else
    if slovechko='' then slovechko:=slovozavr else
    if slovechko2='' then slovechko2:=slovozavr else slovechko3:=slovozavr;
  end;
CloseFile(f);
end;
 
{ TForm1 }
 
procedure TForm1.RichMemo1Change(Sender: TObject);
    var a: Integer;
begin
begin
if RichMemo1.Selstart>0 then
s:=UTF8RightStr(RichMemo1.Lines[RichMemo1.Lines.Count-1], 1);
//s:=redt1.Lines.Strings[redt1.Lines.Count-1][Length(redt1.Lines.Strings[redt1.Lines.Count-1])];
if (s<>' ') and (s<>'?') and (s<>'!') and (s<>'.') and (s<>',')  then
begin
slovo:=slovo+s;
end
else
begin
sl1:=slovo;
slovo:='';
proverka;
Label3.caption:=slovechko;
Label4.Caption:=slovechko2;
Label5.Caption:=slovechko3;
if tr=1 then
begin
Label6.Caption:='True';
tr:=0;
end
else
begin
Label6.Caption:='False '+inttostr(RichMemo1.selstart);
a:=RichMemo1.SelStart;
RichMemo1.SelStart:=a-(Length(sl1)+1);
r1[onn]:=a-(Length(sl1)+1);
RichMemo1.SelLength:=Length(sl1);
r2[onn]:=a;
RichMemo1.SetRangeColor(RichMemo1.SelStart, RichMemo1.SelLength, clRed);
RichMemo1.SelStart:=a+(Length(sl1));
RichMemo1.SetRangeColor(RichMemo1.SelStart, 10000, clBlack);;
onn:=onn+1;
end;
end;
Label1.caption:=slovo;
Label2.caption:=sl1;
end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
tr:=0;
RichMemo1.Text:='';
end;
 
procedure TForm1.RichMemo1KeyPress(Sender: TObject; var Key: char);
begin
  if Key=#08 then slovo:=Copy(slovo,1,Length(slovo)-2);
end;
 
 
 
end.
В Delphi всё работало, слово, если оно не было в словаре, заменялось таким же словом, но красным, что явно указывало на ошибку и в label'ы выводились 3 варианта исправления слова (с расстоянием Левенштейна <=2). Но, к перевеликому моему сожалению, написать нужно на Lazarus'е. При запуске программы и нажатии пробела программа начинает виснуть и в любом случае (даже если слово есть в словаре), выводится False, но слово не меняется красным.
В чем здесь есть ошибки? Если это слишком замороченный способ, то как сделать это попроще? С чем ещё это можно сделать? Просто я уже в депрессии и отчаянии, что мою почти готовую программу на удобном и комфортабельном Delphi теперь мне доделать не суждено, зато вместо это нужно мучиться с недоделанным Lazarus'ом. Искренне прошу помочь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2016, 18:56
Ответы с готовыми решениями:

Проверка орфографии в Richedit
Доброго времени суток. Пишу текстовый редактор на Delphi, возникла проблема с проверкой орфографии....

Текстовый редактор
здравствуйте,вопрос такой,используя видеоурокипо дельфи 7 скачанные с торрента,там 8 глав по 7...

Текстовый редактор
Помогите сделать так, что бы, когда закрываешь программу на красный крестик , она спрашивала,...

Текстовый редактор
Всем доброго времени суток!!! У меня такой вопрос. Дело в том что, мне надо было создать текстовый...

2
438 / 367 / 132
Регистрация: 09.09.2011
Сообщений: 1,334
02.12.2016, 00:00 2
Приложите весь проект, который можно скомпилировать и запустить. Желательно с текстовым файлом и примером текста.

Но что я вижу сразу это работа с символами строк через индексы. Это не будет правильно работать ни в Lazarus ни в Delphi новее 2009 версии (если символы не только английского алфавита).
0
0 / 0 / 0
Регистрация: 27.11.2016
Сообщений: 11
02.12.2016, 14:43  [ТС] 3
Вот он
Вложения
Тип файла: rar Lazarus.rar (4.27 Мб, 73 просмотров)
0
02.12.2016, 14:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2016, 14:43
Помогаю со студенческими работами здесь

Текстовый редактор в Lazarus
Создаю текстовый редактор, наподобие блокнота в windows. Есть одна загвоздка: Как написать...

Текстовый редактор в Lazarus
создал блокноик в Lazaruse, точнее преобразовал из Delphi(в Delphi работает прекрасно). Работает...

Текстовый редактор на Delphi:(
Здравствуйте,программисты!Нужна помощь:мне задали написать пояснительную записку к данной...

Текстовый редактор в Delphi
Постановка задачи. Создать программный продукт средствами визуальной среды программирования...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru