Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
blanks
0 / 0 / 0
Регистрация: 22.04.2010
Сообщений: 15
1

Динамическое добавление контрола на форму

25.07.2011, 18:07. Просмотров 2154. Ответов 11
Метки нет (Все метки)

Привет всем!
Задача в следующем: At run-time необходимо добавлять в указанное место на форме контрол допустим Image со всеми его свойсивами.
К примеру следующий код добавляет Image, но без всех присущих ему свойств. Еще плюс ко всему чтобы добавленный добавленный контрол откликался на события (клик, драг&дропы и т.д.)
Visual Basic
1
2
3
4
5
6
7
8
9
10
Set Fishka = Form1.Controls.Add('forms.image.1', 'Name')
   With Fishka
    .BorderStyle = 0 ' ругается 
    .Width = 495
    .Height = 495
    .Picture = Image2.Picture 'тоже ругается
    .Left =  800
    .Top = 800
    .Visible = True
End With
Заранее благодарен!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2011, 18:07
Ответы с готовыми решениями:

Динамическое создание контрола
Не пойму в чем дело. Мне нужно создать контрол Explorier-а, это тот который на...

Динамическое добавление элемента
Добрый день! Мне нужно динамически добавлять в форму элементы, причем без...

Добавление TextBox на форму
Мне нужно программно вставить TextBox Принцип действия - по нажатию на кнопку...

Добавление изображения на форму
При добавлении изображения на форму, появляется ошибка "File not found". Пишу...

Выбор и добавление изображения на форму по нажатию кнопки
имеется форма,которая будет добавлять информацию в файл txt. на ней...

11
blanks
0 / 0 / 0
Регистрация: 22.04.2010
Сообщений: 15
25.07.2011, 18:09  [ТС] 2
Сорри за очепятки!!!
0
Comanche
25.07.2011, 19:30 3
Учимся пользоваться поиском в Сети:
1. В Гугле вколачиваем 'Controls.Add'.
2. Идём смотреть второй результат поиска: http://support.microsoft.com/kb/q190670/.
3. Находим там ответы на все вопросы, в т.ч. понимаем, почему 'ругается' и 'тоже ругается' )
4. Краснеем от осознания собственной лени.
blanks
0 / 0 / 0
Регистрация: 22.04.2010
Сообщений: 15
26.07.2011, 11:47  [ТС] 4
Спсб, позеленел!
0
Comanche
26.07.2011, 11:48 5
)
blanks
0 / 0 / 0
Регистрация: 22.04.2010
Сообщений: 15
26.07.2011, 17:48  [ТС] 6
Динамическое добавление работает. Только как по ходу добавления создать из добавленных массив контролов?
0
Comanche
26.07.2011, 18:28 7
Тогда по-другому надо:
Кидаешь на форму Image1(0) с Visible = False. Затем в коде пишешь:
Visual Basic
1
2
3
4
5
6
7
Load Image(1)
' позиционируешь его, как тебе надо
Image(1).Visible = True
'
Load Image(2)
' позиционируешь его, как тебе надо
Image(2).Visible = True
и т.д.

Тут и WithEvents не понадобится, потому что можно просто пользоваться всеми событиями 'контрола-прародителя', т.е. Image1(0).
blanks
0 / 0 / 0
Регистрация: 22.04.2010
Сообщений: 15
28.07.2011, 13:15  [ТС] 8
Спасибо! Все разложилось как надо!
0
Irokez
11.08.2011, 02:51 9
А у меня тоже вопросик из этой серии.
Есть картинка-контейнер с кучей контролов.
Все с индексом 0.
Надо в рантайме добавить еще пару картинок.
При лоаде появляется картинка, но без внутренностей.
Никто не знает как сделать так, чтобы не лоадить
каждый контрол отдельно. Уж очень их там много.
Длиннючий код получается.
Comanche
11.08.2011, 12:58 10
Поскольку вот такой код не работает:
Visual Basic
1
2
3
4
5
6
For Each childObj In Me.Controls
    If childObj.Container Is Picture1(0) Then
        Load childObj(1)
        childObj(1).Visible = True
    End If
Next
то можно сделать так:
1. Вставить в проект отдельную форму - например, frmBase. Убрать бордюр, controlbox, caption.
2. Разместить на ней набор нужных контролов; возможно - заключив весь набор сначала в пикчербокс, соразмерный с самой формой (это уж зависит от требований к внешнему виду - нужна 'впуклая' рамка вокруг контролов или нет).
3. В коде формы, на которой надо N раз клонировать набор контролов, пишем:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim frmClone() As Form
Dim OldStyle As Long, NewStyle As lOng
Dim rez As Lonh
' .....
N = ...
ReDim frmClone(1 To N)
For i = 1 To N
    Set frmClone(i) = New frmBase
    Load frmClone(i)
    With frmClone(i)
        OldStyle = GetWindowLong(.hWnd, GWL_STYLE)
        NewStyle = OldStyle And (Not WS_POPUP) Or WS_CHILD
        rez = SetWindowLong(.hWnd, GWL_STYLE, NewStyle)
        SetParent .hWnd, Me.hWnd
        .Left = 100
        .Top = (i - 1) * (frmBase.Height + 100)
        .Visible = True
    End With
Next
Именно этот код я не пробовал, но должно работать - нечто похожее я когда-то делал. Смысл в том, что 'целиковое' клонирование (т.е. вместе со всеми детьми) запросто происходит на уровне формы, в момент Set frmClone(i) = New frmBase. Ну а затем форма-клон 'внедряется' в форму-родитель, с сохранением кода событий контролов формы frmBase.
Comanche
11.08.2011, 13:08 11
Чуть не забыл важную весчь: при закрытии формы-родителя надо обязательно 'убирать за собой', а то останутся 'висяки'. Т.е. в коде QueryUnload надо написАть:
Visual Basic
1
2
3
4
5
6
7
8
For i = 1 To N
    SetParent frmClone(i).hWnd, 0& ' или GetDesktopWindow() - один чёрт
    Unload frmClone(i)
    Set frmClone(i) = Nothing
Next
Unload frmBase
Set frmBase = Nothing
Set Form1 = Nothing
Конечно, N и frmClone() должны быть объявлены на уровне формы, или вообще проекта.
Comanche
11.08.2011, 13:36 12
Я всё-таки попробовал щас этот подход на практике. Всё работает, но сначала я не понял, как в обработчике события какого-либо клонированного контрола понять, а о каком именно инстансе (клоне) идёт речь? - правда, щас уже разобрался.

Короче, допустим на frmBase мы разместили обычную кнопку, и в еёйном событии Click написали MsgBox Me.Name. Затем клонируем два раза (N = 2) эту форму на родительскую - получаем в итоге на родительской две кнопки. Жмём на любой - получаем мессаджбокс с сообщением 'frmBase'. А по идее хотелось бы получить 'frmClone(1)' и 'frmClone(2)'.

Чтобы это сделать, нужно в коде формы frmBase описАть дополнительное свойство:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private m_CloneID As Long
 
Public Property Let CloneID(ByVal NewValue As Long)
    m_CloneID = NewValue
End Property
 
Public Property Get CloneID() As Long
    CloneID = m_CloneID
End Property
 
Private Sub Command1_Click(Index As Integer)
    MsgBox 'CloneID = ' & m_CloneID
End Sub
А при клонировании воткнуть в цикл:
Visual Basic
1
.CloneID = i
И всё будет пучком: номер клона привяжется к самому клону (инстансу) - только ГЛАВНОЕ: массив frmClone() нужно объявить не 'As Form', а 'As frmBase' !!!

В общем, кому интересно, могут взять проект со ссылки:
http://formtoini.narod.ru/Downloads/EmbeddedForm.zip.
11.08.2011, 13:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2011, 13:36

Динамическое добавление контрола
создаю динамический контрол и добавляю его на форму. TextBox textBox1= new...

Добавление контрола на форму из другого потока
Приветствую. Собственно уже все перерыл. Просто доступ к уже созданному...

Динамическое добавление объектов на форму
Задача такая: Добавить n элементов типа checkBox. n вводится в edit Нашёл на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru