Перерисовка Lable-ов

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

insite2012
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.03.2013 (Пт) 8:06
Откуда: Россия, Саратов

Перерисовка Lable-ов

Сообщение insite2012 » 27.09.2013 (Пт) 17:28

Приветствую всех.
Столкнулся с проблемкой, нужна подсказка.
Есть форма, цикл для добавления меток на форму и массив байт. При нажатии на кнопку из файла считывается информация в массив, на форму из цикла добавляются метки, меткам присваивается текст. Часть текста стандартная, часть подставляется из массива. И вот проблема в том, что при первом открытии все выводится верно, но если я не закрыв программу пробую открыть другой файл и вывести информацию на метки из него, то ничего не меняется, текст меток остается прежним. Я уже и форму пытался перерисовать методом Refresh, и сами метки, и массив с данными по нажатию на кнопку очищал, ничего не помогает... Прошу подсказать, как это осуществить.
Код: Выделить всё
Public Sub Get_Err_MDL()
        Dim FS As New FileStream(Form1.OpenFileDialog1.FileName, FileMode.Open)
        Dim BR As New BinaryReader(FS)
        Dim B_Mass As Byte() = BR.ReadBytes(&H200)
        Dim L_mass() As Label = New Label(15) {}


        For i As Integer = 0 To 15
            L_mass(i) = New Label() With {.Left = 20, .Top = 120 + 20 * i, .Height = 20, .Width = 200,
                                          .AutoSize = False, .Text = "Ошибка Е" & i & "........." & B_Mass(&HA0 + i) & " раз"}
            Form1.Controls.Add(L_mass(i))
        Next
        BR.Close()
        FS.Close()
    End Sub
Dulce et decorum est pro patria mori

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.09.2013 (Пт) 17:43

Потому что ты не удаляешь старые label'ы... Хотя, на самом деле их и не надо удалять, надо прото менять им текст, а не создавать новые.

insite2012
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.03.2013 (Пт) 8:06
Откуда: Россия, Саратов

Re: Перерисовка Lable-ов

Сообщение insite2012 » 27.09.2013 (Пт) 17:46

Qwertiy писал(а):Потому что ты не удаляешь старые label'ы... Хотя, на самом деле их и не надо удалять, надо прото менять им текст, а не создавать новые.

Хм... А как? Я же меняю данные, которые подставляются в одно место текста...
Dulce et decorum est pro patria mori

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.09.2013 (Пт) 17:54

Нет.

insite2012
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.03.2013 (Пт) 8:06
Откуда: Россия, Саратов

Re: Перерисовка Lable-ов

Сообщение insite2012 » 27.09.2013 (Пт) 17:58

Qwertiy писал(а):Нет.

Извиняюсь за тупость, но почему? Я и в отладке смотрел, пошагово, данные в массиве, из которого идет подстановка значений разные...
Я ведь каждый раз загружаю разные файлы, с разными значениями...
Dulce et decorum est pro patria mori

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.09.2013 (Пт) 18:04

Ты каждый раз создаёшь новые лейблы не уничтожая старые.

insite2012
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.03.2013 (Пт) 8:06
Откуда: Россия, Саратов

Re: Перерисовка Lable-ов

Сообщение insite2012 » 27.09.2013 (Пт) 18:06

Понял. А как их уничтожить, ведь они создаются каждый раз заново?
Dulce et decorum est pro patria mori

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.09.2013 (Пт) 18:11

Qwertiy писал(а):Хотя, на самом деле их и не надо удалять, надо прото менять им текст, а не создавать новые.

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Перерисовка Lable-ов

Сообщение Admiralisimys » 28.09.2013 (Сб) 23:44

insite2012 совсем не обязательно каждый раз переназначать лейблам содержание вручную. Ведь начиная с .NET2.0 есть DataBinding, которым изящность можно указать однажды, например при создании этих лейблов в конструкторе формы (в Sub New), что-то вроде label.DataBindings.Add("Text", bMass(i), "Value").
Конечно с обычным byte такой фокус (DataBinding) не пройдёт, по этому нужно будет написать свой класс релеализурующий интерфейс INotifyPropertyChanged
Код: Выделить всё
Public Class byteWithBinding
    Implements INotifyPropertyChanged

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    Private value_ As Byte

    Public Sub New(ByVal initialValue As Byte)
        value_ = initialValue
    End Sub

    Public Property Value As Byte

        Get
            Return value_
        End Get

        Set(ByVal value As Byte)
            value_ = value
            OnPropertyChanged("Value")
        End Set

    End Property

    Private Sub OnPropertyChanged(ByVal name As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name))
    End Sub

End Class

Взято с C# примера отсюда.

По размещению лейблов тоже совет воспользоваться тем что нам предлагается в WinForm с .NET2.0+, а именно панелями размещениями элементов, например TableLayoutPanel.

insite2012
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.03.2013 (Пт) 8:06
Откуда: Россия, Саратов

Re: Перерисовка Lable-ов

Сообщение insite2012 » 12.10.2013 (Сб) 10:03

Всем спасибо за советы, вроде получилось.
Конечно, немного коряво, то есть я создал Label-ы без текста, а потом по нажатию кнопки текст на них обновляется.
Есть еще вопросик, если не трудно, прошу подсказки.
Решил использовать в своем проекте многопоточность, нашел в одной из книг, по которой занимаюсь простейший пример, и вот никак не могу заставить его работать... Вылетает исключение, и все тут... Подскажите, что я делаю не так? В учебнике про это ни слова, просто приведен код и сказано, что должно работать...
Вот такой код.
Код: Выделить всё
Imports System
Imports System.Threading
Public Class Form1
    Dim Поток1 As New System.Threading.Thread(AddressOf Процесс_потока1)
    Dim Поток2 As New System.Threading.Thread(AddressOf Процесс_потока2)

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Поток1.Start()
    End Sub

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        Поток2.Start()
    End Sub

    Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click
        MsgBox("Hi!")
    End Sub

    Private Sub Процесс_потока1()
        Dim i As Integer = 0
        Do
            TextBox1.Text = i
            i += 1
        Loop
    End Sub
    Private Sub Процесс_потока2()
        Dim i As Integer = 0
        Do
            TextBox2.Text = i
            i += 1
        Loop
    End Sub

End Class
Dulce et decorum est pro patria mori

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.10.2013 (Сб) 12:57

Код: Выделить всё
Me.Invoke(Sub() TextBox1.Text = i)

insite2012
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.03.2013 (Пт) 8:06
Откуда: Россия, Саратов

Re: Перерисовка Lable-ов

Сообщение insite2012 » 12.10.2013 (Сб) 13:55

Ув. Qwertiy, спасибо! Еще раз убеждаюсь, что даже просто до любителя мне еще очень и очень далеко. :D
Если не секрет, подскажите, где можно найти какую литературу по многопоточности и делегатам. Смотрел на MSDN, но там все довольно запутано и сложно для понимания...
P.S. И еще, потоки я запустил. Как теперь корректно их остановить? Если я правильно понял, надо обработать событие FormClosing, что я в общем и сделал, поставив в этом событии команду Thread.Abort(). Потоки закрываются, но в окне интерпретации я вижу, что возникают исключения, что мне, естественно, не очень нравится. Возможно ли обработать закрытие потоков при закрытии формы более корректно?
Dulce et decorum est pro patria mori

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.10.2013 (Вс) 11:36

insite2012 писал(а):сли не секрет, подскажите, где можно найти какую литературу по многопоточности и делегатам.

По идее, в любой книжке по .NET 2+. Если с лямбдами, то 3.5+ вроде.

insite2012 писал(а):Как теперь корректно их остановить?

Желательно, чтобы они сами завершались...

insite2012 писал(а):Если я правильно понял, надо обработать событие FormClosing

Самый простой вариант:
Код: Выделить всё
Private Sub Form1_FormClosed(sender As System.Object, e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
  End
End Sub
но естественно лучше делать как-то по-другому...
А ещё, можно у потока выставить соответсвующие параметры, чтобы он не влиял на завершение приложение. Хотя не уверен, что это поможет...

insite2012
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.03.2013 (Пт) 8:06
Откуда: Россия, Саратов

Re: Перерисовка Lable-ов

Сообщение insite2012 » 13.10.2013 (Вс) 11:42

Да вот к сожалению не в любой... Из тех что у меня есть, вот в одной вот тот простейший пример, это по потокам. Делегаты там вообще не рассматриваются, работа с WinAPI - очень коротко...
Ну что же, буду искать. Кто ищет - тот найдет, я так думаю. Если что - опять к Вам, как к профи в этом деле. :D
PS. и в дополнение по потокам. Выражение Me.Invoke необходимо только в случае использования в потоке элементов управления? Или всегда? К примеру, у меня есть очень длинный цикл, перебор множества значений. И естественно, я его хочу выделить в поток. Элементы управления (текстовые поля) там используются только один раз, при задании начальных и конечных значений цикла, но их там много. Как в таком случае организовать поток?
Я смотрел на MSDN, там есть это, но там еще что-то используется, и столько методов, причем не разберешь, что и где применять... И примеры все абстрактные...
Dulce et decorum est pro patria mori

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.10.2013 (Вс) 17:29

Сохранить все параметры в переменные и к ним обращаться из потока. Вообще, сохранять в переменные лучше независимо от наличия потоков.

insite2012
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.03.2013 (Пт) 8:06
Откуда: Россия, Саратов

Re: Перерисовка Lable-ов

Сообщение insite2012 » 13.10.2013 (Вс) 21:06

Qwertiy писал(а):Сохранить все параметры в переменные и к ним обращаться из потока. Вообще, сохранять в переменные лучше независимо от наличия потоков.

Понял. Ну так там в общем и реализовано, текстовые поля только для задания значений верхней и нижней границ поиска, они сразу же преобразовываются в переменные, и потом идет работа с ними.
Буду пробовать.
Dulce et decorum est pro patria mori


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 36

    TopList