Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
4 / 4 / 2
Регистрация: 26.10.2014
Сообщений: 138

Как отобразить на другой вкладке tabControl картинку?

16.02.2016, 22:48. Показов 1902. Ответов 15

Студворк — интернет-сервис помощи студентам
На tabControl1 имеется несколько вкладок, на первой вкладке располагается listBox1. Нужно сделать так, если выбрано 1-е значение в listBox, то на второй вкладке tabControl1 загружаются картинки. Вот часть кода как я это делаю:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            switch (listBox1.SelectedIndex)
            {
                case 0: StreamReader streamReader = new StreamReader(@"Text files/vbbook.txt", Encoding.Default); //Открываем файл для чтения
                    { 
                        string str = ""; //Объявляем переменную, в которую будем записывать текст из файла
                        //
                        while (!streamReader.EndOfStream) //Цикл длиться пока не будет достигнут конец файла
                        {
                            str += streamReader.ReadLine(); //В переменную str по строчно записываем содержимое файла
                        }
 
                        label1.Text = str;
 
                        tabPage2.list.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://s1.n1.by/sites/default/files/imagecache/full/news/10/03/315201/1317654038.jpg")) });
                        tabPage2.list.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://s13.ru/wp-content/upl/2013/12/2013-12-09_161918.jpg")) });
                        tabPage2.list.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://grodno24.com/assets/images/2014/02/grodno_azot.jpg")) });
                        tabPage2.list.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://mplast.by/wp-content/uploads/2016/01/Grodno-Azot-5.jpg")) });
                    }
                    return;
            }
        }
Если делаю так, то ругается на ".list" текст ошибки: "не удалось найти метод расширения принимающий первый аргумент типа "list", принимающий первый аргумент типа "System.Windows.Forms.TabPage"". Если убрать tabPage2, то всё работает, только картинки появляются на 1-й вкладке, их не видно, так как их закрывает listBox, расположенный на этой вкладке. Так как сделать, что бы картинки отображались на 2-й вкладке?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.02.2016, 22:48
Ответы с готовыми решениями:

TabControl: как определить и привязать действие к определенной вкладке
Здравствуйте! Подскажите, как например определить и привязать действие к определенной вкладке, делал так: private void...

TabControl цвет вкладке
Подскажите пожалуйста, как в TabControl изменить цвет вкладки когда она активна(то, что на скрине белым цветом) и убрать белую полоску...

Как отобразить DataGridView на всех вкладках TabControl
У меня есть обычный TabControl на форме. На одной из вкладок есть DataGridView, как можно его переносить на каждую вкладку чтобы не делать...

15
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
16.02.2016, 23:39
Так поместите ваш "list" на вторую вкладку.
1
4 / 4 / 2
Регистрация: 26.10.2014
Сообщений: 138
17.02.2016, 01:12  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Так поместите ваш "list" на вторую вкладку.
на какое именно свойство его кидать? И да, list у меня уже задан
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public partial class Form2 : Form
    {
        public ImageItemList list = new ImageItemList();
public Form2()
        {
            InitializeComponent();
 
            Size = new Size(800, 900);
            BackColor = Color.FromArgb(255, 60, 60, 60);
 
            var slider = new ImageItemSlider { Parent = this, Top = 100, Width = ClientSize.Width, Height = 200, Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left };
            slider.Build(list);
 
            new Button { Parent = this, Text = "<Prev", BackColor = Color.White }.Click += delegate { slider.CurentSlide--; };
            new Button { Parent = this, Text = "Next>", BackColor = Color.White, Left = 100 }.Click += delegate { slider.CurentSlide++; };
 
            var pb = new PictureBox { Parent = this, Top = 400, Left = Width / 2 - 200, Width = 400, Height = 400, SizeMode = PictureBoxSizeMode.Zoom };
            slider.ImageClick += delegate { pb.Image = list[slider.HoveredImageIndex].Image; };
 
        }
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
17.02.2016, 05:35
Что такое ImageItemList, ImageItemSlider? Похоже что какие-то контролы, хотя гугл про них ничего не знает. Если это действительно контролы, с помощью дизайнера из можно разместить на нужной вкладке.
1
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
17.02.2016, 11:18
Цитата Сообщение от daniel_kobica Посмотреть сообщение
C#
1
2
3
public partial class Form2 : Form
 {
 public ImageItemList list = new ImageItemList();
Так у тебя объявлено это поле для Form2, но никак не для tabPage2. И использование идёт на форме. Что ты собираешься сделать не понятно из предложенных кусков не связанных между собой кроме названия переменной.
1
4 / 4 / 2
Регистрация: 26.10.2014
Сообщений: 138
17.02.2016, 17:29  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Что такое ImageItemList, ImageItemSlider?
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
Что ты собираешься сделать не понятно
Вот прикрепил скрин, с объяснением, что должно выйти.
А вот целый код (С ошибкой, которую я описал выше)
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
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
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;
using System.Net;
using System.Drawing.Drawing2D;
using System.IO;
 
namespace Еврорегион_Неман
{
    public partial class Form2 : Form
    {
        public ImageItemList list = new ImageItemList();
        public Form2()
        {
            InitializeComponent();
 
            Size = new Size(800, 900);
            BackColor = Color.FromArgb(255, 60, 60, 60);
 
            var slider = new ImageItemSlider { Parent = this, Top = 100, Width = ClientSize.Width, Height = 200, Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left };
            slider.Build(list);
 
            new Button { Parent = this, Text = "<Prev", BackColor = Color.White }.Click += delegate { slider.CurentSlide--; };
            new Button { Parent = this, Text = "Next>", BackColor = Color.White, Left = 100 }.Click += delegate { slider.CurentSlide++; };
 
            var pb = new PictureBox { Parent = this, Top = 400, Left = Width / 2 - 200, Width = 400, Height = 400, SizeMode = PictureBoxSizeMode.Zoom };
            slider.ImageClick += delegate { pb.Image = list[slider.HoveredImageIndex].Image; };
 
        }
 
        public class ImageItemSlider : Control
        {
            public int ImagesPerSlide { get; set; }
            public int CurentSlide { get; set; }
            public Padding ImagePaddings { get; set; }
            private ImageItemDrawer ImageItemDrawer { get; set; }
            public int AnimateSpeed { get; set; }
            public int HoveredImageIndex { get; set; }
            public event EventHandler ImageClick = delegate { };
            public bool IsAnimatedNow { get; private set; }
 
            private ImageItemList items;
            private int HScroll;
 
            public ImageItemSlider()
            {
                SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true);
 
                ImagesPerSlide = 3;
                ImageItemDrawer = new ImageItemDrawer();
                AnimateSpeed = 40;
                Cursor = Cursors.Hand;
 
                Application.Idle += Animate;
            }
 
            private void Animate(object sender, EventArgs e)
            {
                var expectedHScroll = ClientSize.Width * CurentSlide;
                if (HScroll != expectedHScroll)
                {
                    var speed = Math.Abs(HScroll - expectedHScroll) <= AnimateSpeed ? 1 : AnimateSpeed;
                    HScroll += speed * Math.Sign(expectedHScroll - HScroll);
                    Invalidate();
                    IsAnimatedNow = true;
                }
                else
                    IsAnimatedNow = false;
            }
 
            public void Build(ImageItemList items)
            {
                this.items = items;
            }
 
            protected override void OnPaint(PaintEventArgs e)
            {
                var imgWidth = ClientSize.Width / ImagesPerSlide;
 
                for (int i = 0; i < items.Count; i++)
                {
                    var x = i * imgWidth - HScroll;
                    var rect = new Rectangle(x, ClientRectangle.Top, imgWidth, ClientSize.Height);
                    if (e.ClipRectangle.IntersectsWith(rect))
                    {
                        if (i == HoveredImageIndex)
                            using (var brush = new LinearGradientBrush(rect, BackColor, Color.Orange, 90))
                            {
                                e.Graphics.FillRectangle(brush, rect);
                            }
 
                        ImageItemDrawer.Draw(e.Graphics, rect, items[i]);
                    }
                }
            }
 
            protected override void OnMouseMove(MouseEventArgs e)
            {
                base.OnMouseMove(e);
                if (!IsAnimatedNow)
                {
                    HoveredImageIndex = PointToIndex(e.Location);
                    Invalidate();
                }
            }
 
            protected override void OnMouseDown(MouseEventArgs e)
            {
                base.OnMouseDown(e);
 
                if (!IsAnimatedNow)
                    if (e.Button == MouseButtons.Left)
                        if (HoveredImageIndex >= 0 && HoveredImageIndex < items.Count)
                            ImageClick(this, EventArgs.Empty);
            }
 
            /// <summary>
            /// Returns index of ImageIndex in given point
            /// </summary>
            public int PointToIndex(Point p)
            {
                var imgWidth = ClientSize.Width / ImagesPerSlide;
                return (p.X + HScroll) / imgWidth;
            }
        }
 
        public class ImageItemDrawer
        {
            public int BottomStripHeight = 30;
            public Color BottomStripColor = Color.FromArgb(100, 0, 0, 0);
            public Color BottomStripTextColor = Color.White;
            public Font BottomStripTextFont = new Font(FontFamily.GenericSansSerif, 12);
            public Padding Paddings = new Padding(5, 2, 5, 2);
 
            public virtual void Draw(Graphics gr, Rectangle rect, ImageItem item)
            {
                //image rect with paddings
                rect = new Rectangle(rect.Left + Paddings.Left, rect.Top + Paddings.Top, rect.Width - Paddings.Left - Paddings.Right, rect.Height - Paddings.Top - Paddings.Bottom);
                //bottom strip rect
                var strip = new Rectangle(rect.Left, rect.Top + rect.Height - BottomStripHeight, rect.Width, BottomStripHeight);
                //draw image
                gr.DrawImage(item.Image, rect);
                //draw bottom strip
                using (var brush = new SolidBrush(BottomStripColor))
                {
                    gr.FillRectangle(brush, strip);
                    brush.Color = BottomStripTextColor;
                    var sf = new StringFormat { LineAlignment = StringAlignment.Center };
                    gr.DrawString(item.Comment, BottomStripTextFont, brush, strip, sf);
                    sf.Alignment = StringAlignment.Far;
                    gr.DrawString(item.Duration.ToString(), BottomStripTextFont, brush, strip, sf);
                }
            }
        }
 
        public class ImageItemList : List<ImageItem>
        {
        }
 
        public class ImageItem
        {
            public Image Image { get; set; }
            public string Comment { get; set; }
            public TimeSpan Duration { get; set; }
        }
 
        private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            switch (listBox1.SelectedIndex)
            {
                case 0: StreamReader streamReader = new StreamReader(@"Text files/vbbook.txt", Encoding.Default); //Открываем файл для чтения
                    { 
                        string str = ""; //Объявляем переменную, в которую будем записывать текст из файла
                        //
                        while (!streamReader.EndOfStream) //Цикл длиться пока не будет достигнут конец файла
                        {
                            str += streamReader.ReadLine(); //В переменную str по строчно записываем содержимое файла
                        }
 
                        label1.Text = str;
 
                        tabPage2.list.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://s1.n1.by/sites/default/files/imagecache/full/news/10/03/315201/1317654038.jpg")) });
                        //tabPage2.list.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://s13.ru/wp-content/upl/2013/12/2013-12-09_161918.jpg")) });
                       //tabPage2.list.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://grodno24.com/assets/images/2014/02/grodno_azot.jpg")) });
                        //tabPage2.list.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://mplast.by/wp-content/uploads/2016/01/Grodno-Azot-5.jpg")) });
                    }
                    return;
            }
        }
    }
}
Миниатюры
Как отобразить на другой вкладке tabControl картинку?  
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
17.02.2016, 17:41
Поместите ImageItemSlider на закладку с галереей, ему присвоится значение что-то вроде imageItemSlider1 и тогда вместо:
C#
1
tabPage2.list.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://s1.n1.by/sites/default/files/imagecache/full/news/10/03/315201/1317654038.jpg")) });
используйте:
C#
1
imageItemSlider1.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://s1.n1.by/sites/default/files/imagecache/full/news/10/03/315201/1317654038.jpg")) });
Если я Вас правильно понял, то должно сработать.
1
4 / 4 / 2
Регистрация: 26.10.2014
Сообщений: 138
17.02.2016, 19:48  [ТС]
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
Поместите ImageItemSlider на закладку с галереей, ему присвоится значение что-то вроде imageItemSlider1 и тогда вместо:
C#
1
tabPage2.list.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://s1.n1.by/sites/default/files/imagecache/full/news/10/03/315201/1317654038.jpg")) });
используйте:
C#
1
imageItemSlider1.Add(new ImageItem { Comment = "ОАО «---»", Duration = new TimeSpan(0, 0, 0), Image = new Bitmap(new WebClient { Proxy = null }.OpenRead("http://s1.n1.by/sites/default/files/imagecache/full/news/10/03/315201/1317654038.jpg")) });
Если я Вас правильно понял, то должно сработать.
Так не получится. Код для добавления картинок полностью состоит из ручного добавления компонентов, вот архив с гивкой, для наглядности, как это работает. И разве есть такой компонент, ImageItemSlider?
Вложения
Тип файла: rar ScreenCaptureProject3.rar (2.13 Мб, 3 просмотров)
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
17.02.2016, 20:04
Цитата Сообщение от daniel_kobica Посмотреть сообщение
И разве есть такой компонент, ImageItemSlider?
Вы же его сами создали в своем коде... А раз создали, значит есть.

Добавлено через 4 минуты
Цитата Сообщение от daniel_kobica Посмотреть сообщение
Так не получится.
Все получится...
1
4 / 4 / 2
Регистрация: 26.10.2014
Сообщений: 138
17.02.2016, 20:27  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Вы же его сами создали в своем коде
это я знаю, что он в коде есть, я просто не понял, как его можно поместить на вкладку "Фотогалерея", где это нужно прописать или куда нажать. С утра сижу и ковыряю это место, уже не соображаю ничего, а сделать надо.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
17.02.2016, 20:34
Цитата Сообщение от daniel_kobica Посмотреть сообщение
как его можно поместить на вкладку "Фотогалерея"
Точно так же как и любой другой контрол, с помощью дизайнера и панели Toolbox, в которой расположены доступные контролы.
1
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
17.02.2016, 20:50
Вот как-то так
Миниатюры
Как отобразить на другой вкладке tabControl картинку?  
1
4 / 4 / 2
Регистрация: 26.10.2014
Сообщений: 138
18.02.2016, 01:07  [ТС]
Вообще ничего не выходит, как ни пытаюсь, либо я что-то не то делаю, либо у меня крыша едет и не понимаю самого элементарного. Если не трудно, посмотрите пожалуйста проект, который я приложил в архиве и исправьте, а то это жесть, целый день с этой штукой провозиться и не достичь никаких результатов.
Вложения
Тип файла: rar Еврорегион Неман.rar (77.4 Кб, 2 просмотров)
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
18.02.2016, 04:22
Лучший ответ Сообщение было отмечено daniel_kobica как решение

Решение

Вроде что-то работает. Дальше сами...
Вложения
Тип файла: zip Еврорегион Неман.zip (26.4 Кб, 4 просмотров)
1
4 / 4 / 2
Регистрация: 26.10.2014
Сообщений: 138
18.02.2016, 13:51  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Вроде что-то работает. Дальше сами...
Проект запускается, но при открытии 2-й формы ошибка
Миниатюры
Как отобразить на другой вкладке tabControl картинку?  
0
4 / 4 / 2
Регистрация: 26.10.2014
Сообщений: 138
18.02.2016, 14:41  [ТС]
Всё, разобрался, спасибо большое за помощь)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.02.2016, 14:41
Помогаю со студенческими работами здесь

Создание textbox во вкладке TabControl
Здравствуйте. Имеется Tabcontrol и в нем несколько вкладок. На каждой вкладке - кнопка. Надо, чтобы при нажатии кнопки. на этой вкладке...

Как вставить картинку во всю вкладку в TabControl?
всем привет скажите как вставить картинку во всю вкладку в tabControl что бы она полностью заменяла вкладку(не путать с содержимом вкладки)

Сохранение текста из RichTextBox в текущей вкладке tabControl
Всем привет!)) Вот у меня появилась проблема: У меня есть кнопка и если я на неё нажимаю создаётся вкладка в tabControl1 а внутри...

Получить индекс вкладки в tabControl по заголовку в этой вкладке
собственно вопрос в названии...

Связь TreeView и TabControl: отображение во вкладке информации активного узла
Всем привет! У меня проблема. Я хочу сделать так, чтобы при нажатии ветки в TreeView у меня на TabPage TabControl'a высвечивалась инфа,...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru