Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как динамически добавить кнопку в классе 
:(
    Опции темы
CMYK
Дата 19.4.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет всем! Подскажите как организовать это в классе!? smile 
Код
Option Explicit

Private WithEvents btnObj As CommandButton

Private Sub btnObj_Click()
MsgBox "Это динамически добавленная кнопка."
End Sub

Private Sub Form_Load()
Set btnObj = Controls.Add("VB.CommandButton", "btnObj")
With btnObj
.Visible = True
.Width = 2000
.Caption = "Hello"
.Top = 1000
.Left = 1000
End With

End Sub


Код выше меня совсем не устраевает хоть он и рабочий, нужно с помощью класса, вот так (код внизу) говрит ошибка, вообще я не знаю за ранее сколько кнопок понадобится, но сейчас вопрос стоит хотябы кнопку добавить подскажите как?. 
Код
Public Sub BUTTON()
Set btnObj = Controls.Add("VB.CommandButton", "btnObj") 'ошибка необходим обект. как быть?
With btnObj
.Visible = True
.Width = 2000
.Caption = "Hello"
.Top = 1000
.Left = 1000
End With
End Sub


Это сообщение отредактировал(а) CMYK - 19.4.2009, 20:58
PM MAIL   Вверх
Akina
Дата 19.4.2009, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Ну правильно, в твоём классе нет свойства Controls().


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
CMYK
Дата 19.4.2009, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Akina Можно по подробней пожалуйста! особенно как с событиями быть!
PM MAIL   Вверх
Akina
Дата 19.4.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Куда уж подробнее... вместо Controls.Add должно быть Forms("ИмяТвоейФормы").Controls.Add

И потом - где у тебя, спрашивается, класс? Что за класс? Вынесение процедуры в отдельный модуль класса не порождает...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
CMYK
Дата 19.4.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Это не весь код просто! как теперь событие определить для кнопки, если можно пожалуйста.

Код

Private MY_CONN As ADODB.Connection
Private MY_RSET As ADODB.Recordset
Private Var_PATH_BASE As String
Private Var_QUERY As String


Public Property Get PATH_BASE() As String
PATH_BASE = Var_PATH_BASE
End Property

Public Property Let PATH_BASE(ByVal sNewValue As String)
Var_PATH_BASE = sNewValue
End Property

Public Property Get SQL_QUERY() As String
SQL_QUERY = Var_QUERY
End Property

Public Property Let SQL_QUERY(ByVal NewValue As String)
Var_QUERY = NewValue
End Property



Public Sub ROWS_TO_ARRAY(MASS() As String, MY_ID As Long, MY_FIELD As Long)
Set MY_CONN = New ADODB.Connection
MY_CONN.CursorLocation = adUseClient
MY_CONN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Var_PATH_BASE
 

Dim v
Dim i As Long


Set MY_RSET = New ADODB.Recordset
MY_RSET.Open Var_QUERY, MY_CONN, adOpenForwardOnly, adLockReadOnly, adCmdText


   v = MY_RSET.GetRows

  ReDim MASS(UBound(v, 2))
  For i = 0 To UBound(v, 2)
  MASS(i) = v(MY_ID, i) & "_" & v(MY_FIELD, i)

  Next

MY_RSET.Close
Set MY_RSET = Nothing
Set MY_CONN = Nothing
End Sub


Public Sub BUTTON()
Set btnObj = Form1.Controls.Add("VB.CommandButton", "btnObj")
With btnObj
.Visible = True
.Width = 2000
.Caption = "Hello"
.Top = 1000
.Left = 1000
End With
End Sub


PM MAIL   Вверх
Akina
Дата 19.4.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Private WithEvents btnObj As CommandButton
Set btnObj = Controls.Add("VB.CommandButton", "btnObj")

разницу видать?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
CMYK
Дата 19.4.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот я добавил в форму ну как не реагирует на клик. в модуле тоже не работает,  не понимаю smile 
Код
Private WithEvents btnObj As CommandButton

Private Sub btnObj_Click()
MsgBox "Это динамически добавленная кнопка."
End Sub

PM MAIL   Вверх
CMYK
Дата 21.4.2009, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код
'Будущий класс для работы с базой данных

Private MY_CONN As ADODB.Connection
Private MY_RSET As ADODB.Recordset
Private Var_PATH_BASE As String
Private Var_QUERY As String
Private Var_FormName As String
Private Var_RowsHeight As Long
Private Var_PName As Boolean

Public Property Get PATH_BASE() As String
PATH_BASE = Var_PATH_BASE
End Property

Public Property Let PATH_BASE(ByVal sNewValue As String)
Var_PATH_BASE = sNewValue
End Property

Public Property Get SQL_QUERY() As String
SQL_QUERY = Var_QUERY
End Property

Public Property Let SQL_QUERY(ByVal NewValue As String)
Var_QUERY = NewValue
End Property



Public Sub ROWS_TO_ARRAY(MASS() As String, MY_ID As Long, MY_FIELD As Long) 'процедура для подстановки  (combobox)
Set MY_CONN = New ADODB.Connection
MY_CONN.CursorLocation = adUseClient
MY_CONN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Var_PATH_BASE
 

Dim v
Dim i As Long


Set MY_RSET = New ADODB.Recordset
MY_RSET.Open Var_QUERY, MY_CONN, adOpenForwardOnly, adLockReadOnly, adCmdText


   v = MY_RSET.GetRows

  ReDim MASS(UBound(v, 2))
  For i = 0 To UBound(v, 2)
  MASS(i) = v(MY_ID, i) & "_" & v(MY_FIELD, i)

  Next

MY_RSET.Close
Set MY_RSET = Nothing
Set MY_CONN = Nothing
End Sub

Public Property Get Form_name() As String
Form_name = Var_FormName
End Property

Public Property Let Form_name(ByVal NameF As String)
Var_FormName = NameF
End Property

Private Sub MyGrid(PName As Long)

On Error GoTo ErrorHandler

If Var_PName = True Then
PName = 0
Var_RowsHeight = 0 'top всей этой батвы
Var_PName = False
Else
Var_RowsHeight = Var_RowsHeight + 300 'тут будет в место 300 переменная RowsHeight as Long ну и дальше в током же духе

End If


Set MyButton = Form1.Controls.Add("VB.CommandButton", "MyButton" & PName) 'добавляем кнопку

With MyButton
.Height = 300
.Width = 300
.Caption = PName
.Top = Var_RowsHeight
.Left = 0
.Visible = True
End With

For i = 0 To 12
Dim sName As String
sName = "MyLabel" & i & PName & i
Form1.Controls.Add "VB.Label", sName 'добавляем этикетку
With Form1.Controls(Form1.Controls.Count - 1)
.Top = Var_RowsHeight
.Left = Form1.Controls(Form1.Controls.Count - 2).Left + Form1.Controls(Form1.Controls.Count - 2).Width - 20
.Height = 300
.Width = 1200
.Alignment = 2
.Appearance = 0
.Caption = PName & i 'ну так для себя посмотреть
.BorderStyle = 1
.BackColor = RGB(115, 205, 208)
.Visible = True
End With
Next i
ErrorHandler:
If Err.Number = 727 Then
Form1.Controls.Add "VB.Label", sName & PName & "f" 'если имя повторяется, меняем имя этикетки
'ну собственно до этого не дойдет, максимальное количество строк сумма всех RowsHeight <= Form1.Height
'для вертикальной прокрутки менять Caption в этикетках, при клике подставлять TextBox подключенный к базе и перемещать указатель в нужное место, ну и т. д.
MsgBox "ошибка " & sName & PName & "f"  '101

End If
End Sub

Public Sub AddRows(RowsCount As Long) 'как вариант, но плохой
Var_PName = True
Dim i As Long
For i = 0 To RowsCount
MyGrid i
Next

End Sub


'Вопросы:
'как обратиться к новоиспеченному Label и еже с ним из класса (можно не надо, если только вот так Form1.Controls(Form1.Controls.Count - 10))
'можно ли добавить Label-ов равно количеству колонок и создать из них массивы тоже самое относится к MyButton (процедура в модуле класса)
'как создать события (их родные) для Label и тд.
'и как динамично указать имя формы (Form1.Controls.Add ), Forms("Имя формы")- не катит и не гипотенузит всё сразу и вместе или я не допонял по этому пункту



PM MAIL   Вверх
Akina
Дата 21.4.2009, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Цитата(CMYK @  21.4.2009,  02:55 Найти цитируемый пост)
как обратиться к новоиспеченному Label и еже с ним из класса (можно не надо, если только вот так Form1.Controls(Form1.Controls.Count - 10))
По имени...
Код

Form1.Controls("Label123")
'или 
Form1.Controls(sName)
чем не устраивает?
Цитата(CMYK @  21.4.2009,  02:55 Найти цитируемый пост)
можно ли добавить Label-ов равно количеству колонок и создать из них массивы тоже самое относится к MyButton (процедура в модуле класса)

Конечно... первый экземпляр должен создаваться с управляющим массивом, а дополнительные контролы в массив подгружаются/удаляются по Control.Load/Unload
Цитата(CMYK @  21.4.2009,  02:55 Найти цитируемый пост)
как создать события (их родные) для Label и тд.

Код у тебя вроде уже есть... не работает? начни с примеров в MSDN по назначению/переопределению методов, ищи, в чём твой код отличается.
Цитата(CMYK @  21.4.2009,  02:55 Найти цитируемый пост)
и как динамично указать имя формы (Form1.Controls.Add ), Forms("Имя формы")- не катит и не гипотенузит всё сразу и вместе или я не допонял по этому пункту

Не понял... что там "не катит"? чем плохо обращение по имени?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
CMYK
Дата 21.4.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Akina  ОГРОМНЕЙШЕЕ СПАСИБО!  как допишу,  скину, а на счет Forms("Form1") никак не хочет работать.
PM MAIL   Вверх
Akina
Дата 22.4.2009, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Цитата(CMYK @  21.4.2009,  23:16 Найти цитируемый пост)
Forms("Form1") никак не хочет работать

Пройди по всей коллекции и проверь, действвительно ли форма отсутствует, или у неё тупо имя другое:
Код

for each oneform in forms
   debug.print oneform.name
next



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
CMYK
Дата 22.4.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Зуб даю имя именно это - Form1, это имя присвоено автоматически, я его не менял, и в этом проекте, где класс проверю, одна форма.
PM MAIL   Вверх
CMYK
Дата 24.4.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Forms("Имя формы") = стёб smile

Добавлено через 2 минуты и 22 секунды
Конечно... первый экземпляр должен создаваться с управляющим массивом, а дополнительные контролы в массив подгружаются/удаляются по Control.Load/Unload

если всё это в run-tame, то это не возможно в vb6
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


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

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


 




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


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

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