Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Таблица Пифагора / 8 сообщений из 8, страница 1 из 1
09.09.2016, 07:20
    #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
09.09.2016, 07:28
    #39306270
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица Пифагора
DoEvents убери.

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

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

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

Нафига вообще событие Paint, в котором ты создаешь одно и то же изображение и присваиваешь его labely? Это можно сделать один раз там же, где ты создаешь label
...
Рейтинг: 0 / 0
09.09.2016, 07:58
    #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
09.09.2016, 08:00
    #39306286
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица Пифагора
еще раз, тебе не нужно событие Paint. Там же в FormLoad ОДИН раз создаешь bitmap и ОДИН раз присваиваешь его в .Image нужного label
...
Рейтинг: 0 / 0
09.09.2016, 08:19
    #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
09.09.2016, 08:58
    #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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Таблица Пифагора / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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