Присваивание свойств одинаковым обьектам.

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

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

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Присваивание свойств одинаковым обьектам.

Сообщение Reb Orn » 01.05.2011 (Вс) 20:18

Приветствую. Необходимо оптимизировать следующий код:
inv1.Image = System.Drawing.Image.FromFile("data/Graphic/Items/" + inv1.Tag + ".jpg")
inv2.Image = System.Drawing.Image.FromFile("data/Graphic/Items/" + inv2.Tag + ".jpg")
inv3.Image = System.Drawing.Image.FromFile("data/Graphic/Items/" + inv3.Tag + ".jpg")
inv4.Image = System.Drawing.Image.FromFile("data/Graphic/Items/" + inv4.Tag + ".jpg")
inv5.Image = System.Drawing.Image.FromFile("data/Graphic/Items/" + inv5.Tag + ".jpg")
ну и так еще на пару десятков строк...
Это buttons. В Tag хранится кодовое слово, по которой из папки Items в директории программы подбирается нужный image для этой кнопки. С массивами обьектов как-то не сложилось.
Буду очень признателен, ежели кто поможет.

С уважением, Павел.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Присваивание свойств одинаковым обьектам.

Сообщение Viper » 02.05.2011 (Пн) 8:59

Reb Orn писал(а):С массивами обьектов как-то не сложилось.
Надо бы, чтобы сложилось. С другой стороны можно перебирать через For Each контролы соответствующего контейнера (формы или что там), проверять являются ли они кнопками, после чего присваивать изображение.а эту строку "data/Graphic/Items/" поместить в константу.
Весь мир матрица, а мы в нем потоки байтов!

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Присваивание свойств одинаковым обьектам.

Сообщение Reb Orn » 02.05.2011 (Пн) 11:35

Пока ближайшее к чему удалось придти это:

Код: Выделить всё
Dim i as integer
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim inv(0 To 40) As Button
end sub



Код: Выделить всё
Private Sub checkimageINV()
  For i = 1 To 40
         inv(i).Image = System.Drawing.Image.FromFile("data/Graphic/Items/"+inv(i)+".jpg")
  Next i
end sub


Но при запуске программа ругается на подчеркнутую выше строчку : В экземпляре объекта не задана ссылка на объект.

Все button's находятся на элементе panel.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Присваивание свойств одинаковым обьектам.

Сообщение Viper » 02.05.2011 (Пн) 13:45

Во-первых, пользуйся тэгом CODE.
А во-вторых,а заодно и в-третьих, массив inv является локальным для процедуры Form1_Load и их использование в процедуре checkimageINV недопустимо. Тем более, что в массив не помещены реальные экземпляры кнопок. Так что юзай For Each для контролов на панели panel.
Весь мир матрица, а мы в нем потоки байтов!

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Присваивание свойств одинаковым обьектам.

Сообщение Reb Orn » 02.05.2011 (Пн) 13:52

Благодарю за советы.
И прошу прощения за CODE.

Пойду пробовать.

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Присваивание свойств одинаковым обьектам.

Сообщение Reb Orn » 02.05.2011 (Пн) 14:35

Если я Вас правильно понял, то получилось так:

Код: Выделить всё
Dim invmass As New Collection


Код: Выделить всё
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
invmass.Add(inv1)
invmass.Add(inv2)
end sub


Код: Выделить всё
Private Sub checkimageINV()
For Each inv As Button In invmass
inv.Image = System.Drawing.Image.FromFile("data/Graphic/Items/" + inv.Tag + ".jpg")
Next
End Sub


На те button, которые я добавил при Form load корректно накладывается изображение. Подскажите, пожалуйста, можно ли добавить Buttonы в более сжатом виде, а не количеством строчек, равному их количеству. А то в итоге поменял шыло на мыло, ибо количество строчек то же.
Еще раз прошу прощение за назойливость.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Присваивание свойств одинаковым обьектам.

Сообщение FireFenix » 02.05.2011 (Пн) 17:27

Код: Выделить всё
        Dim Control As System.Windows.Forms.Control = Nothing
        Dim Button As System.Windows.Forms.Button = Nothing

        For Each Control In Me.Controls
            Button = TryCast(Control, System.Windows.Forms.Button)

            If Not Button Is Nothing Then ' + условие выборки нужных кнопок
                'Работаем с кнопкой
                Button.Image = System.Drawing.Image.FromFile("data/Graphic/Items/" & Button.Tag & ".jpg")
            End If
        Next

Только вот толку имя файла хранить в тегах?
Проще сразу в дизайнере указать принадлежность кнопки к файлу... А если всё динамически, то в месте занесения в тег - сразу загрузка картинок
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Присваивание свойств одинаковым обьектам.

Сообщение Reb Orn » 02.05.2011 (Пн) 18:40

FireFenix,
Спасибо! Но не работает... Запускается без ошибок, но действия этого кода не видно. Может я что очень нужное не подправил в Вашем примере?

Код: Выделить всё
Dim Control As System.Windows.Forms.Control = Nothing
        Dim invmass As System.Windows.Forms.Button = Nothing

        For Each Control In Me.Controls
            invmass = TryCast(Control, System.Windows.Forms.Button)

            If Not invmass Is Nothing Then
                invmass.Image = System.Drawing.Image.FromFile("data/Graphic/Items/" & invmass.Tag & ".jpg")
            End If
        Next

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Присваивание свойств одинаковым обьектам.

Сообщение FireFenix » 02.05.2011 (Пн) 18:44

Вообще-то его править вообще не нужно было... Только добавить условие выбора кнопок, если нужно
ищи ошибку в логике своей проги
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: Присваивание свойств одинаковым обьектам.

Сообщение Shurrik » 05.05.2011 (Чт) 11:45

Проблема в том, что кнопки находяитмя не на форме, а на panel. Поэтому надо заменить Me на имя этого panel.
Вообще лучше сделать универсальный способ перебора нужных элементов. Вот, что у меня получилось.
Код: Выделить всё
    Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click
        ' первый вызов
        Call AllControl(Me, "System.Windows.Forms.Button")
    End Sub

    Sub AllControl(ByVal Kontener As Control, ByVal tip As String)
        ' перебрать все элементы управления (ЭУ)
        Dim cn As Control
        For Each cn In Kontener.Controls
            If cn.GetType.ToString = tip Then
                ' ваши действия
                MsgBox(cn.Name, MsgBoxStyle.Information)
            End If
            ' смотрим, что внутри ЭУ, может он сам содержит другие ЭУ
            Call AllControl(cn, tip)
        Next
    End Sub

А идея с заменой картинок на кнопках мне понравилась, сам иногда такое делал, правда не столь массово. Очень удобно, заменил в папке картинки и программа имеет совсем другой вид.
Колесо: Хочешь жить? Умей вертеться.

Reb Orn
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 01.05.2011 (Вс) 20:11

Re: Присваивание свойств одинаковым обьектам.

Сообщение Reb Orn » 18.05.2011 (Ср) 12:52

Всем огромное спасибо, а особенно Shurrik за подробный пример.

Код: Выделить всё
Private Sub allbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
        Call AllControl(Me, "System.Windows.Forms.Button")
    End Sub

    Sub AllControl(ByVal Kontener As Control, ByVal tip As String)
        Dim cn As Button
        For Each cn In Panel1.Controls
            If cn.GetType.ToString = tip Then
                cn.Image = System.Drawing.Bitmap.FromFile(cn.Tag.ToString + ".jpg")
            End If
        Next
    End Sub


При нажатии на любой кнопке на Panel1 код перебирает все кнопки (в данный момент их три) и присваевает каждой картинку по адресу, прописанному в tag. Именно это и требовалось.
Огромное спасибо еще раз.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList