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

EOSError 1400 "Недопустимый дескриптор окна"

21.06.2011, 09:05. Показов 19752. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
После того как перенес некоторый код в поток при завершении программы стала вылетать ошибка EOSError 1400 "Недопустимый дескриптор окна". Код программно помещает на форму некоторое количество некоторых компонентов(таких как tlabel, timage, tbutton итп). Когда код был вне потока все было нормально, причина появления ошибки мне совершенно не ясна т.к. код выполняется до конца без ошибок и по идее поток должен при этом завершаться.
Вот этот код:

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
procedure TNewThread.Execute;
begin
 
//Çàãðóæàåì äðóçåé
reply_friends:=Form1.HTTPAction('index.php?action=friends&login='+Login+'&pass='+Password);
 
if Pos('<error>', reply_friends) = 0 then begin
friends_count:=StrToInt(Pars('<count>',reply_friends,'<>'));
 
  for element_i2 := 0 to friends_count-1 do
  begin
    friend:=element_i2+1;
    friend_str:=IntToStr(friend);
    friend_id:=Pars('<start>'+friend_str+'<>',reply_friends,'<end>'+friend_str+'<>');
    element_i:=StrToInt(Pars('<id>',friend_id,'<>'));
  //Àâàòàðû
    avatars[element_i] := TImage.Create(nil);
    avatars[element_i].Width := 60;
    avatars[element_i].Height := 60;
    avatars[element_i].Left := 8;
    if element_i2 = 0 then avatars[element_i].Top := 8;
    if element_i2 > 0 then avatars[element_i].Top := 8+(8+avatars[element_i].Height)*element_i2;
    MS:= TMemoryStream.Create;
    PNG := TPNGObject.Create;
    Form1.HTTPActionMS('avatars/'+Pars('<id>',Pars('<start>'+friend_str+'<>',reply_friends,'<end>'+friend_str+'<>'),'<>')+'.png', MS);
    MS.Position := 0;
    PNG.LoadFromStream(MS);
    avatars[element_i].Picture.Assign(PNG);
    MS.Free;
    PNG.Free;
    avatars[element_i].Parent := sScrollBox1;
 
  //Íèê:
    el_nick1[element_i] := TsLabel.Create(nil);
    el_nick1[element_i].Left := 72;
    el_nick1[element_i].Caption := 'Íèê:';
    if element_i2 = 0 then el_nick1[element_i].Top := 8;
    if element_i2 > 0 then el_nick1[element_i].Top := 8+(8+60)*element_i2;
    el_nick1[element_i].Parent := sScrollBox1;
 
  //Íèê
    el_nick2[element_i] := TsLabel.Create(nil);
    el_nick2[element_i].Left := 120;
    el_nick2[element_i].Caption := Pars('<name>',friend_id,'<>');
    if element_i2 = 0 then el_nick2[element_i].Top := 8;
    if element_i2 > 0 then el_nick2[element_i].Top := 8+(8+60)*element_i2;
    el_nick2[element_i].Parent := sScrollBox1;
 
  //Ñòàòóñ:
    el_status1[element_i] := TsLabel.Create(nil);
    el_status1[element_i].Left := 72;
    el_status1[element_i].Caption := 'Ñòàòóñ:';
    if element_i2 = 0 then el_status1[element_i].Top := 24;
    if element_i2 > 0 then el_status1[element_i].Top := 24+(8+60)*element_i2;
    el_status1[element_i].Parent := sScrollBox1;
 
  //Ñòàòóñ
    el_status2[element_i] := TsLabel.Create(nil);
    el_status2[element_i].Left := 120;
    st:=StrToInt(Pars('<status>',friend_id,'<>'));
    if st=0 then el_status2[element_i].Caption := 'Â èãðå';
    if st=1 then el_status2[element_i].Caption := 'Â ñåòè';
    if st=2 then el_status2[element_i].Caption := 'Îòøåë';
    if st=3 then el_status2[element_i].Caption := 'Çàíÿò';
    if st=4 then el_status2[element_i].Caption := 'Îòêëþ÷åí îò ñåòè';
    if element_i2 = 0 then el_status2[element_i].Top := 24;
    if element_i2 > 0 then el_status2[element_i].Top := 24+(8+60)*element_i2;
    el_status2[element_i].Parent := sScrollBox1;
 
  //Èãðà:
    el_game1[element_i] := TsLabel.Create(nil);
    el_game1[element_i].Left := 72;
    el_game1[element_i].Caption := 'Èãðà:';
    if element_i2 = 0 then el_game1[element_i].Top := 40;
    if element_i2 > 0 then el_game1[element_i].Top := 40+(8+60)*element_i2;
    el_game1[element_i].Parent := sScrollBox1;
 
  //Èãðà
    el_game2[element_i] := TsLabel.Create(nil);
    el_game2[element_i].Left := 120;
    el_game2[element_i].Caption := Pars('<game>',friend_id,'<>');
    if element_i2 = 0 then el_game2[element_i].Top := 40;
    if element_i2 > 0 then el_game2[element_i].Top := 40+(8+60)*element_i2;
    el_game2[element_i].Parent := sScrollBox1;
 
  //Ñåðâåð:
    el_server1[element_i] := TsLabel.Create(nil);
    el_server1[element_i].Left := 72;
    el_server1[element_i].Caption := 'Ñåðâåð:';
    if element_i2 = 0 then el_server1[element_i].Top := 56;
    if element_i2 > 0 then el_server1[element_i].Top := 56+(8+60)*element_i2;
    el_server1[element_i].Parent := sScrollBox1;
 
  //Ñåðâåð
    el_server2[element_i] := TsLabel.Create(nil);
    el_server2[element_i].Left := 120;
    el_server2[element_i].Caption := Pars('<server>',friend_id,'<>');
    if element_i2 = 0 then el_server2[element_i].Top := 56;
    if element_i2 > 0 then el_server2[element_i].Top := 56+(8+60)*element_i2;
    el_server2[element_i].Parent := sScrollBox1;
 
  //Êíîïêà ìåíþ
    el_menu_btn[element_i] := TsButton.Create(form10);
    el_menu_btn[element_i].Left := 220;
    el_menu_btn[element_i].Caption := '^';
    el_menu_btn[element_i].Width := 17;
    el_menu_btn[element_i].Height := 17;
    el_menu_btn[element_i].Tag := StrToInt(Pars('<id>',friend_id,'<>'));
    el_menu_btn[element_i].OnClick:=Form10.onbtn;
    if element_i2 = 0 then el_menu_btn[element_i].Top := 8;
    if element_i2 > 0 then el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
    el_menu_btn[element_i].Parent := sScrollBox1;
 
  //ID
    el_id[element_i] := StrToInt(Pars('<id>',friend_id,'<>'));
 
  end;
 
sLabel1.Caption:='';
end
else
begin
sLabel1.Caption:=Pars('<error>',reply_friends,'<>');
end;
 
Form10.Loading_Anim.Visible:=false;
Form10.Loading_Anim.Animate:=false;
end;
Подскажите пожалуйста что в этом коде может вызывать эту ошибку?
Заранее спасибо.
P.S. Мб мысль глупая но всеже - а не может это быть из за того что если динамически создавать объекты в потоке то поток не завершиться после выполнения и будет продолжать жить пока эти объекты существуют?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2011, 09:05
Ответы с готовыми решениями:

Недопустимый дескриптор окна error 1400
Проблема в следующем: В отдельном потоке запускается обработка текстовых файлов на предмет поиска совпадений по строке. &quot;ОНО&quot;...

'System Error. Code: 1400. Недопустимый дескриптор окна'
Пишу многопоточную программу, а при ее закрытии после работы потоков выдает эту ошибку, из-за чего не могу понять, в интернете тоже...

Недопустимый дескриптор окна =)
Все пашет вот только... Обьясняю))) В общем Основное Приложение вызывает SendPPMsg из DLL и все замечательно, если не попытаться закрыть ОП...

29
 Аватар для MiheyJumaric
16 / 16 / 3
Регистрация: 14.06.2011
Сообщений: 64
21.06.2011, 09:16
Какая связь из Form10. Возможно при обращении к форме она не create.
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 09:49  [ТС]
Запуск потока происходит внутри той самой form10 по ее onshow т.ч. невозможно, полюс как я уже сказал код выполняется до конца без ошибок(я это проверил поставив в конец кода showmessage).

Добавлено через 29 минут
Нашел то что вызывает ошибку, эта строчка:
Delphi
1
el_menu_btn[element_i].Parent := sScrollBox1;
Но почему? У остальных компонентов родительским точно также является sScrollBox1...
0
 Аватар для MiheyJumaric
16 / 16 / 3
Регистрация: 14.06.2011
Сообщений: 64
21.06.2011, 09:50
К компонентам которые динамически созданы обращаетесь не из потока?
Желательно бы увидеть код где запускается поток и что там еще делается.
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:04  [ТС]
Нет обращаюсь не из потока, код который выше привел это полный код этого потока. Запускается поток из onshow как я уже говорил, вот код:
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
procedure Tform10.FormShow(Sender: TObject);
begin
Button1.SetFocus;
Timer1.Enabled:=true;
 
//Çàãðóæàåì ñâîè äàííûå
sLabel3.Caption:=auth_name;
image1.Picture:=form2.avatar.picture;
sComboBox1.ItemIndex:=Form2.sComboBox1.ItemIndex;
if auth_gamed <> '1' then begin
sLabel2.Caption:='';
sLabel8.Caption:='';
end;
if auth_gamed = '1' then begin
sLabel2.Caption:='Íå îïðåäåëåíî';
sLabel8.Caption:='Íå îïðåäåëåíî';
end;
 
if last_update_friends < time then begin
  Loading_Anim.Animate:=true;
  Loading_Anim.Visible:=true;
  TNewThread.Create(false);
 
  last_update_friends:=time+(1/(24*3600))*15;
  
  //Óäàëÿåì âñå ýëåìåíòû
  sScrollBox1.Free;
 
//ScrollBox
  sScrollBox1 := TsScrollBox.Create(Form10);
  sScrollBox1.Left := 16;
  sScrollBox1.Top := 88;
  sScrollBox1.Width := 265;
  sScrollBox1.Height := 361;
  sScrollBox1.HorzScrollBar.Visible := false;
  sScrollBox1.VertScrollBar.ButtonSize := 5;
  sScrollBox1.AutoMouseWheel := true;
  sScrollBox1.TabOrder := 1;
  sScrollBox1.Parent := Form10.sPanel1;
 
//sLabel1
  sLabel1 := TsLabel.Create(Form10);
  sLabel1.Left := 8;
  sLabel1.Width := 3;
  sLabel1.Height := 13;
  sLabel1.Top := 8;
  sLabel1.Parent := sScrollBox1;
end;
end;
0
 Аватар для MiheyJumaric
16 / 16 / 3
Регистрация: 14.06.2011
Сообщений: 64
21.06.2011, 10:16
Delphi
1
TNewThread.Create(false);
после
Delphi
1
2
3
4
5
6
7
8
9
10
sScrollBox1 := TsScrollBox.Create(Form10);
  sScrollBox1.Left := 16;
  sScrollBox1.Top := 88;
  sScrollBox1.Width := 265;
  sScrollBox1.Height := 361;
  sScrollBox1.HorzScrollBar.Visible := false;
  sScrollBox1.VertScrollBar.ButtonSize := 5;
  sScrollBox1.AutoMouseWheel := true;
  sScrollBox1.TabOrder := 1;
  sScrollBox1.Parent := Form10.sPanel1;
1
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:22
Ничего не пойму:
Delphi
1
2
3
4
5
6
TNewThread.Create(false);
 
  last_update_friends:=time+(1/(24*3600))*15;
  
  //Удаляем все элементы
  sScrollBox1.Free;
Тут что? Создаётся поток, и не известно, успеет он всё сделать, не успеет - всё равно sScrollBox1 сносим, а поток будет продолжать в несуществующий sScrollBox1 пихать компоненты?
Или я что-то путаю?
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:22  [ТС]
Ппц я и правда идиот... Странно что тут вообще чето работало... А еще странно то что это исправление ошибку не устранило. И еще один момент забыл написать - на форме все динамически созданные объекты показываются нормально, а вот эта злосчастная кнопка из за которой вылетает ошибка не показывается.
deathNC
да да я идиот xD хз каким волшебным образом но несморя на то что я такую глупую ошибку допустил он успевал xD но проблема все равно осталась после исправления этой глупой ошибки =\
Тут дело в том что открытие 10 формы предусмотрено не 1 разовое и данные там меняются, по этому при показе формы скорллбокс со всем содержимым стирается и создается заново если с момент последнего показа формы прошло более 15 секунд, вобщем я просто запуск потока поставил до абсурдности неправильно)
0
21.06.2011, 10:26

Не по теме:

Crystallon, если при сносе компонентов через метод Free будет ошибка, то пробуй сносить через Destroy :)
Это просто на будущее :D

1
 Аватар для MiheyJumaric
16 / 16 / 3
Регистрация: 14.06.2011
Сообщений: 64
21.06.2011, 10:26
Delphi
1
2
//Кнопка меню
    el_menu_btn[element_i] := TsButton.Create(form10);
на
Delphi
1
2
//Кнопка меню
    el_menu_btn[element_i] := TsButton.Create(nil);
1
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:28
А с этим проектом - отдельную процедуру писать, в которую перенести всё, что после запуска потока и запустить её по завершению потока. Это если другими путями не справишься!
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:30  [ТС]
Цитата Сообщение от MiheyJumaric Посмотреть сообщение
Delphi
1
2
//Кнопка меню
    el_menu_btn[element_i] := TsButton.Create(form10);
на
Delphi
1
2
//Кнопка меню
    el_menu_btn[element_i] := TsButton.Create(nil);
Уже пробовал, также пробовал всем остальным компонентам поставить form10 вместо nil, вообще ничего не меняется.

Цитата Сообщение от deathNC Посмотреть сообщение
А с этим проектом - отдельную процедуру писать, в которую перенести всё, что после запуска потока и запустить её по завершению потока. Это если другими путями не справишься!
Ды эт я понимаю, в том то и дело что там ничего не должно быть после запуска потока, я просто не туда его запуск поставил

А вообще это бред какойто...чем tbutton хуже других компонентов что приводит к такой проблеме...ведь его создание полностью аналогично созданию других компонентов...
0
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:35
Проверь индексы element_i и типы элементов. МОж не то что-то написал. А то поди el_menu_btn у тебя как TButton какой-нибудь объявлен, а создаёшь TSButton
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:36  [ТС]
Цитата Сообщение от deathNC Посмотреть сообщение
Проверь индексы element_i и типы элементов. МОж не то что-то написал. А то поди el_menu_btn у тебя как TButton какой-нибудь объявлен, а создаёшь TSButton
Это в первую очередь проверил, каждую строчку сверил =\
Плюс к тому я код просто скопировал из onshow, он раньше там был а не в потоке и нормально работал
И методом коментирования строчек и групп строчек я точно определил что если все оставить как есть и закомменить одну лишь строчку
Delphi
1
el_menu_btn[element_i].Parent := sScrollBox1;
ошибка уже не возникает, но кнопки на форме по прежнему отсутствуют, и еслиб они там были при этом то было бы очень странно)
0
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:45
Попробуй
Delphi
1
Form10.InsercControl([COLOR="DimGray"]<<<твой компонент>>>[/COLOR])ж
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:49  [ТС]
Цитата Сообщение от deathNC Посмотреть сообщение
Попробуй
Delphi
1
Form10.InsercControl([COLOR="DimGray"]<<<твой компонент>>>[/COLOR])ж
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
    el_menu_btn[element_i] := TsButton.Create(Form10);
    el_menu_btn[element_i].Left := 220;
    el_menu_btn[element_i].Caption := '^';
    el_menu_btn[element_i].Width := 17;
    el_menu_btn[element_i].Height := 17;
    el_menu_btn[element_i].Tag := StrToInt(Pars('<id>',friend_id,'<>'));
    el_menu_btn[element_i].OnClick:=Form10.onbtn;
    if element_i2 = 0 then el_menu_btn[element_i].Top := 8;
    if element_i2 > 0 then el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
    el_menu_btn[element_i].Parent := sScrollBox1;
 
    Form10.InsertControl(el_menu_btn[element_i]);
Ничего не изменилось =\
0
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:51
А
Delphi
1
el_menu_btn[element_i].Show;
если есть такое конечно
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:53  [ТС]
Есть) но все как было так и осталось =\
0
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:56
Это не относится к ошибке, но я не увидел смысла в первой строке и в условии второй:
Delphi
1
2
If element_i2 = 0 then el_menu_btn[element_i].Top := 8;
If element_i2 > 0 then el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
На мой взгляд:
Delphi
1
el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:58  [ТС]
Цитата Сообщение от deathNC Посмотреть сообщение
Это не относится к ошибке, но я не увидел смысла в первой строке и в условии второй:
Delphi
1
2
If element_i2 = 0 then el_menu_btn[element_i].Top := 8;
If element_i2 > 0 then el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
На мой взгляд:
Delphi
1
el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
Эт сейчас неважно) главное работает xD все равно исправление таких "извращений" не даст заметного прироста в производительности)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.06.2011, 10:58
Помогаю со студенческими работами здесь

Дескриптор окна
Из за чего эта ошибка? И как ее исправить?

System Error. Code 1400. Недопустимый дескриптор окна
Вобщем такая проблема есть БД акссес и программа все рабоет но при закрытии программы выдает ошибку System Error. Code 1400. Недопустимый...

Недопустимый дескриптор окна
Добрый вечер уважаемые форумчане. Вопрос конечно изъезженный но все таки для себя решения я не смог найти в гугле и на форумах. Поэтому...

Ошибка Exception EOSError in module .... System error. Code: 1400. Invalid window handle.
Доброе время суток! Я использовал поток в приложении CreateThread().. Примерно такая струкура приложения получилась: interface uses ...

EOSError 1400 “Недопустимый дескриптор окна”
Программа (назовём её My1.exe ) периодически обращается из потока к COM-порту. На компьютере есть и другие программы, которые так же могут...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru