Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2012, 10:30   #1
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию Делегаты

Есть класс ClassTextBox:
Код:
Option Explicit
Public WithEvents Control As MSForms.TextBox
Private Sub Control_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
	'Отсюда надо вызвать процедуру MouseClick()
End Sub
и класс ClassFrame:
Код:
Public WithEvents Control As MSForms.Frame
Private TextBoxArr As ClassTextBox   'Массив Текстбоксов
Public Sub SetControl()
    Dim Ctr As Control
    Set Ctr = Control.Controls.Add("Forms.TextBox.1", "Head" & i, True) 
    Set TextBoxArr = New ClassTextBox		'Подготавливаем элемент массива
    Set TextBoxArr.Control = Ctr			'Сохраняем ссылку на TextBox
End Sub
'Вот эту процедуру необходимо вызвать из класса ClassTextBox
Public Sub MouseClick()
	'...
End Sub
Класс ClassFrame используется в UserForm:
Код:
Public MyFrame As ClassFrame
Private Sub UserForm_Initialize()
    Set Ctr = Me.Controls.Add("Forms.Frame.1", "New", True)
    Set MyFrame = New ClassFrame
    Set MyFrame.Control = Ctr
End Sub
Во "взрослых" языках программирования имеются средства для передачи ссылок на подпрограммы, типа делегатов в C#.
Можно ли добиться подобной функциональности средствами VBA? Пока единственная моя идея - это использовать для связи между классами стандартный модуль VBA
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 25.01.2012, 11:49   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

положите это в программый модуль:
Код:
Sub subN1()
  MsgBox "SUB N1"
End Sub

Sub subN2()
  MsgBox "SUB N2"
End Sub

Sub bbb()
  Do
    c = MsgBox("Yes - Call sub1," & Chr(10) & " No - Call sub2," & Chr(10) & " Cancel - Exit", _
    vbYesNoCancel, "Press any button")
    If c = vbCancel Then Exit Sub
    If c = vbYes Then s = "subn1" Else s = "subn2"
    Run s
  Loop Until False
End Sub
выполните bbb
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 25.01.2012, 12:20   #3
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
выполните bbb
Я знаю про эту возможность. При вызове процедур из программных (стандартных) модулей данная возможность срабатывает, а вот с классами - нет.
Я пробовал так:
- в UserForm задал Public MyFrame As ClassFrame
- создал в классе ClassFrame процедуру bbb()
- передавал в класс ClassTextBox строку: "UserForm.MyFramy.bbb"
- вызывал командами Run "UserForm.MyFramy.bbb" или Call "UserForm.MyFramy.bbb"

VBA ругался что "Процедура не найдена или макросы отключены"
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 25.01.2012, 13:21   #4
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Вот подготовил пример для опытов
Вложения
Тип файла: zip Пример.zip (24.6 Кб, 9 просмотров)
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 25.01.2012, 14:02   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Что значит "вызвать процедуру"?
Процедуры пишутся в стандартных модулях, и оттуда без проблем вызываются.

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


Вот надо вам вызвать из ClassTextBoxForFrame какой-то метод объекта ClassFrame
Вопрос: а какого из объектов ClassFrame? Любого? Если да, - то зачем?

Чтобы вызвать метод объекта ClassTextBoxForFrame, этот объект надо сначала создать (или найти среди ранее созданных)
Где код создания объекта ClassTextBoxForFrame?

Создайте объект ClassTextBoxForFrame, найдите перебором родительский объект ClassFrame, - и для этого объекта и вызывайте ту процедуру.

PS: Мне кажется, вы перемудрили с кодом.
Лучше бы на словах описали, что есть изначально, и что надо получить.
EducatedFool вне форума Ответить с цитированием
Старый 25.01.2012, 15:08   #6
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
В состав модулей класса процедуры включаются только в том случае, если они привязаны к объекту - экземпляру класса.
Лучше бы на словах описали, что есть изначально, и что надо получить.
Я пытаюсь написать объект, подобный ListView, но основанный на TextBox'ах, расположенных на Frame.
Для этого я создаю класс ClassFrame, и создаю в UserForm объект это класса:

Private MyFrame As ClassFrame
Set MyFrame.Control = Me.Controls.Add("Forms.Frame.1", "New", True)

В классе ClassFrame (в объекте MyFrame) я создаю "таблицу" из объектов класса ClassTextBoxForFrame:

Private TextBoxArr() As ClassTextBoxForFrame
Set TextBoxArr = New ClassTextBoxForFrame
Set TextBoxArr.Control = Control.Controls.Add("Forms.TextBox .1", "Head", True)

Теперь, при клике на одном из TextBox'ов, необходимо выделить цветом всю строку в таблице.
Полагаю, что Вы согласитесь, что эта операция привязана к объекту MyFrame (классу ClassFrame) и должна выполняться в нём?
Я пытался выполнить это действие, ловя событие _DblClick объекта ClassTextBoxForFrame и передавая данные в вышестоящий объект.
Конечно, можно наплодить кучу модулей, но хотелось бы минимизировать их количество.
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка(делегаты и сбытия)! Kami-sama C# (си шарп) 2 06.12.2011 18:18
Делегаты C# sir.andrey Помощь студентам 3 21.09.2011 10:06
MinGW, Делегаты. Пепел Феникса Общие вопросы C/C++ 14 28.07.2011 19:42
Делегаты CaypoH Общие вопросы .NET 3 04.01.2011 05:43
Делегаты в MSIL Андрей Стрелков Общие вопросы .NET 6 20.02.2009 19:17