Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154

Копирование строки при клике мышью

18.09.2025, 00:45. Показов 6023. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я хотел бы, чтобы в программе, когда нажимаешь на строчку левой кнопкой мыши, она копировалась, выделяясь например красным цветом, и когда ты копируешь другую, то выделение переходит на неё и строчка копировалась. Пробовал с ListBox, строчки копировались, но нельзя было добавить текст, который не должен копироваться. Пришлось заменить на RichTextBox, чтобы можно было вписать и строчки копируемые и некопируемые, но строчки не копируются. Также, я хотел сделать, чтобы текст выезжал при нажатии на заголовок, как показано на первом скриншоте(Типа есть несколько блоков с заголовками, нажимая на которые можно показать и скрыть текст), но не смог. Меню боковое тоже хотел сделать как на первом скриншоте, но ничего не вышло. Форма моей программы на втором скриншоте. Помогите пожалуйста.
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.FlatStyle = FlatStyle.Flat;
            button1.FlatAppearance.BorderSize = 0;
            button2.FlatStyle = FlatStyle.Flat;
            button2.FlatAppearance.BorderSize = 0;
            button3.FlatStyle = FlatStyle.Flat;
            button3.FlatAppearance.BorderSize = 0;
            button4.FlatStyle = FlatStyle.Flat;
            button4.FlatAppearance.BorderSize = 0;
            button5.FlatStyle = FlatStyle.Flat;
            button5.FlatAppearance.BorderSize = 0;
            button6.FlatStyle = FlatStyle.Flat;
            button6.FlatAppearance.BorderSize = 0;
            button7.FlatStyle = FlatStyle.Flat;
            button7.FlatAppearance.BorderSize = 0;
            button8.FlatStyle = FlatStyle.Flat;
            button8.FlatAppearance.BorderSize = 0;
            button9.FlatStyle = FlatStyle.Flat;
            button9.FlatAppearance.BorderSize = 0;
            button10.FlatStyle = FlatStyle.Flat;
            button10.FlatAppearance.BorderSize = 0;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            {
               // Заполнение RichTextBox
            AddCopyableLine(richTextBox1, "say Пожалуйста, положите Ваш паспорт на стол в открытом виде.");
                AddNonCopyableLine(richTextBox1, "Ждём отыгровок");
                AddCopyableLine(richTextBox1, "me изучил паспорт");
                AddCopyableLine(richTextBox1, "say Для получения медицинской карты необходимо пройти проверку на наличие алкоголя в крови, Вы согласны?");
                AddNonCopyableLine(richTextBox1, "В случае отказа:");
                AddCopyableLine(richTextBox1, "say Вам отказано в выдаче медицинской карты.");
                AddNonCopyableLine(richTextBox1, "В случае согласия:");
                AddCopyableLine(richTextBox1, "do В медицинской сумке лежит кейс с прибором \"Drager\".");
                AddCopyableLine(richTextBox1, "me достал кейс, открыл его и вытащил прибор \"Drager\"");
                AddCopyableLine(richTextBox1, "say При освидетельствовании будет использован прибор \"Drager\".");
                AddCopyableLine(richTextBox1, "do На устройстве можно заметить пломбу.");
                AddCopyableLine(richTextBox1, "todo Пломба на приборе присутствует*показав пломбу гражданину");
 
                // Добавьте остальные строки
 
                // Подписка на событие MouseClick
                richTextBox1.MouseClick += new MouseEventHandler(richTextBox1_MouseClick);
 
                // Делаем RichTextBox доступным только для чтения
                richTextBox1.ReadOnly = true;
            }
        }
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
        }
        private void button1_Click(object sender, EventArgs e)
        {
        }
        private void button1_Click_1(object sender, EventArgs e)
        {
        }
        private void AddCopyableLine(RichTextBox rtb, string text)
        {
            rtb.AppendText(text + Environment.NewLine);
        }
 
        private void AddNonCopyableLine(RichTextBox rtb, string text)
        {
            rtb.AppendText(text + Environment.NewLine);
        
    }
 
        private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
        {
            int index = richTextBox1.GetCharIndexFromPosition(e.Location);
            int lineNumber = richTextBox1.GetLineFromCharIndex(index);
            string line = richTextBox1.Lines[lineNumber];
 
            if (line.StartsWith("copy:"))
            {
                // Копируем текст без префикса "copy:"
                Clipboard.SetText(line.Substring(5));
            }
        }
    }
        }
Миниатюры
Копирование строки при клике мышью   Копирование строки при клике мышью  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2025, 00:45
Ответы с готовыми решениями:

Динамическое создание PictureBox при клике мышью по форме
Здравствуйте! Сегодня решил спросить. А можно сделать так чтобы при каждом нажатии мыши на форме...

Выделение всего текста в TextBox при клике мышью
Друзья, подскажите пожалуйста как можно реализовать выделение ВСЕГО текста в TextBox'е посредством...

Изменение текста в TextBox элемента в GridView при клике мышью
Здравствуйте, господа. Есть у меня GridView, который заполняется из файла json. У элемента есть...

48
bite
 Аватар для I can
5009 / 4826 / 852
Регистрация: 13.04.2015
Сообщений: 10,104
19.09.2025, 12:06
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Перевод на русский нормально сделали или опять куча косяков есть?
Извините, не понял. О каком переводе речь?
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,770
Записей в блоге: 4
19.09.2025, 12:09
Цитата Сообщение от I can Посмотреть сообщение
Извините, не понял. О каком переводе речь?
Студии. Там косяков было много...
0
bite
 Аватар для I can
5009 / 4826 / 852
Регистрация: 13.04.2015
Сообщений: 10,104
19.09.2025, 12:10
Цитата Сообщение от Pirat Piratych Посмотреть сообщение
в боковом меню и раскроются разделы
Сразу не обратил внимание, а теперь уже "запал иссяк"
Я думаю, теперь сам допилишь по аналогии с правой стороной.

Не по теме:

Анекдот. Разговаривают двое:
- Не могу больше работать, запал иссяк.
- Кто запал?
- Иссяк.




Добавлено через 29 секунд

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Студии.
А не, вроде норм.

2
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
19.09.2025, 18:58  [ТС]
Сразу не обратил внимание, а теперь уже "запал иссяк"
Я думаю, теперь сам допилишь по аналогии с правой стороной.
Да. Допилю И туда можно вставить эти LabelLink, которые есть сейчас.

Добавлено через 5 часов 58 минут
Цитата Сообщение от I can Посмотреть сообщение
Я думаю, теперь сам допилишь по аналогии с правой стороной.
C#
1
2
3
4
5
6
7
8
9
10
private void addArrayToUserControl1(FlowLayoutPanel flp, string caption, struDataForUC[] arr)
{ flp.Controls.Add(new UC(caption, arr));
 
        addArrayToUC(flowLayoutPanel1, "Общее МЗ", new struDataForUC[]
           {
            new struDataForUC("Обязательные отыгровки", false),
             });
    }
}
}
Попытался сделать. Вышло черти что, т.е ничего.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,758
Записей в блоге: 3
19.09.2025, 21:05
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Перевод на русский нормально сделали или опять куча косяков есть?
А какие "косяки" были?
0
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
20.09.2025, 09:24  [ТС]
Где я ошибся?
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,770
Записей в блоге: 4
22.09.2025, 08:30
Цитата Сообщение от wizard41 Посмотреть сообщение
А какие "косяки" были?
Где-то текст не влезал, слова какие-то замудрёные были. Такое ощущение что автомат переводил...
0
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
22.09.2025, 08:42  [ТС]
Подскажите, как сделать, чтобы в боковом меню разделы раскрывались? Я перепробовал всё. Не помогает.
0
bite
 Аватар для I can
5009 / 4826 / 852
Регистрация: 13.04.2015
Сообщений: 10,104
22.09.2025, 19:45
Pirat Piratych, у тебя уже 4 уровня вложенности. Чтобы не городить огород в коде, тут так и просится использование json. Что-то типа
0
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
22.09.2025, 21:28  [ТС]
Думал, без json обойдусь.
0
bite
 Аватар для I can
5009 / 4826 / 852
Регистрация: 13.04.2015
Сообщений: 10,104
22.09.2025, 21:40
Цитата Сообщение от Pirat Piratych Посмотреть сообщение
Думал, без json обойдусь.
Без это в коде ужас что будет.

Добавлено через 1 минуту
А еще лучше будет, если хранить данные в json-файле, а пункты меню чтобы добавлять прямо в программе.
0
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
22.09.2025, 22:43  [ТС]
Попробую.
0
3 / 3 / 2
Регистрация: 07.03.2024
Сообщений: 154
24.09.2025, 09:46  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
тут так и просится использование json.
Добавил. И теперь выходит туча ошибок.

Вот код:
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
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.IO;
using System.Windows.Forms;
 
 
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            // Настраиваем форму и добавляем пользовательский контрол UsC
            var usControl = new UsC
            {
                Dock = DockStyle.Fill
            };
            this.Controls.Add(usControl);
 
            // Загружаем меню из JSON
            var menu = LoadMenuFromJson("myMenu.json");
 
            // Передаем данные в контрол для построения меню
            usControl.BuildMenu(menu);
        }
 
        List<MenuItem> LoadMenuFromJson(string filePath)
        {
            string json = File.ReadAllText(filePath);
            var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
            return JsonSerializer.Deserialize<List<MenuItem>>(json, options);
        }
    }
 
    // Класс модели меню
    public class MenuItem
    {
        public string Text { get; set; }
        public bool Copyable { get; set; } = false;
        public List<MenuItem> Data { get; set; } = null;
    }
 
    // Пользовательский контрол UsC
    public class UsC : UserControl
    {
        private FlowLayoutPanel flowLayoutPanel1; // Слева — пункты меню
        private FlowLayoutPanel flowLayoutPanel2; // Справа — панели с содержимым
 
        public UsC()
        {
            InitializeComponent();
        }
 
        private void InitializeComponent()
        {
            this.flowLayoutPanel1 = new FlowLayoutPanel();
            this.flowLayoutPanel2 = new FlowLayoutPanel();
 
            // flowLayoutPanel1 — слева
            this.flowLayoutPanel1.Dock = DockStyle.Left;
            this.flowLayoutPanel1.Width = 200;
            this.flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
            this.flowLayoutPanel1.WrapContents = false;
            this.flowLayoutPanel1.AutoScroll = true;
            this.flowLayoutPanel1.BackColor = Color.Black;
 
            // flowLayoutPanel2 — справа
            this.flowLayoutPanel2.Dock = DockStyle.Fill;
            this.flowLayoutPanel2.FlowDirection = FlowDirection.TopDown;
            this.flowLayoutPanel2.WrapContents = false;
            this.flowLayoutPanel2.AutoScroll = true;
            this.flowLayoutPanel2.BackColor = Color.FromArgb(64, 64, 64);
 
            this.Controls.Add(flowLayoutPanel2);
            this.Controls.Add(flowLayoutPanel1);
        }
 
        public void BuildMenu(List<MenuItem> menuItems)
        {
            flowLayoutPanel1.Controls.Clear();
            flowLayoutPanel2.Controls.Clear();
 
            int mainIndex = 0;
            foreach (var mainItem in menuItems)
            {
                var ll = new LinkLabel
                {
                    Text = mainItem.Text,
                    Tag = mainIndex.ToString(),
                    AutoSize = true,
                    LinkColor = Color.White,
                    BackColor = Color.Black,
                    Margin = new Padding(3),
                    Cursor = Cursors.Hand,
                    Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold)
                };
                ll.MouseUp += LinkLabel_MouseUp;
                flowLayoutPanel1.Controls.Add(ll);
 
                var panel = new FlowLayoutPanel
                {
                    Name = "flp" + mainIndex,
                    FlowDirection = FlowDirection.TopDown,
                    WrapContents = false,
                    AutoScroll = true,
                    Dock = DockStyle.Fill,
                    Visible = false,
                    BackColor = Color.FromArgb(64, 64, 64),
                    Padding = new Padding(10)
                };
                flowLayoutPanel2.Controls.Add(panel);
 
                if (mainItem.Data != null)
                {
                    foreach (var subMenu in mainItem.Data)
                    {
                        AddSubMenuPanel(panel, subMenu);
                    }
                }
 
                mainIndex++;
            }
 
            // Выделяем первый пункт меню по умолчанию
            if (flowLayoutPanel1.Controls.Count > 0)
            {
                var first = flowLayoutPanel1.Controls[0] as LinkLabel;
                if (first != null)
                    SelectControl(first);
            }
        }
 
        private void AddSubMenuPanel(FlowLayoutPanel parentPanel, MenuItem menuItem)
        {
            if (menuItem.Data != null && menuItem.Data.Count > 0)
            {
                var header = new Label
                {
                    Text = menuItem.Text,
                    ForeColor = Color.Yellow,
                    AutoSize = true,
                    Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold),
                    Margin = new Padding
JSON:
JSON
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
[
  {
    "Text": "Меню №1",
    "Data": [
      {
        "Text": "Подменю №11",
        "Data": [
          {
            "Text": "Первая панелька с правой стороны",
            "Data": [
              { "Text": "Кликабельный пункт меню 1", "Copyable": true },
              { "Text": "Кликабельный пункт меню 2", "Copyable": true },
              { "Text": "Некликабельный пункт меню", "Copyable": false },
              { "Text": "Кликабельный пункт меню 3", "Copyable": true },
              { "Text": "Некликабельный пункт №2", "Copyable": false }
            ]
          },
          {
            "Text": "Вторая панелька с правой стороны",
            "Data": [
              { "Text": "Привет, мир.", "Copyable": true },
              { "Text": "Hello world", "Copyable": true }
            ]
          }
        ]
      },
      {
        "Text": "Подменю №12",
        "Data": [
          {
            "Text": "SubSubMenu121",
            "Data": [
              { "Text": "7111", "Copyable": true },
              { "Text": "7112", "Copyable": true }
            ]
          }
        ]
      }
    ]
  }
]
Миниатюры
Копирование строки при клике мышью  
0
bite
 Аватар для I can
5009 / 4826 / 852
Регистрация: 13.04.2015
Сообщений: 10,104
24.09.2025, 10:57
Цитата Сообщение от Pirat Piratych Посмотреть сообщение
туча ошибок
"Ошибки надо не признавать, их надо смывать..." исправлять

Держи.
Вложения
Тип файла: rar C# Навигация.rar (404.5 Кб, 14 просмотров)
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,758
Записей в блоге: 3
24.09.2025, 19:39
Цитата Сообщение от I can Посмотреть сообщение
Держи.
Обалдеть, почти заплакалъ... Давно такого трешака не видал
0
bite
 Аватар для I can
5009 / 4826 / 852
Регистрация: 13.04.2015
Сообщений: 10,104
24.09.2025, 19:50
Цитата Сообщение от wizard41 Посмотреть сообщение
Давно такого трешака не видал
Вот и пусть разбирается


Не так уж там всё и плохо
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,758
Записей в блоге: 3
24.09.2025, 20:03
Цитата Сообщение от I can Посмотреть сообщение
Не так уж там всё и плохо
Могло быть и лучше :)

Кажется, тут сама компоновка не верная. ТС устанет впихивать свои итемы в юзерконтролы справа. Короче, не разберется.
"На минималках" могло быть так:
- слева флат-панель с контейнерами менюшек (тема меню, вложенный список итемов);
- справа область окон с соотв. содержимым.
Итемы в левой панельке генерируют события, по которым главная форма показывает соотв. окна в правой панели.. Окна правой части могут содержать в себе свои флат-панели с контейнерами меню..
Контейнеры с меню - это объекты, т.е. как минимум класс.
0
bite
 Аватар для I can
5009 / 4826 / 852
Регистрация: 13.04.2015
Сообщений: 10,104
24.09.2025, 20:12
Цитата Сообщение от wizard41 Посмотреть сообщение
ТС устанет впихивать свои итемы в юзерконтролы справа
Ну если долго через контекстное меню, то можно и в файле добавить.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,758
Записей в блоге: 3
24.09.2025, 20:17
Ну возьмем, допустим, вот это содержимое:

Каким образом он это запихнет в список из label? Кнопки вот эти и все такое...
Т.е. тут должно быть полноценное окно с содержимым, где и лаблы и кнопки и т.п.
0
bite
 Аватар для I can
5009 / 4826 / 852
Регистрация: 13.04.2015
Сообщений: 10,104
24.09.2025, 20:24
Цитата Сообщение от wizard41 Посмотреть сообщение
Каким образом он это запихнет в список из label?
А то там особенного? Уже сейчас это можно делать, кроме кнопок. Да и их добавить не проблема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.09.2025, 20:24

Как создать кнопку или поле ввода при клике мышью на форме?
Привет, требуется помощь с лабкой, но похоже я стою на асфальте в лыжи обутый. Не могу понять даже...

Как создать кнопку или поле ввода при клике мышью на форме? - C#
Привет, требуется помощь с лабкой, задание 3 курса универа, с# только начали учить в этом...

Как сделать информационное окно, которое при клике по нему мышью не будет активировано?
Здравствуйте! Подскажите, можно ли сделать так, чтобы при нажатии на любом месте окна оно не...

При клике по панели и последующем клике в другом месте затрагиваемая панель должна сменить положение
Уверен, что подобные вопросы задавались не раз и не два, но все же осмелюсь задать вопрос. Итак,...

Выделение строки при наведении на неё мышью
Всем доброго времени суток! Пишу приложение и нужно организовать выделение всей строки в...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе. Самым главным критерием для меня было создание паролей, в котором отсутствуют знаки: | 1 l I Обработка содержит реквизиты: -. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru