Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание объектов, в массиве 
:(
    Опции темы
YoD
Дата 30.11.2004, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 29.11.2004

Репутация: нет
Всего: нет



Люди, подскажите пожалуйста. Мне надо на форме создать нечто вроде таблицы из image boxes. Вроде всё просто, но в VB. NET убрали мою любимую возможность - создание массивов элементов управления. Кто знает, как программно создать много image boxes на фореме (много это порядка 100) и как ими потом управлять. Буду очень благодарен за все советы
PM MAIL ICQ   Вверх
-Mikle-
Дата 1.12.2004, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 3
Всего: 59



Цитата(YoD @ 1.12.2004, 00:30)
Вроде всё просто, но в VB. NET убрали мою любимую возможность - создание массивов элементов управления

Не убрали, а скорее усовершенствовали smile Просто в новой архитектуре использовать некое "загадочное" свойство Index у контролов, перестало быть необходимым. Теперь все контролы создаются програмно, в коде, а не где-то там за кулисами... smile И ф-ии для обработки событий назначаются тоже теперь програмно...
Короче вот код на примере массива PictureBox'ов. Ниже написанное засовываем в класс формы.

Код

   'Объявим массив типа PictureBox
   Dim pics() As System.Windows.Forms.PictureBox

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim i As Integer
       'добавим Пять контролов
       For i = 0 To 4
           ReDim Preserve pics(i)
           pics(i) = New System.Windows.Forms.PictureBox()
           With pics(i)
               'Задаем каждому следующему PictureBox, разную Х координату (i*150)
               .Location = New System.Drawing.Point(i * 150, 0)
               'Задаем цвет
               .BackColor = System.Drawing.Color.AliceBlue

               'Здесь пишем любую инициализацию экземпляров PictureBox

           End With
           'Далее задаем функции для событий
           'MouseEnter, MouseLeave и Click соответственно
           AddHandler pics(i).MouseEnter, AddressOf picMEnter
           AddHandler pics(i).MouseLeave, AddressOf picMLeave
           AddHandler pics(i).Click, AddressOf picClick
       Next i
       'Добавляем весь массив в коллекцию контролов формы
       Me.Controls.AddRange(Me.pics)
       Me.ResumeLayout()
   End Sub



   Private Sub picMEnter(ByVal sender As System.Object, ByVal e As System.EventArgs)
       sender.BorderStyle = BorderStyle.Fixed3D
   End Sub

   Private Sub picMLeave(ByVal sender As System.Object, ByVal e As System.EventArgs)
       sender.BorderStyle = BorderStyle.None
   End Sub

   Private Sub picClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
       Dim i As Integer
       'Если надо узнать именно индекс в массиве,
       'то ищем объект sender
       i = pics.IndexOf(pics, sender)
       MsgBox("   Кликнули по " & i & " PictureBox'у   ")
   End Sub


Пробуй, будут вопросы по этой теме, пиши сюда. Вопросы по другой теме, просьба создавать в новом топике.



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Гость_Папа
Дата 12.11.2005, 15:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











-Mikle-

Приветствую.
Вопрос новичка по выше приведенному коду.
Поясни что означает или что происходит в результате выполнения этой строки
ReDim Preserve pics(i)

Заранее спасибо.
  Вверх
Exception
Дата 12.11.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 18
Всего: 186



она увеличивает количество элементов массиве.
PM   Вверх
Гость_Папа
Дата 13.11.2005, 00:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Run-time error
Спасибо.
Но я не совсем понял смысл.

Я бы выполнил это так ( пример размещения на форме 40 label )
Код

Private Sub mnuStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuStart.Click
       
        Dim count As Int16 = 1
        Dim lab As Label
        For r As Int16 = 1 To 5   ' пять рядов
            For k As Int16 = 1 To 8 ' восемь в ряд поэтому люс в люсе
                lab = New Label
                lab.Name = "lab" & count
                lab.BorderStyle = BorderStyle.Fixed3D
                lab.Width = 20
                lab.Height = 20
                lab.Location = New Point(k * 30, r * 30)
                lab.ImageList = ImageList1
                lab.ImageIndex = Tindex(count) '
                lab.Tag = Tindex(count)
                lab.Visible = True
                AddHandler lab.Click, AddressOf GekliktNog
                Me.Controls.Add(lab) ' эта команда помещает созданные програмно label  на форму.
                count += 1
            Next
        Next

    End Sub



Впрочем Mikle это и так написал. Только в чем фишка AddRange вместо Add просто?

Если можно то вопрос по обработчику событий Click.
Как сделать:
кликнули по первому контролу он стал невидимым Visible = Fals, кликнули по второму он тоже стал невидимым, а потом если кликнуть по третьему (или через промежуток времени) то первый опять становится видимым.
Есть возможность через IndexOf определить индекс контрола и потом с его помощью управлять контролом дальше.
Но у меня что-то не получается. И потом никак не могу придумать как отследить первый и второй клик. Ведь когда кликнули по второму контролу клик номер два, но после клика по третьему клик номер два должен стать кликом номер один, а новый(третий) номером два. Плюс должен сохраняться индекс контрола, чтобы потом его сделать видимым.

Run-time error
Был бы очень признателен за помощь.
Я тут уже несколько дней мучаюсь. По идее при каждом клике должен быть разный индекс контрола. А у меня почемуто часто выскакивает один и тот же. Использую это выражение для определения индекса контрола по которому кликнули: nrT = Me.Controls.IndexOf(sender)

ЗЫ модератор простите, если что нарушил.

Всего доброго. smile
  Вверх
thicking
Дата 6.4.2009, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Это все хорошо, но я столкнулся с такой проблемой.  У меня на форме имеется Controlbox, в котором находятся35 textbox'ов. Мне нужно при загрузке формы, чтобы все textbox'ы были недоступны, а при нажатии на кнопку (назовем ее "редактировать") они разблокировались.  Делал как написано во 2 посте и постоянно получаю пустой массив. Если убрать маску и взять все элементы на форме, то видно что контролы находящиеся внутри   Controlbox'а просто игнорируются. Пробовал экспериментировать с Controlbox, но результатов не получил. Очень надеюсь на вашу помощь.
PM MAIL   Вверх
Rififi
Дата 6.4.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



создай сначала Panel (программно или в дизайне), а уже к ней цепляй свои textbox'ы
для блокирования/разблокирования
this.panel1.Enabled = true; // или false
ps. что в коде не смотрел (не люблю vb (: ) поэтому ответил как понял вопрос.
PM MAIL   Вверх
thicking
Дата 6.4.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



т.е. в Controlbox вставляю панель, а в панель все остальное... Я правильно понял? 
PM MAIL   Вверх
-Mikle-
Дата 7.4.2009, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 3
Всего: 59



Цитата(thicking @  6.4.2009,  23:53 Найти цитируемый пост)
У меня на форме имеется Controlbox

Что такое Controlbox? Это панель? или контейнер? Такого компонента нет в VB...


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
thicking
Дата 7.4.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Цитата(-Mikle- @  7.4.2009,  06:04 Найти цитируемый пост)
Что такое Controlbox? Это панель? или контейнер? Такого компонента нет в VB... 


Признаю, мой косяк. Не ControlBox,  а TabControl

Это сообщение отредактировал(а) thicking - 7.4.2009, 08:59
PM MAIL   Вверх
-Mikle-
Дата 7.4.2009, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 3
Всего: 59



Да, тогда так:
Цитата(thicking @  7.4.2009,  01:55 Найти цитируемый пост)
вставляю панель, а в панель все остальное... 


Если ты потом у панели выставишь свойство Enabled = False, то все расположенные на нем контролы станут неактивными.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
thicking
Дата 7.4.2009, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Так и сделаю, но вопрос все равно остается открытым, так как потом еще все это нужно будет заполнить данными, а тупо  описывать каждый textbox с новой строчки очень не удобно
PM MAIL   Вверх
thicking
Дата 7.4.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Сделал примерно так:
Код

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim container As Control = TabControl1.TabPages(0)
        Dim ctrl As Control
        Dim ctrl_arr(1) As Integer
        Dim i As Integer
        i = 0
        For Each ctrl In container.Controls
            If TypeOf (ctrl) Is TextBox Then
                ctrl_arr(i) = container.Controls.IndexOf(ctrl)
                i = i + 1
                ReDim Preserve ctrl_arr(i)
            End If
        Next

        For i = 0 To UBound(ctrl_arr) - 1
            container.Controls(ctrl_arr(i)).Text = i
        Next



    End Sub

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.