Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
1 / 1 / 0
Регистрация: 02.04.2016
Сообщений: 122

Ошибка в var при обьявлении массива

25.05.2017, 12:50. Показов 4398. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выдает ошибку в var при обьявлении массива, что делать?
Миниатюры
Ошибка в var при обьявлении массива  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.05.2017, 12:50
Ответы с готовыми решениями:

Ошибка при обьявлении метода после переноса кода с VS в C++ Builder
Добрый день. Подскажите пожалуйста, как исправить ошибку, которая возникла после переноса кода из VS в C++ Builder. Ошибка возникает при...

Как сцепить строки? Например <? $var='Ура!'; $var=$var+' Еще раз...'; echo $var; ?>
Вот пример: &lt;? $var='Ура!'; $var=$var+' Еще раз...'; echo $var; ?&gt; Выводит Ура!0

Ошибка в обьявлении пространстве имён
Здравствуйте. Что тут не так? using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

32
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
25.05.2017, 16:38
Студворк — интернет-сервис помощи студентам
droider, я указывал на то, что логика данной программы не подразумевает использование массива-переменной. используется массив предопределенных слов, которые сравниваются где-то с чем-то, неважно. а поскольку массив задается в самой программе, а не грузится из тестового файла (пусть даже это учебно-тестовая программа), зачем нам массив-переменная?

я полагаю, учить нужно писать не только синтаксически, но логически правильный код. моё мнение

Добавлено через 1 минуту
и да, его нужно вынести в глобальную секцию, как уже писали, но все равно в виде константы
0
1 / 1 / 0
Регистрация: 02.04.2016
Сообщений: 122
25.05.2017, 16:38  [ТС]
ВОТ КОД
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, SynEdit, SynMemo, Vcl.Menus,
  SynEditHighlighter, SynHighlighterPas, Vcl.ComCtrls, Vcl.ExtCtrls,
  Vcl.StdCtrls, Vcl.AppEvnts, System.Actions, Vcl.ActnList, Vcl.StdActns,
  Printers, Vcl.ToolWin, Vcl.ActnMan, Vcl.ActnCtrls,
  Vcl.PlatformDefaultStyleActnCtrls, Vcl.ImgList, Vcl.ActnMenus, SynEditPrint,
   SynEditMiscClasses, Vcl.Grids;
 
type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    SynPasSyn1: TSynPasSyn;
    N2: TMenuItem;
    StatusBar1: TStatusBar;
    SynEdit1: TSynEdit;
    Timer1: TTimer;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    N16: TMenuItem;
    N17: TMenuItem;
    N18: TMenuItem;
    N19: TMenuItem;
    N20: TMenuItem;
    N21: TMenuItem;
    ListView1: TListView;
    N22: TMenuItem;
    PopupMenu1: TPopupMenu;
    N23: TMenuItem;
    N24: TMenuItem;
    N25: TMenuItem;
    N26: TMenuItem;
    N27: TMenuItem;
    N28: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    ActionList1: TActionList;
    SearchFind1: TSearchFind;
    ActionManager1: TActionManager;
    ImageList1: TImageList;
    ActionToolBar1: TActionToolBar;
    Action2: TAction;
    Action3: TAction;
    Action4: TAction;
    Action5: TAction;
    Action6: TAction;
    Action1: TAction;
    Action7: TAction;
    Action8: TAction;
    N29: TMenuItem;
    N30: TMenuItem;
    N31: TMenuItem;
    N32: TMenuItem;
    N33: TMenuItem;
    N34: TMenuItem;
    N35: TMenuItem;
    N36: TMenuItem;
    N37: TMenuItem;
    N38: TMenuItem;
    N39: TMenuItem;
    Action9: TAction;
    Action10: TAction;
    Action11: TAction;
    Action12: TAction;
    Action13: TAction;
    procedure SynEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
    procedure N23Click(Sender: TObject);
    procedure N24Click(Sender: TObject);
    procedure N26Click(Sender: TObject);
    procedure N25Click(Sender: TObject);
    procedure N27Click(Sender: TObject);
    procedure N28Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N21Click(Sender: TObject);
    procedure N17Click(Sender: TObject);
    procedure SearchFind1BeforeExecute(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N22Click(Sender: TObject);
    procedure SynEdit1SpecialLineColors(Sender: TObject; Line: Integer;
      var Special: Boolean; var FG, BG: TColor);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure N8Click(Sender: TObject);
    procedure Action2Execute(Sender: TObject);
    procedure Action3Execute(Sender: TObject);
    procedure Action4Execute(Sender: TObject);
    procedure Action5Execute(Sender: TObject);
    procedure Action6Execute(Sender: TObject);
    procedure N30Click(Sender: TObject);
    procedure N29Click(Sender: TObject);
    procedure N31Click(Sender: TObject);
    procedure N32Click(Sender: TObject);
    procedure N33Click(Sender: TObject);
    procedure N39Click(Sender: TObject);
    procedure Action7Execute(Sender: TObject);
    procedure Action1Execute(Sender: TObject);
    procedure Action8Execute(Sender: TObject);
    procedure Action11Execute(Sender: TObject);
    procedure Action12Execute(Sender: TObject);
    procedure N38Click(Sender: TObject);
    procedure N36Click(Sender: TObject);
    procedure N37Click(Sender: TObject);
    procedure Action13Execute(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure SynEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Action9Execute(Sender: TObject);
    procedure Action10Execute(Sender: TObject);
    procedure N13Click(Sender: TObject);
    procedure N14Click(Sender: TObject);
    procedure ListView1SelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
 
  private
    { Private declarations }
 
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  ShowOstanovka : boolean = false;  //глобальная переменная
  OriginalCaption: string; // оригинальное название программы (главной формы)
  TheLine : Integer = -1;
  const a : array[1..5] of String[10]=('VAR','END','BEGIN','FUNCTION','IF');
implementation
 
{$R *.dfm}
 
uses Unit2_search, settings, RegExpr;
 
procedure LoadStringGrid(StringGrid: TStringGrid; FileName: string);
var
  T: TStringList;
  Row, Col, Count: integer;
begin
  T := TStringList.Create;
  T.LoadFromFile(FileName);
  StringGrid.RowCount := StrToIntDef(T.Strings[0], 1);
  StringGrid.ColCount := StrToIntDef(T.Strings[1], 1);
  T.Delete(0);
  Count := 0;
  for Row := 0 to StringGrid.RowCount - 1 do
    for Col := 0 to StringGrid.ColCount - 1 do begin
      Count := Count + 1;
      if T.Strings[Count] <> '' then
        StringGrid.Cells[Col, Row] := T.Strings[Count] else
        StringGrid.Cells[Col, Row] := '';
    end;
  T.Free;
end;
 
procedure PrintStrings(Strings: TStrings);
var
  Prn: TextFile;
  i: word;
begin
  AssignPrn(Prn);
  try
    Rewrite(Prn);
    try
      for i := 0 to Strings.Count - 1 do
        writeln(Prn, Strings.Strings[i]);
    finally
      CloseFile(Prn);
    end;
  except
    on EInOutError do
      MessageDlg('Ошибка печати текста.', mtError, [mbOk], 0);
  end;
end;
 
procedure TForm1.Action10Execute(Sender: TObject);
begin
  SynEdit1.Redo;
end;
 
procedure TForm1.Action11Execute(Sender: TObject);
begin
  Form2.Show;
end;
 
procedure TForm1.Action12Execute(Sender: TObject);
begin
  SynEdit1.Font.Size:= SynEdit1.Font.Size+2;
  StatusBar1.Panels[4].Text:= IntToStr(StrToInt(StatusBar1.Panels[4].Text)+20);
end;
 
procedure TForm1.Action13Execute(Sender: TObject);
begin
  SynEdit1.Font.Size:= SynEdit1.Font.Size-2;
  StatusBar1.Panels[4].Text:= IntToStr(StrToInt(StatusBar1.Panels[4].Text)-20);
end;
 
procedure TForm1.Action1Execute(Sender: TObject);
begin
  SynEdit1.CopyToClipboard;
end;
 
procedure TForm1.Action2Execute(Sender: TObject);
begin
  Form1.Caption:= OriginalCaption;
  SynEdit1.Clear;
end;
 
procedure TForm1.Action3Execute(Sender: TObject);
begin
  if OpenDialog1.Execute then begin
    SynEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
    Form1.Caption:= OriginalCaption + ' - [' + OpenDialog1.FileName + ']';
  end;
end;
 
procedure TForm1.Action4Execute(Sender: TObject);
begin
  SynEdit1.Lines.SaveToFile(OpenDialog1.FileName);
end;
 
procedure TForm1.Action5Execute(Sender: TObject);
begin
  if SaveDialog1.Execute then begin
    SynEdit1.Lines.SaveToFile(SaveDialog1.FileName);
    Form1.Caption:= OriginalCaption + ' - [' + SaveDialog1.FileName + ']';
    OpenDialog1.FileName:= SaveDialog1.FileName;
  end;
end;
 
procedure TForm1.Action6Execute(Sender: TObject);
begin
  PrintStrings(SynEdit1.Lines);
end;
 
procedure TForm1.Action7Execute(Sender: TObject);
begin
  SynEdit1.CutToClipboard;
end;
 
procedure TForm1.Action8Execute(Sender: TObject);
begin
  SynEdit1.PasteFromClipboard;
end;
 
procedure TForm1.Action9Execute(Sender: TObject);
begin
  SynEdit1.Undo;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  OriginalCaption:= 'Проверка Pascal (Паскаль) кода с учётом стандартов';
end;
 
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if key=VK_TAB then
    SynEdit1.SelText:='  '
end;
 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  LoadStringGrid(Form3.StringGrid1, 'ShortCut.txt');
end;
 
 
            {переход от ошибки к строке с ней}
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
 
begin
 
   with TRegExpr.Create do
  try
    Expression := '\[line (\d+)\]'; // Ищем номер строки в сообщении об ошибке
    if Exec(Item.Caption) then
    begin
      TheLine := StrToInt(Match[1]); // запоминаем найденный номер строки с ошибкой
      SynEdit1.Invalidate; // и заставляем SynEdit перерисоваться. При этом изменится цвет строки
    end;
  finally
    Free;
  end;
 
end;
 
 
 
 
procedure TForm1.N10Click(Sender: TObject);
begin
  Application.Terminate;
end;
 
procedure TForm1.N13Click(Sender: TObject);
begin
  SynEdit1.Undo;
end;
 
procedure TForm1.N14Click(Sender: TObject);
begin
  SynEdit1.Redo;
end;
 
procedure TForm1.N17Click(Sender: TObject);
begin
  Form2.Show;
end;
 
procedure TForm1.N21Click(Sender: TObject);
begin
  if Form1.FormStyle = fsNormal then
    Form1.FormStyle:= fsStayOnTop
  else
    Form1.FormStyle:= fsNormal
end;
 
procedure TForm1.N22Click(Sender: TObject);
var
  id, i, s: integer;
  stroka: string;
  n, k: integer;
 
begin
  ListView1.Clear;
  id:= 0;
  for i := 0 to SynEdit1.Lines.Count-1 do begin
 
  { do if не должно быть на одной строке }
  if Pos('do if', SynEdit1.Lines[i]) <> 0 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - do if не должен быть на одной строке');
      ListView1.Items.EndUpdate;
    end;
    { do begin не должно быть на одной строке }
    if Pos('do begin', SynEdit1.Lines[i]) <> 0 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - do begin не должен быть на одной строке');
      ListView1.Items.EndUpdate;
    end;
 
    { then begin не должно быть на одной строке }
    if Pos('then begin', SynEdit1.Lines[i]) <> 0 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - then begin не должен быть на одной строке');
      ListView1.Items.EndUpdate;
    end;
 
    { Проверка количества символов в строке - не должно быть более 80 в одной строке }
    if Length(SynEdit1.Lines[i]) > 80 then begin
      ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - не должно быть в строке более 80 символов. Разделите строку на части.');
      ListView1.Items.EndUpdate;
    end;
 
    { Проверка структивности операторов }
    if (Pos(': =', SynEdit1.Lines[i])) or (Pos(':=', SynEdit1.Lines[i])) <> 0 then begin
      if (Pos(' := ', SynEdit1.Lines[i])) <> 0 then begin
 
      end
      else begin
        ListView1.Items.BeginUpdate;
        ListView1.Items.Add;
        id:=id+1;
        ListView1.Items[id-1].Caption:=IntToStr(id);
        ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - операторы должны выглядить структурировано. Пример, как должно быть: B := C');
        ListView1.Items.EndUpdate;
      end;
    end;
 
    { проверка строк на содержание более одного оператора }
    k:=0;
    stroka:=SynEdit1.Lines[i];  //считываем строку
    for n := 1 to length(stroka) do
    if stroka[n] =';' then//выполняем подсчет символа а
    k:=k+1;
    if k > 1 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - каждая строка должна содержать не более одного оператора');
      ListView1.Items.EndUpdate;
    end;
 
 
    { Проверка пробелов после скобок и до скобок }
    if (Pos('[', SynEdit1.Lines[i])) or (Pos(']', SynEdit1.Lines[i])) <> 0 then begin
      if (Pos(' [', SynEdit1.Lines[i])) and ((Pos('] ', SynEdit1.Lines[i]))) <> 0 then begin
 
      end
      else begin
        ListView1.Items.BeginUpdate;
        ListView1.Items.Add;
        id:=id+1;
        ListView1.Items[id-1].Caption:=IntToStr(id);
        ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - должен быть пробел до открывающейся скобки "[" и после закрывающей скобки.');
        ListView1.Items.EndUpdate;
      end;
    end;
 
    { Проверка оператора if - он всегда должен располагаться как минимум на двух линиях }
    {if Pos('then', SynEdit1.Lines[i]) <> 0 then begin
      if  then
 
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - then begin не должен быть на одной строке');
      ListView1.Items.EndUpdate;
    end; }
 
    { else begin не должно быть на одной строке }
    if Pos('else begin', SynEdit1.Lines[i]) <> 0 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - else begin не должны быть на одной строке');
      ListView1.Items.EndUpdate;
    end;
 
     { зарезервированные слова - не работает}
 
 
    if Pos(a[i], SynEdit1.Lines[i]) <> 0 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - зарезервированные слова не должны заглавными буквами');
      ListView1.Items.EndUpdate;
    end;
 
  end;
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
25.05.2017, 16:42
Алилуййя! Еще бы свой код в правильную обертку Delphi завернул вместо просто Код, вообще умничка был бы
Посмотримс...
0
1 / 1 / 0
Регистрация: 02.04.2016
Сообщений: 122
25.05.2017, 16:45  [ТС]
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, SynEdit, SynMemo, Vcl.Menus,
  SynEditHighlighter, SynHighlighterPas, Vcl.ComCtrls, Vcl.ExtCtrls,
  Vcl.StdCtrls, Vcl.AppEvnts, System.Actions, Vcl.ActnList, Vcl.StdActns,
  Printers, Vcl.ToolWin, Vcl.ActnMan, Vcl.ActnCtrls,
  Vcl.PlatformDefaultStyleActnCtrls, Vcl.ImgList, Vcl.ActnMenus, SynEditPrint,
   SynEditMiscClasses, Vcl.Grids;
 
type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    SynPasSyn1: TSynPasSyn;
    N2: TMenuItem;
    StatusBar1: TStatusBar;
    SynEdit1: TSynEdit;
    Timer1: TTimer;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    N16: TMenuItem;
    N17: TMenuItem;
    N18: TMenuItem;
    N19: TMenuItem;
    N20: TMenuItem;
    N21: TMenuItem;
    ListView1: TListView;
    N22: TMenuItem;
    PopupMenu1: TPopupMenu;
    N23: TMenuItem;
    N24: TMenuItem;
    N25: TMenuItem;
    N26: TMenuItem;
    N27: TMenuItem;
    N28: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    ActionList1: TActionList;
    SearchFind1: TSearchFind;
    ActionManager1: TActionManager;
    ImageList1: TImageList;
    ActionToolBar1: TActionToolBar;
    Action2: TAction;
    Action3: TAction;
    Action4: TAction;
    Action5: TAction;
    Action6: TAction;
    Action1: TAction;
    Action7: TAction;
    Action8: TAction;
    N29: TMenuItem;
    N30: TMenuItem;
    N31: TMenuItem;
    N32: TMenuItem;
    N33: TMenuItem;
    N34: TMenuItem;
    N35: TMenuItem;
    N36: TMenuItem;
    N37: TMenuItem;
    N38: TMenuItem;
    N39: TMenuItem;
    Action9: TAction;
    Action10: TAction;
    Action11: TAction;
    Action12: TAction;
    Action13: TAction;
    procedure SynEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
    procedure N23Click(Sender: TObject);
    procedure N24Click(Sender: TObject);
    procedure N26Click(Sender: TObject);
    procedure N25Click(Sender: TObject);
    procedure N27Click(Sender: TObject);
    procedure N28Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N21Click(Sender: TObject);
    procedure N17Click(Sender: TObject);
    procedure SearchFind1BeforeExecute(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N22Click(Sender: TObject);
    procedure SynEdit1SpecialLineColors(Sender: TObject; Line: Integer;
      var Special: Boolean; var FG, BG: TColor);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure N8Click(Sender: TObject);
    procedure Action2Execute(Sender: TObject);
    procedure Action3Execute(Sender: TObject);
    procedure Action4Execute(Sender: TObject);
    procedure Action5Execute(Sender: TObject);
    procedure Action6Execute(Sender: TObject);
    procedure N30Click(Sender: TObject);
    procedure N29Click(Sender: TObject);
    procedure N31Click(Sender: TObject);
    procedure N32Click(Sender: TObject);
    procedure N33Click(Sender: TObject);
    procedure N39Click(Sender: TObject);
    procedure Action7Execute(Sender: TObject);
    procedure Action1Execute(Sender: TObject);
    procedure Action8Execute(Sender: TObject);
    procedure Action11Execute(Sender: TObject);
    procedure Action12Execute(Sender: TObject);
    procedure N38Click(Sender: TObject);
    procedure N36Click(Sender: TObject);
    procedure N37Click(Sender: TObject);
    procedure Action13Execute(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure SynEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Action9Execute(Sender: TObject);
    procedure Action10Execute(Sender: TObject);
    procedure N13Click(Sender: TObject);
    procedure N14Click(Sender: TObject);
    procedure ListView1SelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
 
  private
    { Private declarations }
 
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  ShowOstanovka : boolean = false;  //глобальная переменная
  OriginalCaption: string; // оригинальное название программы (главной формы)
  TheLine : Integer = -1;
  const a : array[1..5] of String[10]=('VAR','END','BEGIN','FUNCTION','IF');
implementation
 
{$R *.dfm}
 
uses Unit2_search, settings, RegExpr;
 
procedure LoadStringGrid(StringGrid: TStringGrid; FileName: string);
var
  T: TStringList;
  Row, Col, Count: integer;
begin
  T := TStringList.Create;
  T.LoadFromFile(FileName);
  StringGrid.RowCount := StrToIntDef(T.Strings[0], 1);
  StringGrid.ColCount := StrToIntDef(T.Strings[1], 1);
  T.Delete(0);
  Count := 0;
  for Row := 0 to StringGrid.RowCount - 1 do
    for Col := 0 to StringGrid.ColCount - 1 do begin
      Count := Count + 1;
      if T.Strings[Count] <> '' then
        StringGrid.Cells[Col, Row] := T.Strings[Count] else
        StringGrid.Cells[Col, Row] := '';
    end;
  T.Free;
end;
 
procedure PrintStrings(Strings: TStrings);
var
  Prn: TextFile;
  i: word;
begin
  AssignPrn(Prn);
  try
    Rewrite(Prn);
    try
      for i := 0 to Strings.Count - 1 do
        writeln(Prn, Strings.Strings[i]);
    finally
      CloseFile(Prn);
    end;
  except
    on EInOutError do
      MessageDlg('Ошибка печати текста.', mtError, [mbOk], 0);
  end;
end;
 
procedure TForm1.Action10Execute(Sender: TObject);
begin
  SynEdit1.Redo;
end;
 
procedure TForm1.Action11Execute(Sender: TObject);
begin
  Form2.Show;
end;
 
procedure TForm1.Action12Execute(Sender: TObject);
begin
  SynEdit1.Font.Size:= SynEdit1.Font.Size+2;
  StatusBar1.Panels[4].Text:= IntToStr(StrToInt(StatusBar1.Panels[4].Text)+20);
end;
 
procedure TForm1.Action13Execute(Sender: TObject);
begin
  SynEdit1.Font.Size:= SynEdit1.Font.Size-2;
  StatusBar1.Panels[4].Text:= IntToStr(StrToInt(StatusBar1.Panels[4].Text)-20);
end;
 
procedure TForm1.Action1Execute(Sender: TObject);
begin
  SynEdit1.CopyToClipboard;
end;
 
procedure TForm1.Action2Execute(Sender: TObject);
begin
  Form1.Caption:= OriginalCaption;
  SynEdit1.Clear;
end;
 
procedure TForm1.Action3Execute(Sender: TObject);
begin
  if OpenDialog1.Execute then begin
    SynEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
    Form1.Caption:= OriginalCaption + ' - [' + OpenDialog1.FileName + ']';
  end;
end;
 
procedure TForm1.Action4Execute(Sender: TObject);
begin
  SynEdit1.Lines.SaveToFile(OpenDialog1.FileName);
end;
 
procedure TForm1.Action5Execute(Sender: TObject);
begin
  if SaveDialog1.Execute then begin
    SynEdit1.Lines.SaveToFile(SaveDialog1.FileName);
    Form1.Caption:= OriginalCaption + ' - [' + SaveDialog1.FileName + ']';
    OpenDialog1.FileName:= SaveDialog1.FileName;
  end;
end;
 
procedure TForm1.Action6Execute(Sender: TObject);
begin
  PrintStrings(SynEdit1.Lines);
end;
 
procedure TForm1.Action7Execute(Sender: TObject);
begin
  SynEdit1.CutToClipboard;
end;
 
procedure TForm1.Action8Execute(Sender: TObject);
begin
  SynEdit1.PasteFromClipboard;
end;
 
procedure TForm1.Action9Execute(Sender: TObject);
begin
  SynEdit1.Undo;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  OriginalCaption:= 'Проверка Pascal (Паскаль) кода с учётом стандартов';
end;
 
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if key=VK_TAB then
    SynEdit1.SelText:='  '
end;
 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  LoadStringGrid(Form3.StringGrid1, 'ShortCut.txt');
end;
 
 
            {переход от ошибки к строке с ней}
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
 
begin
 
   with TRegExpr.Create do
  try
    Expression := '\[line (\d+)\]'; // Ищем номер строки в сообщении об ошибке
    if Exec(Item.Caption) then
    begin
      TheLine := StrToInt(Match[1]); // запоминаем найденный номер строки с ошибкой
      SynEdit1.Invalidate; // и заставляем SynEdit перерисоваться. При этом изменится цвет строки
    end;
  finally
    Free;
  end;
 
end;
 
 
 
 
procedure TForm1.N10Click(Sender: TObject);
begin
  Application.Terminate;
end;
 
procedure TForm1.N13Click(Sender: TObject);
begin
  SynEdit1.Undo;
end;
 
procedure TForm1.N14Click(Sender: TObject);
begin
  SynEdit1.Redo;
end;
 
procedure TForm1.N17Click(Sender: TObject);
begin
  Form2.Show;
end;
 
procedure TForm1.N21Click(Sender: TObject);
begin
  if Form1.FormStyle = fsNormal then
    Form1.FormStyle:= fsStayOnTop
  else
    Form1.FormStyle:= fsNormal
end;
 
procedure TForm1.N22Click(Sender: TObject);
var
  id, i, s: integer;
  stroka: string;
  n, k: integer;
 
begin
  ListView1.Clear;
  id:= 0;
  for i := 0 to SynEdit1.Lines.Count-1 do begin
 
  { do if не должно быть на одной строке }
  if Pos('do if', SynEdit1.Lines[i]) <> 0 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - do if не должен быть на одной строке');
      ListView1.Items.EndUpdate;
    end;
    { do begin не должно быть на одной строке }
    if Pos('do begin', SynEdit1.Lines[i]) <> 0 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - do begin не должен быть на одной строке');
      ListView1.Items.EndUpdate;
    end;
 
    { then begin не должно быть на одной строке }
    if Pos('then begin', SynEdit1.Lines[i]) <> 0 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - then begin не должен быть на одной строке');
      ListView1.Items.EndUpdate;
    end;
 
    { Проверка количества символов в строке - не должно быть более 80 в одной строке }
    if Length(SynEdit1.Lines[i]) > 80 then begin
      ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - не должно быть в строке более 80 символов. Разделите строку на части.');
      ListView1.Items.EndUpdate;
    end;
 
    { Проверка структивности операторов }
    if (Pos(': =', SynEdit1.Lines[i])) or (Pos(':=', SynEdit1.Lines[i])) <> 0 then begin
      if (Pos(' := ', SynEdit1.Lines[i])) <> 0 then begin
 
      end
      else begin
        ListView1.Items.BeginUpdate;
        ListView1.Items.Add;
        id:=id+1;
        ListView1.Items[id-1].Caption:=IntToStr(id);
        ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - операторы должны выглядить структурировано. Пример, как должно быть: B := C');
        ListView1.Items.EndUpdate;
      end;
    end;
 
    { проверка строк на содержание более одного оператора }
    k:=0;
    stroka:=SynEdit1.Lines[i];  //считываем строку
    for n := 1 to length(stroka) do
    if stroka[n] =';' then//выполняем подсчет символа а
    k:=k+1;
    if k > 1 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - каждая строка должна содержать не более одного оператора');
      ListView1.Items.EndUpdate;
    end;
 
 
    { Проверка пробелов после скобок и до скобок }
    if (Pos('[', SynEdit1.Lines[i])) or (Pos(']', SynEdit1.Lines[i])) <> 0 then begin
      if (Pos(' [', SynEdit1.Lines[i])) and ((Pos('] ', SynEdit1.Lines[i]))) <> 0 then begin
 
      end
      else begin
        ListView1.Items.BeginUpdate;
        ListView1.Items.Add;
        id:=id+1;
        ListView1.Items[id-1].Caption:=IntToStr(id);
        ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - должен быть пробел до открывающейся скобки "[" и после закрывающей скобки.');
        ListView1.Items.EndUpdate;
      end;
    end;
 
    { Проверка оператора if - он всегда должен располагаться как минимум на двух линиях }
    {if Pos('then', SynEdit1.Lines[i]) <> 0 then begin
      if  then
 
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - then begin не должен быть на одной строке');
      ListView1.Items.EndUpdate;
    end; }
 
    { else begin не должно быть на одной строке }
    if Pos('else begin', SynEdit1.Lines[i]) <> 0 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - else begin не должны быть на одной строке');
      ListView1.Items.EndUpdate;
    end;
 
     { зарезервированные слова - не работает}
 
 
    if Pos(a[i], SynEdit1.Lines[i]) <> 0 then begin
        ListView1.Items.BeginUpdate;
      ListView1.Items.Add;
      id:=id+1;
      ListView1.Items[id-1].Caption:=IntToStr(id);
      ListView1.Items[id-1].SubItems.Add('[Строка: '+IntToStr(i+1)+'] - зарезервированные слова не должны заглавными буквами');
      ListView1.Items.EndUpdate;
    end;
 
  end;
МОЖЕТ БЫТЬ ТАК?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
25.05.2017, 16:50
я только намекну...
Delphi
1
2
3
FUncTIon BrokeAnEye();
BeGin
ENd;
0
1 / 1 / 0
Регистрация: 02.04.2016
Сообщений: 122
25.05.2017, 16:54  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
я только намекну...
какая строка?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
25.05.2017, 16:58
BEGIN по-вашему - неправильно
а BeGIn - правильно ?
0
1 / 1 / 0
Регистрация: 02.04.2016
Сообщений: 122
25.05.2017, 16:59  [ТС]
нужно хотя бы чтобы так работало, остальные варианты слов добавить будет легче правильно? Да и врядли кто то в коде будет писать вот так "BeGiN"
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
25.05.2017, 17:14
На мой взгляд, неверна базовая концепция написания форматированного кода. Пользователь может писать как ему угодно, а вот процессор должен привести этот текст в удобный для обработки вид. Переформатировать исходный текст или нет это уже вторая задача, а вы все в кучу смешиваете.
0
Модератор
 Аватар для D1973
9954 / 6489 / 2461
Регистрация: 21.01.2014
Сообщений: 27,490
Записей в блоге: 3
25.05.2017, 17:19
Цитата Сообщение от USIXA Посмотреть сообщение
остальные варианты слов добавить будет легче правильно?
Да нет, неправильно... одно только слово begin столько вариантов написания подразумевает, что мама не горюй... а уж слово implementation...
Если по доброму, то Дельфи - регистронезависимый, в отличие от, к примеру, С++, язык, поэтому все Ваши проверки мне изначально показались какими-то надуманными...
0
1 / 1 / 0
Регистрация: 02.04.2016
Сообщений: 122
25.05.2017, 17:31  [ТС]
будет какой нибудь дельный совет что я должен делать? или я зря код кидал?
на словах я все понимаю, код мне нужен код, как тут вы раньше писали?

Добавлено через 4 минуты
ЛЮДИИ
0
 Аватар для Animalia
225 / 80 / 35
Регистрация: 01.04.2017
Сообщений: 182
25.05.2017, 18:53
а уж слово implementation...
да всего то 16384 варианта.
а вот если заставить прогу проверять и имена системных переменных... жду CDefaultTwoDigitYearCenturyWindow с его 8 миллиардами вариантов
или я зря код кидал?
как по мне, так вы его зря писали. Так сказать 'зашли не с той стороны'. Бывает такое, на форуме хватает таких примеров. Когда все что написано - приходится переписывать заново.
Почему? Комментарии никто не отменял, и в них можно писать все что душе угодно
Delphi
1
2
3
4
Procedure Blob;
begin
  // do BEGIN if + - * / [[ [ ] ]] THEN  eLSe BEgin very very very long long long string
end;
с точки зрения компилятора вполне корректная конструкция, а вот ваша программа будет считать ее нарушаюшей все мыслимые и немыслимые правила.
Далее вы ищите к примеру
Delphi
1
if Pos('then begin', SynEdit1.Lines[i]) <> 0 then begin
(довольно иронично на мой взгляд)
тоесть 'then begin' - неправильно, а вот 'then BEGIN' сойдет?

Подобные задачи решаются через парсинг.
Код разбивается на блоки, блоки разбиваются еще на блоки и т.д. пока не останется четкая структура по которой уже и проверять соответствие правилам. А простой поиск по тексту (заметьте тексту, не коду) - пустая трата времени.

Хотя как вариант регулярками удалить все комментарии и затем только прогонять по вашей программе, но тогда нумерация строк улетает в трубу.
Да и регулярка, которая вырезает комментарий, но пропускает директиву компилятора, но при этом вырезает закомментированую директиву компилятора...
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
25.05.2017, 19:51
изначальная идея программы - в итоге мартышкин труд
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2017, 19:51

Скрипты перестали различать $_POST['var'], $_SESSION['var'] и просто $var
После переезда на новый хостинг с php 5.2 на php 5.3 обнаружил глюк. Почему то скрипты перестали различать $_POST, $_SESSION и просто...

_GET['var'] - Ошибка "Notice: Undefined index: var"
Я создал один файл 01.php (я пользуюсь PHP Expert Editor 3.3) и написал в нем следующий код: &lt;html&gt; &lt;head&gt; ...

/var/lock и /var/run, как будто нет таких директорий
Доброго времени суток! Система CentOS 5.3. На системе настроен nat на POSTROUTING некоторых ip адресов. Работа системы была...

Почему Мандрива не захотела копировать диск в /var/ftp и /var?
На пробу я сделал два раздела /var /var/ftp Оба побольше 5 гектаров, но мандрива не стала предлагать скопировать диск. Почему? Я...

Можно ли выполнить условие $var===false, если переменная $var другого типа (не boolean)?
Сокет-сервер, использующий скрипт на PHP под Linux, разрывает соединение со стороны сервера, если для данных $input, полученных с клиента,...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru