Страница: 1 | 2 |
|
Вопрос: Передать ссылку на функцию?
|
Добавлено: 31.10.08 00:04
|
|
Автор вопроса: Nytrogen
|
Быть может, мой вопрос покажется Вам лишённым всякой логики, однако данная проблема имеет право на существование.
Я создаю свой класс, связывающий объекты в некоторую паутину взаимных зависимостей. Предполагается, что у данного класса должен быть метод - рассчитать, который по некоторой формуле должен вычислять значение. Проблема в том, что у каждого экземпляра этого класса (т.е. объекта) эта формула своя.
Как бы передать объекту формулу для расчёта?
Я вижу два варианта на псевдокоде. Первый:
Function Calculate()
Calculate = A + B
End Function
C = New ClassMember
C.Formula = [I]ссылка на Calculate()[/I]
Второй:
C = New ClassMember
C.Formula = "A + B"
'процедура в модуле класса
Sub Calculate()
[I]выполнить код: Me.Formula[/I]
End Sub
Ответить
|
Номер ответа: 1 Автор ответа: Holsten
Вопросов: 5 Ответов: 100
|
Профиль | | #1
|
Добавлено: 31.10.08 00:36
|
Если имеешь ввиду передать указатель на public-функцию, то можно через addressof и CallWindowProc.
Ответить
|
Номер ответа: 3 Автор ответа: Holsten
Вопросов: 5 Ответов: 100
|
Профиль | | #3
|
Добавлено: 31.10.08 01:07
|
Все параметры можно и в одну структуру запихнуть, или объявить синонимы CallWindowProc с разной сигнатурой.
Но в вопросе смущает C.Formula = "A + B" . Понимает ли автор сам, что хочет?
Ответить
|
Номер ответа: 5 Автор ответа: Nytrogen
Вопросов: 18 Ответов: 186
|
Профиль | | #5
|
Добавлено: 31.10.08 01:21
|
Похоже, AddressOf - это то, что нужно. Только что-то не догоняю, как юзать =(.
- C.Formula = AddressOf(FunctionName)
и вариации на тему не компилятся.
Понимает ли автор сам, что хочет?
- Понимаю. Пусть, A и B - переменные, которые по ходу программы меняются. При их изменении я буду вызывать C.Calculate. Отслеживание значений A и B - это уже моя проблема, которая как раз и реализована этим классом.
Ответить
|
Номер ответа: 7 Автор ответа: Holsten
Вопросов: 5 Ответов: 100
|
Профиль | | #7
|
Добавлено: 31.10.08 01:28
|
-
- Private Function adr(a As Long) As Long
- adr = a
- End Function
- C.Formula = adr(AddressOf FunctionName)
- CallWindowProc C.Formula , 0, 0, 0, 0
Ответить
|
Номер ответа: 9 Автор ответа: Holsten
Вопросов: 5 Ответов: 100
|
Профиль | | #9
|
Добавлено: 31.10.08 02:21
|
В C.Formula записывается некоторое число
Это записывается адрес функции.
Вызов по адресу осуществляешь внутри класса: ret = CallWindowProc (m_adrformula,0,0,0,0)
Ответить
|
Номер ответа: 11 Автор ответа: Holsten
Вопросов: 5 Ответов: 100
|
Профиль | | #11
|
Добавлено: 31.10.08 02:30
|
Excel вылетает из за несоответствия параметров CallWindowProc и твоей функции на которую идет вызов.
Просто определи в ней 4 параметра long даже если они не участвуют в вычислениях
Function MyCalculate(d1 As Long, d2 As Long, d3 As Long, d4 As Long)
Ответить
|
Номер ответа: 12 Автор ответа: Nytrogen
Вопросов: 18 Ответов: 186
|
Профиль | | #12
|
Добавлено: 31.10.08 02:42
|
Когда определил 4 параметра, вылетать стал сразу
- Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
-
- Private Function adr(a As Long) As Long
- adr = a
- End Function
-
- Function Formula(ByVal d1 As Long, ByVal d2 As Long, ByVal d3 As Long, ByVal d4 As Long)
- Formula = 2 + 3
- End Function
-
- Sub TestSub()
- Dim testVar As New Test
- testVar.theFunction = adr(AddressOf Formula)
- End Sub
-
- Dim theFunctionData As Long
-
- Public Property Let theFunction(func As Long)
- theFunctionData = func
- MsgBox CallWindowProc(theFunctionData, 0, 0, 0, 0)
- End Property
Ответить
|
Номер ответа: 13 Автор ответа: Holsten
Вопросов: 5 Ответов: 100
|
Профиль | | #13
|
Добавлено: 31.10.08 03:18
|
CallWindowProc предполагает возвращаемое значение типа long а не variant как у тебя сейчас...
Function Formula(... ) as long
Ответить
|
Страница: 1 | 2 |
Поиск по форуму