Окно типа модального, не приостанавливающее выполнение кода

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 12.08.2009 (Ср) 16:05

Как сделать окно, которое было бы поверх окон приложения (как модальное), но не приостанавливало выполнение кода немодальных форм?

Просто мне нужно окно, в котором бы отображался прогресс выполнения некоторой операции.

karlex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 138
Зарегистрирован: 30.03.2009 (Пн) 20:25
Откуда: Пермский край, г.Кунгур

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение karlex » 12.08.2009 (Ср) 16:18

Show + vbModeless
Все гениальное — просто!
-------------------------------------
Кто ищет — тот всегда найдет!
-------------------------------------
Лень — двигатель прогресса.
Прогресс — двигатель лени.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 12.08.2009 (Ср) 16:26

Указать владельца.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 12.08.2009 (Ср) 18:40

karlex писал(а):Show + vbModeless

Не работает, даже в компилированном приложении эти окна всё равно независимые (будто я ничего и не указывал).

Хакер писал(а):Указать владельца.

Указал. Получилось не то, что мне нужно:
1. Указал Show vbModelles, Me - открываемое окно, конечно, не прячется за другими окнами, но я легко могу переключить фокус на другие окна приложения.
2. Указал Show vbModal, Me - родительское окно оказалось замороженным.

У меня в приложении 3 формы - главная, ввода параметров и с ProgressBar. Сначала из главной формы вызывается форма ввода параметров (должна быть модальной, но "замораживать" главную форму не должна), затем форма для параметров скрывается и отображает форму с ProgressBar (аналогично).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 12.08.2009 (Ср) 18:47

должна быть модальной, но "замораживать" главную форму не должна

Ты подбирай слова. Модальность как раз и заключается в «заморозке».

На самом деле, внутри модально вызванного Show просто крутится свой ML. Если тебе нужен top-level ML, но c теми же спецэффектами, то вызывай с vbModelless, делая родителю .Enabled = False.

Хотя, зачем тебе top-level ML ты можешь объяснить?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 12.08.2009 (Ср) 19:28

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

Ты подбирай слова. Модальность как раз и заключается в «заморозке».

А я считал, что "модальная" - это "поверх всех окон"

Хакер писал(а):Хотя, зачем тебе top-level ML ты можешь объяснить?

Чтобы, пока будет выполняться сохранение большого объёма данных и будет отображено окно, где будет написано и показано в Progress Bar'е, сколько осталось ждать до конца сохранения, пользователь не мог получить доступ к главному окну, где всё равно ему делать нечего во время сохранения.
Последний раз редактировалось VBTerminator 12.08.2009 (Ср) 19:32, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 12.08.2009 (Ср) 19:31

пользователь не мог получить доступ к главному окну, где всё равно, там ему делать нечего во время сохранения.

А если по-русски?

Тем не менее, я так и не понял, как окно, показанное с помощью vbModal, даст пользователю получить доступ к главному окну. Как, объяснишь нам?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 12.08.2009 (Ср) 19:44

Хакер писал(а):А если по-русски?

Надеюсь, так будет понятнее:

Пользователь вводит данные в текстовые поля и нажимает кнопку "Сохранить". Текстовые поля образуют таблицу, размером 6х8, таких таблиц на форме 70 с лишним, соответственно, объём сохраняемой информации получается большим и сохранение идёт долго. Поэтому во время сохранения поверх форм появлется окошечко с надписью "Сохранено ... из ... (...%)" и прогресс-баром, наглядно отображающим эти проценты. Но перед появлением этого окошечка появляется другое окно, где указывается, куда сохранять данные. Так вот, мне требуется сначала модально отобразить эту форму, где указывается, куда надо сохранять, затем, при нажатии кнопки ОК, появляется это маленькое окошечко с процентами в заголовке, снять фокус с которого пользователь не должен. Не в то же время в главной форме находится регулярно возникающее событие, в котором и производятся вычисления, поэтому модальное (именно модальное) окно вывести я не могу, иначе на этом всплывающем окошке ничего не появится.
Надесь, ясно объяснил?

Хакер писал(а):Если тебе нужен top-level ML, но c теми же спецэффектами, то вызывай с vbModelless, делая родителю .Enabled = False

Большое спасибо!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 12.08.2009 (Ср) 19:54

Текстовые поля образуют таблицу, размером 6х8, таких таблиц на форме 70

:shock:
Господи, дай мне везения никогда не встретиться с такой сатанинской программой.


Надесь, ясно объяснил?

То есть тебя тревожит, что твои события, которые производят процесс, не происходят, пока «горит» модальное окно, отображающее процесс?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 12.08.2009 (Ср) 20:32

Хакер писал(а):
Текстовые поля образуют таблицу, размером 6х8, таких таблиц на форме 70

:shock:

Это называется "расписание занятий": на форме: 8 уроков * 6 дней недели; в массиве, который я сохраняю в файл: 8 уроков * 6 дней недели * 11 классов * 7 литер классов ("А", "Б", "В" и т. д.). :D
Надеюсь, это поможет оценить масштаб ситуации?

Хакер писал(а):То есть тебя тревожит, что твои события, которые производят процесс, не происходят, пока «горит» модальное окно, отображающее процесс?

Да

Добавлено: Я тоже понял масштаб ситуации, поэтому оставил на форме только одну "таблицу", в которую загоняю данные из массива.
А так таблички были аккурат друг под другом, все, кроме одной были Visible=False, Enabled=False.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 12.08.2009 (Ср) 21:03

Надеюсь, это поможет оценить масштаб ситуации?

Нет, нисколько. Это ни разу не повод делать таблицу из кучи текстбоксов. Создавать 3700 окон, вместо того, чтобы юзать 1 грид — это настолько ламерство, что даже сложно подобрать подходящее слово.

Ну, хорошо, у тебя 3700 записей. И что? Ты хочешь сказать, что нужен прогрессбар, чтобы отобразить их запись в файл?


Да

И что тебе мешает делать все действия в модальной процедуре?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 12.08.2009 (Ср) 21:18

Хакер писал(а):И что тебе мешает делать все действия в модальной процедуре?

Тот факт, что эта таблица находится в отдельном юзер-контроле, вместе с обслуживающими её поцедурами и функциями. После каждой 8-й записи генерируется событие Update, в котором и происходит обновление окна статистики сохранения. Но проблема в том, что этот контрол находится в немодальном окне.

Хакер писал(а):Создавать 3700 окон, вместо того, чтобы юзать 1 грид — это настолько ламерство

А в каком OCX лежит этот грид, который считывает информацию не из базы данных, а из файла, и способен удовлетворитьтакую идею, как комбобоксы вместо текстовых полей?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 12.08.2009 (Ср) 21:38

Тот факт, что эта таблица находится в отдельном юзер-контроле, вместе с обслуживающими её поцедурами и функциями. После каждой 8-й записи генерируется событие Update, в котором и происходит обновление окна статистики сохранения. Но проблема в том, что этот контрол находится в немодальном окне.

Ну это кривая архитектура да и только. Почему события Update происходят после заполнения каждой восьмой записи? Вернее почему они происходят, когда открыто модальное окно прогресса сохранения?

Я говорил о гриде вообще, а не о каком-то конкретном.
Я бы использовал ListView в режиме Report. Я всегда его использую для всех гридов, дополняя недостающие возможности с помощью механизмов ListView, предусмотренных для этого.

Он лежит в comctl32.dll.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 12.08.2009 (Ср) 22:04

Хакер писал(а):Вернее почему они происходят, когда открыто модальное окно прогресса сохранения?

Потому что этот контрол, обрабатывает и сохраняет часть информации.

Не подскажете, будет ли лучшим вариантом, если данные для обработки я оформлю в коллекцию, а код сохранения (который будет брать содержимое этой коллекции) перенесу в это модальное окно?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 12.08.2009 (Ср) 22:07

У тебя у UserControl-а должен быть интерфейс доступа к твои данным. Хороший, гибкий интерфейс. И ты из модального окна должен обратиться к этому контролу, к тому самому интерфейсу доступа к данным, и сохранить эти данные.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 12.08.2009 (Ср) 22:13

Хакер писал(а):У тебя у UserControl-а должен быть интерфейс доступа к твои данным. Хороший, гибкий интерфейс. И ты из модального окна должен обратиться к этому контролу, к тому самому интерфейсу доступа к данным, и сохранить эти данные.

Вот я это и понял (правда несколько минут назад, но лучше поздно, чем никогда)

Хакер писал(а):Я бы использовал ListView в режиме Report. Я всегда его использую для всех гридов, дополняя недостающие возможности с помощью механизмов ListView, предусмотренных для этого.

А тогда как там сделать вместо ячеек поля со списком? Не добавлять же массив кнопок со стрелочками вниз около каждой ячейки грида?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 12.08.2009 (Ср) 22:37

Что за глупость «для каждой». У тебя что, могут сразу все 48 ячеек одновременно редактироваться? Отображай комбо поверх ячейки, когда начинается её редактирование, и скрывай, когда заканчивается.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 12.08.2009 (Ср) 22:43

Хакер писал(а):Что за глупость «для каждой». У тебя что, могут сразу все 48 ячеек одновременно редактироваться? Отображай комбо поверх ячейки, когда начинается её редактирование, и скрывай, когда заканчивается.

Большое спасибо! Сейчас и исправлю.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 12.08.2009 (Ср) 22:59

Не подскажете, как изменить высоту ячейки в ListView, а то комбо по высоте превышает размер ячейки, и внешний вид портится.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 12.08.2009 (Ср) 23:06

Шрифты что-ли разные?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 12.08.2009 (Ср) 23:19

Хакер писал(а):Шрифты что-ли разные?

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

Вариант с увеличением кегля шрифта в листвью не подходит - уже пробовал:
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 12.08.2009 (Ср) 23:23

Комбо чуть выше, и что? Центрируй среднюю линию комбо по средней линии LV-пункта.

PS. Мне другое интересно. У ListView нет такого понятия, как Cell, а есть понятие Row. Ты уже позаботился правильном выделении?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 13.08.2009 (Чт) 8:23

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

Код: Выделить всё
'Координаты размещения комбо (ось Y) в твипах. Срабатывает при условии, что высоты всех ячеек равны (а так оно и будет)
cmbCurrentLesson.Top = lvwLessons.Top + lvwLessons.SelectedItem.Top


И ещё: как узнать координаты выделенной ячейки грида по оси X (причём если мы кликнули не только в столбце "№") (для позиционирования комбо) и номер выделенного столбца (для обновления записи в заданной ячейке)?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 13.08.2009 (Чт) 8:55

Интересный. Я об этом и спросил. Предполагается, что ты будешь действовать гораздо более умнее, чем тупо обращать внимание на SelectedItem.

И, предполагось так же, что у тебя хватит догадливости положить TB внутрь LV. Но...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 13.08.2009 (Чт) 9:23

Хакер писал(а):И, предполагось так же, что у тебя хватит догадливости положить TB внутрь LV. Но...

А зачем мне TextBox, если я изменяю данные с помощью ComboBox'а

Кстати, а не проще ли будет сделать, как я хотел первоначально: массив линий, лейблов для подписи заголовков столбцов и строк, только сейчас вместо кучи ComboBox'ов юзать кучу лейблов и один комбобокс, отображаемый напротив выделенного лейбла? Тогда мы при отлове кликов на лейблы в "ячейках" "таблицы" мы сможем получить номер "ячейки" и точно вычислить её координаты, чтобы над ней поместить комбобокс:
Изображение

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Денис » 13.08.2009 (Чт) 9:44

VBTerminator
Да не мучайся ты с этим лист-вью. Если уж ты подключаешь OCX так заюзай MSFlexGrid тогда. Комбобоксы тебе всё равно внешние понадобятся, но хоть внятные ячейки у тебя появятся. А не subitems.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Хакер » 13.08.2009 (Чт) 9:53

VBTerminator писал(а):Кстати, а не проще ли будет сделать, как я хотел первоначально: массив линий, лейблов для подписи заголовков столбцов и строк, только сейчас вместо кучи ComboBox'ов юзать кучу лейблов и один комбобокс, отображаемый напротив выделенного лейбла? Тогда мы при отлове кликов на лейблы в "ячейках" "таблицы" мы сможем получить номер "ячейки" и точно вычислить её координаты, чтобы над ней поместить комбобокс

А рисовать всё это вместо использования кучи объектов что не позволяет? А SysHeader32 вместо самодельных заголовков колонок что мешает использовать? Откуда такая страсть к кривым решениям при наличии правильных?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение VBTerminator » 15.08.2009 (Сб) 10:26

Денис писал(а):Да не мучайся ты с этим лист-вью. Если уж ты подключаешь OCX так заюзай MSFlexGrid тогда. Комбобоксы тебе всё равно внешние понадобятся, но хоть внятные ячейки у тебя появятся. А не subitems.

Ну всё-таки желательно без заморочек с OCX, которые не предназначены для той цели, для которой и создаётся весь контрол, а именно - возможность изменения значения элемента путём выбора нового значения из Combo, появляющегося над выделенной ячейкой.

Хакер писал(а):А рисовать всё это вместо использования кучи объектов что не позволяет?

Спасибо за совет. Переделываю.

Хакер писал(а):А SysHeader32 вместо самодельных заголовков колонок что мешает использовать?

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

Хакер писал(а):Откуда такая страсть к кривым решениям при наличии правильных?

От незнания правильных решений.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Окно типа модального, не приостанавливающее выполнение кода

Сообщение Vi » 24.08.2009 (Пн) 8:09

VBTerminator писал(а):Как сделать окно, которое было бы поверх окон приложения (как модальное), но не приостанавливало выполнение кода немодальных форм? Просто мне нужно окно, в котором бы отображался прогресс выполнения некоторой операции.

Question: Проблема следующая — есть форма, которая открыта в модельном режиме. При выполнении определённых действий поверх неё должна появляться ворма с прогрессбаром. Проблема в следующем. Если прогресс-форму показывать немодальной, то среда не даст этого сделать (как известно, нельзя показать немодальную форму поверх модельной). Если же её делать модельной, то до её сокрытия останавливается выполнение кода . Как это можно обойти?

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

Исходная подпрограмма:
Код: Выделить всё
Private Sub CommandX_Click()
  ' Некоторые действия ДО...(modal)
  Me.Caption = "Do some stuff"

  Form2.Show vbModal, Form1

  ' Некоторые действия ПОСЛЕ...(modal)
  Me.Caption = "Do some more stuff"
End Sub

Развернутая программа:
Код: Выделить всё
Private WithEvents frm2 As Form

Private Sub CommandXX_Click()
  ' Некоторые действия ДО...(modal)
  Me.Caption = "Do some stuff"

  Set frm2 = Form2
  frm2.Show vbModeless, Form1
End Sub

Private Sub frm2_Load()
  Me.Enabled = False
End Sub

Private Sub frm2_Unload(Cancel As Integer)
  Me.Enabled = True
  Set frm2 = Nothing

  ' Некоторые действия ПОСЛЕ...(modal)
  Me.Caption = "Do some more stuff"
End Sub
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Mail.ru [бот], Yandex-бот и гости: 89

    TopList