Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 131

Добавить строчки в ComboBox из переменной

04.03.2022, 19:45. Показов 3310. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, форумчане! Продолжаю бороться с программой и ввиду отсутствия навыков программирования прошу помощи. Поиски в Интернете не дали результатов. Мне нужно добавить строчки в ComboBox из переменной, в которую я записал имя сетевого интерфейса.
Общая задача такова: при запуске программы, есть выпадающий список со всеми сетевыми интерфейсами на устройстве, после выбора одного из интерфейсов-вводится IP по которому хотят произвести захват трафика. После нажатия кнопки старт, открывается Tshark и пакеты начинают "грабиться".

widget.cpp
C++
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
#include <QtDebug>
#include "windows.h"
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
 
    QProcess* console=new QProcess();
        console->setCreateProcessArgumentsModifier
        (
            [](QProcess::CreateProcessArguments *args)
            {
                args->flags |= CREATE_NEW_CONSOLE;
                args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
            }
        );
        console->start("c:\\windows\\system32\\cmd.exe", QStringList() << "/K" << "cd /d C:/Program Files/Wireshark && tshark.exe" << "-i" << "5");
 
    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
 
    for(QNetworkInterface n : list)
    {
        qDebug() << "Device: "<<n.humanReadableName();
        QList<QNetworkAddressEntry> entryList = n.addressEntries();
        for(QNetworkAddressEntry m : entryList)
        {
            qDebug()<<"IP Address: "<<m.ip().toString();
        }
 
    }
 
    ui->setupUi(this);
}
 
Widget::~Widget()
{
    delete ui;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.03.2022, 19:45
Ответы с готовыми решениями:

ValueListEditor как добавить строчки и добавить значения в них
ValueListEditor как добавить строчки и добавить значения в них

Выбор строчки в ComboBox
Ситуация такая. В Access, через ADODB устанавливаю recordset для подчинненой формы, на которой есть комбобокс, значения которого выбираю...

C# Выбранный элемент в comboBox добавить к тексту в этом же comboBox
Здравствуйте Есть один comboBox, в котором будет около 20 элементов в выпадающем списке. Нужно когда пользователь выбирал этот...

49
фрилансер
 Аватар для Алексей1153
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,234
05.03.2022, 21:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dedy111ka Посмотреть сообщение
Т.е. вместо qMenu лучше ComboBox?
тогда да. А строки можно закинуть в setData элементов
0
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 131
05.03.2022, 22:28  [ТС]
Ender Che, как это реализовывается? А то, полагаю, Алексею уже немного поднадоел.
0
 Аватар для Ender Che
520 / 410 / 77
Регистрация: 29.05.2018
Сообщений: 1,351
05.03.2022, 22:40
Dedy111ka, вы пытаетесь. Поэтому никто никому не надоел.
Завтра. Если никто раньше не придумает, как это сделать.
0
фрилансер
 Аватар для Алексей1153
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,234
05.03.2022, 22:57
Dedy111ka, примерно так

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
 
    ui->interfaces_combo->clear();
    foreach(const QNetworkInterface& i , list)
    {
        ui->interfaces_combo->addItem(i.humanReadableName(),QVariant::fromValue(i.addressEntries()));
    }
...
...

а где-то достаём текущий выбранный элемент

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
{
...
...
    auto list=ui->interfaces_combo->currentData().value<QList<QNetworkAddressEntry>>();
    QString text;
    foreach(const QNetworkAddressEntry& e, list)
    {
        text+=e.ip().toString()+"\n";
    }
    QMessageBox::information(this,{},text);
...
...
}
1
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 131
06.03.2022, 01:48  [ТС]
Ender Che, Приятно слышать, нет смысла от того, что мне просто код напишут, но если ничего не идет, я лучше спрошу

Добавлено через 24 секунды
Алексей1153, Спасибо, попробую днем!
0
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 131
06.03.2022, 16:33  [ТС]
Алексей1153, Даже у самого получилось разобраться, куда засунуть "доставание выбранного элемента". Только работает криво, может, нужен другой виджет? Я выбрал Plain Text Edit. Получилось так, что когда я выбираю Сетевой интерфейс, нужно нажать Enter в Plain Text Edit, тогда он выводит информацию.
0
фрилансер
 Аватар для Алексей1153
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,234
06.03.2022, 16:51
Лучший ответ Сообщение было отмечено Dedy111ka как решение

Решение

Dedy111ka, примерно так
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    ui->setupUi(this);
    ui->plainTextEdit->setLineWrapMode(QPlainTextEdit::LineWrapMode::NoWrap);
    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
 
    ui->interfaces_combo->clear();
    connect(ui->interfaces_combo,static_cast<void(QComboBox::*)(int index)>(&QComboBox::currentIndexChanged),this,[this](int index)
    {
        auto list=ui->interfaces_combo->currentData().value<QList<QNetworkAddressEntry>>();
        QString text;
        foreach(const QNetworkAddressEntry& e, list)
        {
            text+=e.ip().toString()+"\n";
        }
        ui->plainTextEdit->setPlainText(text);
    });
    foreach(const QNetworkInterface& i , list)
    {
        ui->interfaces_combo->addItem(i.humanReadableName(),QVariant::fromValue(i.addressEntries()));
    }
1
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 131
06.03.2022, 22:21  [ТС]
Алексей1153, Очень круто получилось, спасибо большое! Сейчас буду дальше мучаться сидеть.

Алексей1153, я написал комментарии, как понимаю написанный код, не могли бы вы глянуть?

C++
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
#include "widget.h"
#include "ui_widget.h"
#include <QtDebug>
#include "windows.h"
#include <QMenu>
#include <QMessageBox>
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
//строка без переноса при выводе IP в InfoPTE
    ui->InfoPTE->setLineWrapMode(QPlainTextEdit::LineWrapMode::NoWrap);
 
    // в переменную lits записываем список всех сетевых интерфейсов, найденных с помощью allInterfaces()
    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
 
    //connect - соединяем InterfaceList и QComboBox?
    //static cast-удаляет или добавляет const и volatile, новый тип - <void(QComboBox::*)(int index)>
    //приводим к новому типу - (&QComboBox::currentIndexChanged),this,[this](int index)
    connect(ui->InterfaceList,static_cast<void(QComboBox::*)(int index)>(&QComboBox::currentIndexChanged),this,[this](int index)
        {
            //добавляем в list данные со значениеями из QNetworkAddressEntry
            auto list=ui->InterfaceList->currentData().value<QList<QNetworkAddressEntry>>();
            QString text;
            //для каждого значения из list ставим значение e
            foreach(const QNetworkAddressEntry& e, list)
            {
                //каждому значению e присваиваем IP, который является строкой
                text+=e.ip().toString()+"\n";
            }
            
            //возвращает текск редактирования, как обычный текст в InfoPTE
            ui->InfoPTE->setPlainText(text);
        });
        
        //для каждого значения в list ставим значение i
        foreach(const QNetworkInterface& i , list)
        {   
            // в InterfaceList добавляем humanReadableName
            // возвращяет копию значения addressEntries?
            ui->InterfaceList->addItem(i.humanReadableName(),QVariant::fromValue(i.addressEntries()));
        }
0
фрилансер
 Аватар для Алексей1153
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,234
06.03.2022, 22:31
Dedy111ka,

C++ (Qt)
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
#include "widget.h"
#include "ui_widget.h"
#include <QtDebug>
#include "windows.h"
#include <QMenu>
#include <QMessageBox>
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    //отключение автоматического переноса строки
    ui->InfoPTE->setLineWrapMode(QPlainTextEdit::LineWrapMode::NoWrap);
 
    //в переменной list сохраняем список всех сетевых интерфейсов, найденных с помощью allInterfaces()
    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
 
    //connect - соединяем сигнал изменения индекса в InterfaceList с обработчиком (лямбда)
    //static_cast-позволяет выбрать нужную перегрузку сигнала
    connect(ui->InterfaceList,static_cast<void(QComboBox::*)(int index)>(&QComboBox::currentIndexChanged),this,[this](int index)
        {
            //достаём данные из текущего элемента комбы
            auto list=ui->InterfaceList->currentData().value<QList<QNetworkAddressEntry>>();
            QString text;
            //все адреса собираем в одну строку, разделяя переносом строки
            foreach(const QNetworkAddressEntry& e, list)
            {
                text+=e.ip().toString()+"\n";
            }
            
            //устанавливаем получившийся список в контрол
            ui->InfoPTE->setPlainText(text);
        });
        
        //список адресов каждого элемента кладём в комбу с соответствующей человекочитабельной надписью
        foreach(const QNetworkInterface& i , list)
        {   
            ui->InterfaceList->addItem(i.humanReadableName(),QVariant::fromValue(i.addressEntries()));
        }
Добавлено через 41 секунду
Dedy111ka, да вроде и без комментариев всё самодокументировано )
0
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 131
06.03.2022, 22:40  [ТС]
Алексей1153, просто для своего понимания, как вы сделали то, что у меня не получалось. Хотя бы синтаксис запомнить.
0
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 131
07.03.2022, 19:30  [ТС]
Алексей1153, День добрый, а вопрос про on_InterfaceList_activated можно в этой же теме?
0
фрилансер
 Аватар для Алексей1153
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,234
07.03.2022, 19:51
Dedy111ka, привет. А зачем у меня спрашивать разрешение?
0
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 131
07.03.2022, 19:54  [ТС]
Алексей1153, Ну мало ли)

Добавлено через 2 минуты
Вот, что получилось, когда я пытался при выборе разных строк в ComboBox`е передавать в cmd разные параметры. Но у меня возник вопрос. Как прописывать индекс не в ручную, я же заранее не буду знать, сколько сетевых интерфейсов на устройстве.

C++
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
void Widget::on_InterfaceList_activated(int index)
{
    if(index == 0)
    {
        QProcess* console=new QProcess();
            console->setCreateProcessArgumentsModifier
            (
                [](QProcess::CreateProcessArguments *args)
                {
                    args->flags |= CREATE_NEW_CONSOLE;
                    args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
                }
            );
        console->start("c:\\windows\\system32\\cmd.exe", QStringList() << "/K" << "cd /d C:/Program Files/Wireshark && tshark.exe" << "-i" << "9");
 
    }
 
   else if(index == 1)
   {
        QProcess* console=new QProcess();
            console->setCreateProcessArgumentsModifier
            (
                [](QProcess::CreateProcessArguments *args)
                {
                    args->flags |= CREATE_NEW_CONSOLE;
                    args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
                }
            );
        console->start("c:\\windows\\system32\\cmd.exe", QStringList() << "/K" << "cd /d C:/Program Files/Wireshark && tshark.exe" << "-i" << "7");
   }
   else if(index == 2)
   {
         QProcess* console=new QProcess();
             console->setCreateProcessArgumentsModifier
             (
                 [](QProcess::CreateProcessArguments *args)
                 {
                     args->flags |= CREATE_NEW_CONSOLE;
                     args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
                 }
             );
         console->start("c:\\windows\\system32\\cmd.exe", QStringList() << "/K" << "cd /d C:/Program Files/Wireshark && tshark.exe" << "-i" << "6");
   }
   else if(index == 3)
   {
         QProcess* console=new QProcess();
             console->setCreateProcessArgumentsModifier
             (
                 [](QProcess::CreateProcessArguments *args)
                 {
                     args->flags |= CREATE_NEW_CONSOLE;
                     args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
                 }
             );
         console->start("c:\\windows\\system32\\cmd.exe", QStringList() << "/K" << "cd /d C:/Program Files/Wireshark && tshark.exe" << "-i" << "5");
   }
   else if(index == 4)
   {
         QProcess* console=new QProcess();
             console->setCreateProcessArgumentsModifier
             (
                 [](QProcess::CreateProcessArguments *args)
                 {
                     args->flags |= CREATE_NEW_CONSOLE;
                     args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
                 }
             );
         console->start("c:\\windows\\system32\\cmd.exe", QStringList() << "/K" << "cd /d C:/Program Files/Wireshark && tshark.exe" << "-i" << "4");
   }
   else if(index == 5)
   {
         QProcess* console=new QProcess();
             console->setCreateProcessArgumentsModifier
             (
                 [](QProcess::CreateProcessArguments *args)
                 {
                     args->flags |= CREATE_NEW_CONSOLE;
                     args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
                 }
             );
         console->start("c:\\windows\\system32\\cmd.exe", QStringList() << "/K" << "cd /d C:/Program Files/Wireshark && tshark.exe" << "-i" << "8");
   }
 
}
0
фрилансер
 Аватар для Алексей1153
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,234
07.03.2022, 19:59
Dedy111ka, привет. А зачем у меня спрашивать разрешение?

Цитата Сообщение от Dedy111ka Посмотреть сообщение
if(index == 0)
    {
        QProcess* console=new QProcess();
            console->setCreateProcessArgumentsModifier
            (
                [](QProcess::CreateProcessArguments *args)
                {
                    args->flags |= CREATE_NEW_CONSOLE;
                    args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
                }
            );
        console->start("c:\\windows\\system32\\cmd.exe ", QStringList() << "/K" << "cd /d C:/Program Files/Wireshark && tshark.exe" << "-i" << "9");
}
я вижу, что эта часть - повторяется, меняется только только окончание строки ("9")

эту данную эти данные можно разместить в setData элемента списка. Оттуда по индексу доставать и подставлять
0
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 131
07.03.2022, 20:03  [ТС]
Алексей1153, основной вопрос в том, сколько этих индексов. Я знаю, что у меня на ПК 6 сетевыйх интерфейсов, а если на каком нибудь другом устройстве их будет 7 или 5?
0
фрилансер
 Аватар для Алексей1153
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,234
07.03.2022, 22:12
Dedy111ka, пусть их будет сколько угодно. У каждого элемента будут свои данные
0
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 131
08.03.2022, 01:29  [ТС]
Алексей1153, еще вопрос, я сделал переменную, в которой хранится IP-адрес, вводимый с клавиатуры, но не получается добавить его к исполению в cmd. Я понимаю, что это не правильно, но не знаю, как ввести туда переменную, при условии того, что все это в " ". Нужно как то преобразовать тип?

C++
1
2
3
4
5
6
7
   float s = 0;
 
void Widget::on_PBN_IP_clicked()
{
    float s = ui->lineEdit_IP->text().toFloat();
    qDebug() << s;
}
C++
1
console->start("c:\\windows\\system32\\cmd.exe", QStringList() << "/K" << "cd /d C:/Program Files/Wireshark && tshark.exe" << "-i" << "9" << "host" << s);
Ошибка:
C:\qt progi\myIP_v1\widget.cpp:116: error: invalid operands to binary expression ('QStringList' and 'float')
0
фрилансер
 Аватар для Алексей1153
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,234
08.03.2022, 09:56
Dedy111ka,

C++ (Qt)
1
2
3
4
5
    console->start
    (
        "c:\\windows\\system32\\cmd.exe"
        ,{ "/K", "cd /d C:/Program Files/Wireshark && tshark.exe" , "-i" , "9" , "host" , QString::number(s)}
    );
0
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 131
08.03.2022, 17:33  [ТС]
Алексей1153, Проверил через qDebug, он передает s = 0. Вводил "172.20.10.2". Я так понял, это из за ".", получается, нельзя использовать number?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 else if(index == 0)
   {
         QProcess* console=new QProcess();
             console->setCreateProcessArgumentsModifier
             (
                 [](QProcess::CreateProcessArguments *args)
                 {
                     args->flags |= CREATE_NEW_CONSOLE;
                     args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
                 }
             );
             console->start
             (
                         "c:\\windows\\system32\\cmd.exe",
                         {"/K","cd /d C:/Program Files/Wireshark && tshark.exe", "-i", "5", "host", QString::number(s)}
             );
             qDebug() << s;
   }
0
фрилансер
 Аватар для Алексей1153
6486 / 5714 / 1133
Регистрация: 11.10.2019
Сообщений: 15,234
08.03.2022, 17:48
Цитата Сообщение от Dedy111ka Посмотреть сообщение
он передает s = 0
а кто - он ? Кто передаёт ?

Цитата Сообщение от Dedy111ka Посмотреть сообщение
QString::number
- эта функция конвертирует число в строку. А если УЖЕ есть строка, то конвертировать и не надо

Добавлено через 27 секунд
или я не понимаю, про что вопрос
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.03.2022, 17:48
Помогаю со студенческими работами здесь

Чтение переменной из файла и занесение данных определенной переменной в combobox
Как сделать чтение из бинарного файла определенной переменной, а после занеся ее в combobox . (коллекции)

Вывод в Edit числа в зависимости от выбранной строчки в ComboBox
Здравствуйте. Итак, имеется ComboBox с 4мя строчками, при выборе той или иной строчки, в Edit должно вывестись определенное значение. Но...

Добавить уникальные строчки в бд
Возможно сразу, без проверок. Записать строчки в бд, только те, которых еще нет. То есть одно из полей содержит уникальное...

Добавить элемент списка ComboBox из ComboBox'a
Такой вопрос: вот у меня есть комбобокс с возможностью ручного ввода. Как сделать так, чтобы введённое значение добавлялось в выпадающий...

Как вывести значение переменной с новой строчки
var vk = $('#vkontakte_count'); for (i=1; i&lt;=10; i++) { vk.html(vk.html() + e.response.items.id) } &lt;div...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru