usercontrol событие

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

usercontrol событие

Сообщение iolaus » 11.03.2007 (Вс) 1:02

У меня есть узер контрол. я располагаю его на форме. у формы есть событие связаное с этим контролом, например клик. все работае на ура.

Если этот юзер контрол не выкладывать на форму, а загружать во время работы:

With Me.Controls.Add("Project1.CSE", "CSE", Me)
.Top = 0
.Left = Me.Width - .Width
.Visible = True
End With

то событие связаное с этим контроло уже не работает!!!
также неработает такое свойство как height и width

Почему? может мне кто подсказат?

Заанее спасибо
This message will self destruct in five seconds!!!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Re: usercontrol событие

Сообщение GSerg » 11.03.2007 (Вс) 7:02

iolaus писал(а):Почему?

Очевидно потому, что ты просто включил в код процедуру CSE_Click в надежде, что она подхватится обработчиком нового контрола, чего, разумеется, не будет.
Нажми F1 и почитай про WithEvents. Или поищи его в поиске, он выделен красным.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 11.03.2007 (Вс) 22:21

ну так это для работы с классами, а у меня то узер контрол. что-то я не понимаю как это применть в моем случае...

подскажите плз....
This message will self destruct in five seconds!!!

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 11.03.2007 (Вс) 23:19

Код: Выделить всё

Option Explicit
Private WithEvents CSE1 As VBControlExtender

Private Sub CSE1_ObjectEvent(Info As EventInfo)
Select Case Info.Name
Case "Click"
    Debug.Print "click"
End Select
End Sub

Private Sub Form_Load()
With Me.Controls.Add("Project1.CSE", "CSE1", Me)
.Top = 0
.Left = Me.Width - .Width
.Visible = True
End With
Set CSE1 = Me.Controls("CSE1")
End Sub

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 12.03.2007 (Пн) 0:14

Огромное спасибо!!!! именно то что надо.
This message will self destruct in five seconds!!!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.03.2007 (Пн) 7:18

Зачем так сложно? :roll:

Код: Выделить всё
option explicit
Private WithEvents CSE1 As CSE

Private Sub CSE1_Click
  Debug.Print "click"
End Sub

Private Sub Form_Load()
  Set CSE1 = Me.Controls.Add("Project1.CSE", "CSE1")

  With CSE1
    .Move Me.Width - .Width, 0
    .Visible = True
  End With
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 12.03.2007 (Пн) 12:42

короче я понял в чем я идиот. я не делал SET.
Спасибо всем.
Первый вариан мне если честно удобнее даже.
This message will self destruct in five seconds!!!

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 12.03.2007 (Пн) 18:07

Еще вопрос.
я так понял что withevents с массивамине работает.

можно ли как динамически загружать массив узерконтролов с последующей обрадоткй их событий?
This message will self destruct in five seconds!!!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.03.2007 (Пн) 19:55

Слабо воспользоваться поиском?
http://bbs.vbstreets.ru/viewtopic.php?p=37547#37547
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 12.03.2007 (Пн) 20:29

Первый вариан мне если честно удобнее даже.


код приведенный GSerg "чуть-чуть не работает", в том смысле, что
он предполагает "оболочку Property Get/Let"
которой может и не быть у контрола.

Debug.Print CSE1.Width 'Error 461

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.03.2007 (Пн) 20:40

Что за "оболочка"?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 12.03.2007 (Пн) 20:55

Что за "оболочка"?


Код: Выделить всё
Dim m_Width As Integer

Public Property Get Width() As Integer
    Width = m_Width
End Property

Public Property Let Width(ByVal New_Width As Integer)
    m_Width = New_Width
    'PropertyChanged "Width"
End Property

:shock:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.03.2007 (Пн) 20:57

Выложи сюда аттачем юзерконтрол, пожалуйста, у которого не будет свойства Width.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 12.03.2007 (Пн) 21:04

Не надо иронии.
Создайте в проекте UserControl без свойств, событий и методов
и динамически положите его на форму, потом Debug.Print UserControl1.Width

И выложите аттачем юзерконтрол, у которого будет свойство Width.
:lol:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.03.2007 (Пн) 21:22

Какой забавный баг компилятора...
Впрочем, это не отменяет сути. Любой UserControl наследует от Control, и потому изначально автоматически обладает свойством Width и ешё рядом других полезных свойств.
Почему компилятор не просекает это, неизвестно, но от кода юзерконтрола это не зависит, а уж включать собственный код для Width и вовсе вредно.
Переменную CSE1 кастуешь к типу Control, и компилятор резко прозревает.
Но то, прозрел он или нет, не оказывает влияния на наличие Width у юзерконтрола. Оно есть. Унаследовано. И его не может не быть.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 12.03.2007 (Пн) 23:38


iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 13.03.2007 (Вт) 10:56

воспользовался вот чем:

код формы
Код: Выделить всё
Private txtdoug() As DtextBox

Private Sub Form_Load()
Dim i As Integer
For i = 0 To 4
ReDim Preserve txtdoug(i)
Set txtdoug(i) = New DtextBox
txtdoug(i).MyMake Me, i
With Form1.Controls("dtext" & i) ' TxtAny
.Left = 700
.Top = 700 + 500 * i
.Width = 1240
.Height = 240
.Text = .Name
.Visible = True
End With
Next i

End Sub


код класса
Код: Выделить всё
Private WithEvents txtdoug As TextBox

Public Sub MyMake(Fname As Form, i As Integer)
Set txtdoug = Fname.Controls.Add("vb.textbox", "Dtext" & i, Fname)
End Sub

Private Sub txtdoug_Click()
ShoMsg txtdoug
End Sub

Private Sub ShoMsg(txtAny As TextBox)
MsgBox txtAny.Name
End Sub


но есть проблема в том что событие возникает в классе в не в форме на которой расположен элемент.

Как можно это поправить?
This message will self destruct in five seconds!!!

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 13.03.2007 (Вт) 14:18

разобрался. можно просто создать публичную функцию на форме и обратиться к ней через parent
This message will self destruct in five seconds!!!

iolaus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 19.03.2002 (Вт) 18:33
Откуда: Москва

Сообщение iolaus » 13.03.2007 (Вт) 14:38

вот про добавление события например width к usercontrol все понятно.

а как например добавить такую штуку как Controls к Usercontrol, чтобы можно было получать список controlов используемых в нем???
This message will self destruct in five seconds!!!

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

Сообщение Viper » 13.03.2007 (Вт) 15:14

Стоит заценить кнопку Правка
Весь мир матрица, а мы в нем потоки байтов!


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

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

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

    TopList