powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Таблица Пифагора
8 сообщений из 8, страница 1 из 1
Таблица Пифагора
    #39306264
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня. Была задача создать простенькую таблицу Пифагора с динамическим созданием элементов.
Я сделала, но хочу, чтобы вы покритиковали, что не так. У меня почему-то при открытии форма висит и крутится курсор, и по нажатию крестика форма не закрывается. Наверное, чего-то не хватает. Помогите допилить. :)

Вот код: создайте новый проект и скопируйте туда код.

Код: vbnet
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.
Imports System.Drawing, System.Drawing.Drawing2D
Public Class Form1

    Dim WithEvents lbl_list As New List(Of Label)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For j = 0 To 10
            For i = 0 To 10
                Dim label As New Label
                With label
                    If j = 0 Then
                        If i > 0 Then
                            .Text = i
                        End If
                        .ForeColor = Color.Red
                    Else
                        If i = 0 Then
                            .Text = j
                            .ForeColor = Color.Red
                        Else
                            .Text = (i * j)
                        End If
                    End If
                    .Name = "label" & i & "_" & j
                    .Left = 10 + (i * 29) : .Top = 10 + (j * 29)
                    .Width = 30
                    .Height = 30
                    .BorderStyle = BorderStyle.FixedSingle
                    .TextAlign = ContentAlignment.MiddleCenter
                    lbl_list.Add(label)
                    Me.Controls.Add(label)
                    AddHandler lbl_list(0).Paint, AddressOf label0_0_paint
                End With
            Next
        Next
    End Sub

    Private Sub label0_0_paint(sender As Object, e As PaintEventArgs)
        Application.DoEvents()
        Dim hlst As Bitmap
        hlst = New Bitmap(ClientSize.Width, ClientSize.Height)
        Dim graph As Graphics = Graphics.FromImage(hlst)
        Dim grf As Graphics = sender.CreateGraphics
        grf.FillRectangle(New SolidBrush(Color.FromKnownColor(KnownColor.Control)), New RectangleF(0, 0, sender.Width, sender.Height))
        graph.DrawLine(Pens.Black, 0, 0, sender.Width, sender.Height)
        grf.DrawImage(hlst, 0, 0)
        sender.Image = hlst
        Application.DoEvents()
    End Sub

End Class



Всем заранее спасибо.
...
Рейтинг: 0 / 0
Таблица Пифагора
    #39306270
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoEvents убери.

Если хочешь узнать, где виснет - в меню Debug - Break all
...
Рейтинг: 0 / 0
Таблица Пифагора
    #39306271
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрала Doevents, вот результат, теперь вообще ничего не показывается. Это не то.

Pallaris, вы проверили код, у вас все работает и ничего не висит, и форма закрывается?
...
Рейтинг: 0 / 0
Таблица Пифагора
    #39306276
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче все не так.

Нафига 100 раз в цикле присваивать событие Paint одному и тому же label? Это можно сделать один раз

Нафига вообще событие Paint, в котором ты создаешь одно и то же изображение и присваиваешь его labely? Это можно сделать один раз там же, где ты создаешь label
...
Рейтинг: 0 / 0
Таблица Пифагора
    #39306284
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallaris, вы правы, я убрала из цикла вот эту строку
Код: vbnet
1.
AddHandler lbl_list(0).Paint, AddressOf label0_0_paint


И поставила ее вне цикла. Результат тот же. Это не помогло.

Пдскажите, как правильно написать, мне нужно событие paint только для первой метки. Это я указываю тут (красным, с индексом 0).
AddHandler lbl_list(0).Paint, AddressOf label0_0_paint

Для остальных это событие не нужно. Код правильный напишите.
...
Рейтинг: 0 / 0
Таблица Пифагора
    #39306286
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще раз, тебе не нужно событие Paint. Там же в FormLoad ОДИН раз создаешь bitmap и ОДИН раз присваиваешь его в .Image нужного label
...
Рейтинг: 0 / 0
Таблица Пифагора
    #39306306
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallaris - огромное спасибо. Все получилось. И код уменьшился в разы. Вот что в итоге получилось:
Теперь вроде все работает как часы. Еще раз огромное спасибо. :)

Код: vbnet
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.
Imports System.Drawing, System.Drawing.Drawing2D
Public Class Form1

    Dim WithEvents lbl_list As New List(Of Label)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For j = 0 To 10
            For i = 0 To 10
                Dim label As New Label
                With label
                    If j = 0 Then
                        If i > 0 Then
                            .Text = i
                        End If
                        .ForeColor = Color.Red
                    Else
                        If i = 0 Then
                            .Text = j
                            .ForeColor = Color.Red
                        Else
                            .Text = (i * j)
                        End If
                    End If
                    .Name = "label" & i & "_" & j
                    .Left = 10 + (i * 29) : .Top = 10 + (j * 29)
                    .Width = 30
                    .Height = 30
                    .BorderStyle = BorderStyle.FixedSingle
                    .TextAlign = ContentAlignment.MiddleCenter
                    lbl_list.Add(label)
                    Me.Controls.Add(label)
                End With
            Next
        Next

        Dim hlst As Bitmap
        hlst = New Bitmap(lbl_list(0).Width, lbl_list(0).Height)
        Dim graph As Graphics = Graphics.FromImage(hlst)
        Dim grf As Graphics = sender.CreateGraphics
        grf.FillRectangle(New SolidBrush(Color.FromKnownColor(KnownColor.Control)), New RectangleF(0, 0, lbl_list(0).Width, lbl_list(0).Height))
        graph.DrawLine(Pens.Black, 0, 0, lbl_list(0).Width, lbl_list(0).Height)
        grf.DrawImage(hlst, 0, 0)
        lbl_list(0).Image = hlst

    End Sub

End Class
...
Рейтинг: 0 / 0
Таблица Пифагора
    #39306336
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты рисуеш
Код: 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.
namespace aza111
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var size = 30;
            var offset = 10;
            var array = 
                Enumerable.Range(0, 10)
                .Join(Enumerable.Range(0, 10), x => true, x => true, (a, b) => new {a, b})
                .Select(c => GetSquareLabel(c.a,c.b,size)).ToArray();
                Controls.AddRange(array);

            array.First().Image = GetBitmap(size);
        }

        private static Label GetSquareLabel(int x, int y, int size)
        {
            return new Label
            {
                Left = x*(size-1), Top = y*(size-1), Width = size, Height = size, BorderStyle = BorderStyle.FixedSingle, TextAlign = ContentAlignment.MiddleCenter,
                Text = x == 0 && y==0 ? string.Empty: x==0? y.ToString() : y== 0 ? x.ToString() : (x*y).ToString(),
                ForeColor = (x == 0 || y==0) ? Color.Red : Color.Black
            };
        }

        private static Bitmap GetBitmap(int size)
        {
            var bmp = new Bitmap(size,size);
            var grp = Graphics.FromImage(bmp);
            grp.FillRectangle(new SolidBrush(Color.FromKnownColor(KnownColor.Control)), new Rectangle(0,0,size,size));
            grp.DrawLine(Pens.Black,0,0,size,size);
            grp.DrawImage(bmp,0,0);
            return bmp;
        }
    }
}
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Таблица Пифагора
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]