програмно создать компонент

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

програмно создать компонент

Сообщение Invader » 16.07.2008 (Ср) 14:26

есть на форме 10 label , они в виде таблицы - 5 колонок и в 2 строки
в них передаю значения, всё работает...
но проблема стала когда расчет надо передать в цикле
если i от 1 до 3
отображаться
должно три таблицы и количество label естественно должно увеличиться= 30шт.

код:

Dim dafmin As Single
Dim dafmax As Single
Dim s As Single
Dim i As Single
Private Sub Command1_Click()
Dim daf As Long

Cls
For daf = dafmin To dafmax
s = dafmin - 1
i = daf - s
Label3(i).Top = i * 10
Label3(i).Caption = daf
Next daf
End Sub
умён и жаден,
характер отсуствует

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 16.07.2008 (Ср) 14:59

Эх... На VB не писал сто лет, да и нет его под рукой. Но по старой памяти в голову лезет код примерно такого вида:

Код: Выделить всё
Dim lbl as Label
Set lbl = New Label
lbl.Visible = true


Я мог ошибиться, но направление верное, сто пудов.
А я все практикую лечение травами...

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

Сообщение Viper » 16.07.2008 (Ср) 15:20

Twister, не совсем... :)
Invader, думай в сторону массива контролов и Load.
Весь мир матрица, а мы в нем потоки байтов!

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Сообщение Invader » 16.07.2008 (Ср) 16:34

Twister писал(а):
Код: Выделить всё
Dim lbl as Label
Set lbl = New Label
lbl.Visible = true




Пробую код , но basic ругается:
" Invalid use of New keyword"
умён и жаден,
характер отсуствует

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 16.07.2008 (Ср) 16:50

Мне никогда не нравились массивы контролов и Load. И я всегда пользовался Form.Controls.Add :)
I don't understand. Sorry.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Сообщение Invader » 16.07.2008 (Ср) 17:33

благодарен за все идеи , отдельно Viper, идея с массивом - гуд,
но как но как объяснить что ячейка массива есть контрл-label
упрощу вопрос: как вообще грамотно добавить label, textbox....
программно на форму
заранее прошу прощения, но гугл достал сылками на VBNet, ASP.NET
и VBA c Exelёm's
умён и жаден,
характер отсуствует

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 17.07.2008 (Чт) 6:41

Twister, не совсем...
Ну значит я уже успел основательно забыть VB. Да, а принципе, и слава богу... :)
А я все практикую лечение травами...

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 17.07.2008 (Чт) 13:34

но как объяснить что ячейка массива есть контрл-label

Какой массив - такой и контрол. Если у тебя на форме массив Label'ей - ничего другого ты в него не добавишь.
Знание английского языка - затрудняет понимание кода

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Сообщение Invader » 17.07.2008 (Чт) 14:24

что есть массив labels?
я понимаю массив это
типа:

Option Base 1
Dim element(10) As Long
Dim x As Long
Private Sub Form_Load()
For x = 1 To 10
element(x) = x
Next x
End Sub

как element приравнять к несуществующему пока на форме Label
умён и жаден,
характер отсуствует

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 17.07.2008 (Чт) 14:30

Речь не об этом.

У объекта Label есть аттрибут Index - найдите его в окне свойств.
Если Index имеет какое-то значение - значит мы имеем дело с элементом массива.
Да что я вам рассказываю, когда вы копируете и вставляете элемент на форме, он у вас спрашивает что-то типа "Вы хотите создать массив элементов". Нажмите "да" и посмотрите что будет.
Я лично нигде ничего про это не читал, до всего дошел экспериментальным методом.

Когда поймете, что такое массив элементов управления - разбирайтесь с оператором Load - не может быть, чтобы про него нигде еще не писали.
Знание английского языка - затрудняет понимание кода

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

Сообщение Viper » 17.07.2008 (Чт) 14:39

Исходно должен существовать один Label с Index = 0 и, например, с именем lblArray. Далее в нужном месте кода пришется следуюший код:
Код: Выделить всё
Load lblArray(i)

где i соотвествующий индекс нового элемента типа Label. После этого присваиваем новому элементу нужные свойства и готово дело. Обратная операция проиводится при помощи Unload.
Весь мир матрица, а мы в нем потоки байтов!

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 17.07.2008 (Чт) 14:44

присваиваем новому элементу нужные свойства

Не забываем присвоить
lblArray(i).Visible=True
Знание английского языка - затрудняет понимание кода

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Сообщение Invader » 17.07.2008 (Чт) 14:52

ну вот это меня и интересовало!!!
я уже статью нашёл как программно
через api создать елемент, 300 строчек кода.
Про index забыл, но помнил что решение простое огромное спасибо всем.
извеняюсь за не внимательность :oops:
умён и жаден,
характер отсуствует

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.07.2008 (Чт) 16:18

Люди вы о чем???

Человеку элементарный Grid нужен, а не огород городить...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Сообщение Invader » 18.07.2008 (Пт) 9:26

нет элемент Grid это очень здорово, но интерес был вспомнить как множить элементы.
да и для интерфейса моей проги Grid не очень подходил
умён и жаден,
характер отсуствует

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 18.07.2008 (Пт) 10:08

Вот, чтобы не перегружать форум новыми топиками, задам вопрос сюда. Как организовать подобие двумерного массива контролов? Надо, чтоб они на форме прямоугольной матрицей лежали и обращаться бы к ним можно было по координатам.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Сообщение Invader » 18.07.2008 (Пт) 12:09

ДЕНИС,
на форму влепи кнопку, label с индексом 0, visible в false, назови label - lb

и далее код:

Option Explicit
Dim x As Long
Dim y As Long
Dim s As Long
Private Sub Command1_Click()
For y = 1 To 20

For x = 1 To 10
s = y * 10 + x
Load lb(s)
lb(s).Visible = True
lb(s).Top = x * 500
lb(s).Left = y * 1500
Next x
Next y
End Sub
умён и жаден,
характер отсуствует

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.07.2008 (Пт) 13:12

Денис
Никак. Массив контроллов -- он даже вовсе и не массив, потому что не обязан быть непрерывным. Это скорее, коллекция. Коллекции многоуровневыми не бывают.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 18.07.2008 (Пт) 13:18

Invader
А как обращаться к ним по координатам (x, y), например, установить цвет ярлычка с координатами (5, 5)?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.07.2008 (Пт) 13:19

Денис
Подумай об операторах Mod и \
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 18.07.2008 (Пт) 14:23

Хакер
Подумал. Работает... Только как это с последней строкой баг поправить? Проверять чтоли, не является ли Y последним и прибавлять 1 к предыдущему Y? Выглядит как-то некрасиво...
Вложения
frmTest.zip
Тест
(748 байт) Скачиваний: 42
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.07.2008 (Пт) 14:25

((Index - 1) Mod mX) + 1
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 18.07.2008 (Пт) 14:43

Да. Я тоже так сделал.
Код: Выделить всё

  Dim iX As Long
  Dim iY As Long
 
  iX = Index \ mX
  iY = Index Mod mX
 
  If iY = 0 Then
    iX = (Index \ mX) - 1
    iY = ((Index - 1) Mod mX) + 1
  End If
   
  Lb(Index).Caption = "X=" & CStr(iX) & vbCrLf & "Y=" & CStr(iY)
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Invader
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 18.01.2005 (Вт) 4:22
Откуда: Молдавия, Виноград

Сообщение Invader » 18.07.2008 (Пт) 17:27

народ я по моему первый откликнулся на вопрос Дениса, программа была написана на его вопрос мгновенно.
я думал что в общем я решил его проблему а насчет определения ,
я думаю что есть у элементов параметры left, top и тд. так что дерзайте, рабочий день у меня закончен и возможно завтра загляну на форум. Всем огромное спасибо за обсуждение темы, на которую в начале ни кто не обращал внимания :cry:
умён и жаден,
характер отсуствует

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 21.07.2008 (Пн) 7:53

Ля, как прикольно!
Вложения
frmTest.zip
Слегка дооформил.
(987 байт) Скачиваний: 34
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ZOD
Обычный пользователь
Обычный пользователь
 
Сообщения: 75
Зарегистрирован: 24.03.2004 (Ср) 19:54
Откуда: Barnaul

Сообщение ZOD » 31.07.2008 (Чт) 11:33

Подскажите, как из функции в модуле получить доступ к созданным программно контролам?
У меня есть форма, на ней PictureBox, а на нем уже массив лэйблов. Из функции, расположенной в модуле, при попытке обращения к лэйблам выдает сообщение "Method or data memver not found". Как сделать эти лейблы Global или Public, или как это называется.
----------------------------
Все, решил:
Код: Выделить всё
frmSearch.Controls("lblThumb")(Index).Caption
Последний раз редактировалось ZOD 31.07.2008 (Чт) 11:49, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 31.07.2008 (Чт) 11:34

ZOD
Они и так диспатчатся как публичные мемберы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Viper » 31.07.2008 (Чт) 12:35

Все гораздо проще
Код: Выделить всё
frmSearch.lblThumb(Index).Caption
Весь мир матрица, а мы в нем потоки байтов!

ZOD
Обычный пользователь
Обычный пользователь
 
Сообщения: 75
Зарегистрирован: 24.03.2004 (Ср) 19:54
Откуда: Barnaul

Сообщение ZOD » 31.07.2008 (Чт) 12:47

Странно, она ж в контейнере ПикчерБоксе... Ну ладо, буду знать. Спасибо.

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

Сообщение Viper » 31.07.2008 (Чт) 12:58

ZOD писал(а):Странно, она ж в контейнере ПикчерБоксе... Ну ладо, буду знать. Спасибо.
Тот факт, что лэйблы в контейнере здесь не при чем.
Весь мир матрица, а мы в нем потоки байтов!

След.

Вернуться в Visual Basic 1–6

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

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

    TopList