Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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

Ответить

  Ответы Всего ответов: 25  

Номер ответа: 1
Автор ответа:
 Holsten



Вопросов: 5
Ответов: 100
 Профиль | | #1 Добавлено: 31.10.08 00:36
Если имеешь ввиду передать указатель на public-функцию, то можно через addressof и CallWindowProc.

Ответить

Номер ответа: 2
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #2
Добавлено: 31.10.08 00:54
Возможно, одним лишь CallWindowProc тут не обойтись. смотря сколько параметров надо передавать. Тут есть много вариантов. Можно перед расчетем вызывать ивент, передавать параметры в него через массив, в нем считать и возвращать значение. А можно и указатель передать, но геморно.

Ответить

Номер ответа: 3
Автор ответа:
 Holsten



Вопросов: 5
Ответов: 100
 Профиль | | #3 Добавлено: 31.10.08 01:07
Все параметры можно и в одну структуру запихнуть, или объявить синонимы CallWindowProc с разной сигнатурой.
Но в вопросе смущает
C.Formula = "A + B"
. Понимает ли автор сам, что хочет?

Ответить

Номер ответа: 4
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #4
Добавлено: 31.10.08 01:13
Holsten пишет:
или объявить синонимы CallWindowProc с разной сигнатурой.

Ты сам-то понял что сказал?) У CallWindowProc пять параметров. Хоть грызи зубами лед, хоть убейся о сосну. Больше или меньше их не станет. И ты не совсем понимаешь что такое "сигнатура" =)

Ответить

Номер ответа: 5
Автор ответа:
 Nytrogen



Вопросов: 18
Ответов: 186
 Профиль | | #5 Добавлено: 31.10.08 01:21
Похоже, AddressOf - это то, что нужно. Только что-то не догоняю, как юзать =(.
  1. C.Formula = AddressOf(FunctionName)

и вариации на тему не компилятся.

Понимает ли автор сам, что хочет?

- Понимаю. Пусть, A и B - переменные, которые по ходу программы меняются. При их изменении я буду вызывать C.Calculate. Отслеживание значений A и B - это уже моя проблема, которая как раз и реализована этим классом.

Ответить

Номер ответа: 6
Автор ответа:
 Holsten



Вопросов: 5
Ответов: 100
 Профиль | | #6 Добавлено: 31.10.08 01:25
Кто предлагает менять кол-во параметров? :)
  1. Private Declare Function CallWindowProc1 Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Integer, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  2. Private Declare Function CallWindowProc2 Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long


Ну и?

Ответить

Номер ответа: 7
Автор ответа:
 Holsten



Вопросов: 5
Ответов: 100
 Профиль | | #7 Добавлено: 31.10.08 01:28
  1.  
  2. Private Function adr(a As Long) As Long
  3. adr = a
  4. End Function
  5. '---
  6. C.Formula = adr(AddressOf FunctionName)
  7. '---
  8. CallWindowProc C.Formula , 0, 0, 0, 0
  9. '---

Ответить

Номер ответа: 8
Автор ответа:
 Nytrogen



Вопросов: 18
Ответов: 186
 Профиль | | #8 Добавлено: 31.10.08 02:17
  1. 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

Гым, гым. Программа выполняется отлично, а потом Excel вылетает. У меня Vista x64, что делать? :(

Ответить

Номер ответа: 9
Автор ответа:
 Holsten



Вопросов: 5
Ответов: 100
 Профиль | | #9 Добавлено: 31.10.08 02:21
В C.Formula записывается некоторое число

Это записывается адрес функции.
Вызов по адресу осуществляешь внутри класса: ret = CallWindowProc (m_adrformula,0,0,0,0)

Ответить

Номер ответа: 10
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #10
Добавлено: 31.10.08 02:29
Параметры еще надо как-топередать. Можно конечно глобальные переменные...

Ответить

Номер ответа: 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 параметра, вылетать стал сразу :)
  1. 'в обычном модуле:
  2. 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
  3.  
  4. Private Function adr(a As Long) As Long
  5.   adr = a
  6. End Function
  7.  
  8. Function Formula(ByVal d1 As Long, ByVal d2 As Long, ByVal d3 As Long, ByVal d4 As Long)
  9.   Formula = 2 + 3
  10. End Function
  11.  
  12. Sub TestSub()
  13.   Dim testVar As New Test
  14.   testVar.theFunction = adr(AddressOf Formula)
  15. End Sub
  16.  
  17. 'в модуле класса:
  18. Dim theFunctionData As Long
  19.  
  20. Public Property Let theFunction(func As Long)
  21.   theFunctionData = func
  22.   MsgBox CallWindowProc(theFunctionData, 0, 0, 0, 0)
  23. End Property

Ответить

Номер ответа: 13
Автор ответа:
 Holsten



Вопросов: 5
Ответов: 100
 Профиль | | #13 Добавлено: 31.10.08 03:18
CallWindowProc предполагает возвращаемое значение типа long а не variant как у тебя сейчас...
Function Formula(... ) as long

Ответить

Номер ответа: 14
Автор ответа:
 Nytrogen



Вопросов: 18
Ответов: 186
 Профиль | | #14 Добавлено: 31.10.08 03:24
Пардон, ступил :). Теперь всё работает, даже если не определять 4 аргумента. И Vista тут не при чём :).
Спасибо!

З.Ы. Не ожидал такой оперативной помощи в 3 часа ночи :D

Ответить

Номер ответа: 15
Автор ответа:
 Nytrogen



Вопросов: 18
Ответов: 186
 Профиль | | #15 Добавлено: 31.10.08 13:57
Вот ещё возник такой вопрос: получается, что невозможно вызвать функцию по её адресу, которая возвращает, например, String?
Может быть, предпочтительнее использовать некоторую глобальную переменную, в которую эта функция будет записывать "настоящее" значение, а возвращать просто 0?

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам