|
|
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
Может ли название функции быть аргументом процедуры и вызываться из этой процедуры. Например: Sub qqq (name_function as string) x = name_function End Sub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 11:41 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
profts, может, если эта функция является public членом класса. См. функцию CallByName(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 11:50 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
Можно, а зачем? Сам же и запутаешься. Все равно функция тебе что то вернет, то и передашь в процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 11:59 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
Дело в том, что процедура имеет еще несколько аргументов и в общей сложности запускается 30 раз, так вот в зависимости от параметров должна вызываться определенная функция (всего их 5). Поэтому название функции тоже решил сделать аргументом. Только в приведенном выше примере функция не вызывается, а переменной x присваивается название функции как строка. Вот с этим и проблема. Не могу понять как синтаксически оформить данную строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 12:13 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
Синтаксически — никак. Можешь сделать класс с этими функциями в качестве членов, создать из этого класса объект и юзать функцию CallByName применительно к этому объекту. Только учти, что она тормозная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 12:38 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
Спасибо. Придется наверно поискать другой способ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 12:47 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
profts, другой способ - это правильно. Кстати, один - ниже. AntonariyСинтаксически — никак.Ну уж, ну уж :) Ссылка на экземпляр объекта вполне заменяет указатель на функцию. Синтаксически можно оформить достаточно красиво: Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 13:20 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
Прикольно, но по сути Код: plaintext 1. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 14:57 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
авторСинтаксически можно оформить достаточно красиво: И, кстати, это — не синтаксически. Это — архитектурно. Лесенка Case'ов и CallByName — тоже архитектурно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 15:06 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
Antonariyничем не отличается от Select caseОтличие есть: динамический подход против статического. Набор функций можно создать, изменить, удалить в процессе выполнения программы; этот набор сам по себе может являться параметром какой-нибудь процедуры, если понадобится такой функционал. "Фишка" здесь всё-таки в другом. Мы идём на поводу у формулировки задачи "Может ли название функции быть аргументом процедуры и вызываться из этой процедуры". Уж больно формулировка антропоцентрическая - человеку легче всего представить, что функция идентифицируется именем, ну и, следовательно, в процедуру надо передавать строковый параметр. Но почему бы функцию не идентифицировать ссылкой на экземпляр класса, членом которого она является? Тогда отпадёт необходимость переводить так или иначе в процессе выполнения программы (через ассоциативный массив (коллекцию), Select Case, или CallByName(), которая дёргает метод IDsipatch::Invoke(), который внутри себя опять-таки содержит то же самое) строку в адрес функции. В итоге: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 17:09 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
"cxxcxc" читать как "Бенедикт" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 17:10 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
БенедиктОтличие есть: динамический подход против статического. Код: plaintext 1. БенедиктНо почему бы функцию не идентифицировать ссылкой на экземпляр класса, членом которого она является?Это мне напомнило еще один вариант, не идущий на поводу.)) Сама функция (указатель) может быть аргументом. AddressOf + CallWindowProc = гораздо шустрее замутов с интерфейсами. И динамику можно прикрутить на таком же уровне. БенедиктСинтаксически? ;)Хмм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2008, 19:42 |
|
||
|
Функция - как аргумент процедуры
|
|||
|---|---|---|---|
|
#18+
AntonariyВот только обидно, что создавать классы динамически COM пока не умеет. ;) Это мне напомнило еще один вариант, не идущий на поводу.)) Сама функция (указатель) может быть аргументом. AddressOf + CallWindowProc = гораздо шустрее замутов с интерфейсами. И динамику можно прикрутить на таком же уровне.Я не понял фразу про классы (хотя поворачивал и рассматривал её и так, и эдак). Одним из VB-шных способов для вызова функции по адресу как раз и является динамическое создание экземпляра COM-объекта с единственным методом (помимо IDispatch-евых) через CreateStdDispatch(), затем вызов этого метода. Адрес функции - фи, низкий полёт :), уровень ассемблера, Си и PowerBasic. Передача ссылки на интерфейс - о да, это уже C++, Java, VB и т. п. :) Чтобы вызов CallWindowProc (со всеми минусами этого решения) был гораздо быстрей вызова метода при раннем связывании - это спорно. Можно проверить, но завтра начинается отпуск, и для небольшого количества вызовов это не важно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2008, 18:29 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=35451228&tid=2162015]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 350ms |

| 0 / 0 |
