Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.12.01;
Скачать: CL | DM;

Вниз

Как бы запустить функцию, название которой хранится в строке?   Найти похожие ветки 

 
karat_1 ©   (2011-10-13 10:20) [0]

Не могу сходу решить. Может существует какое решение?

Предположим в строке хранится название функции. Как бы ее запустить?

Знаете еще в VB Access есть функция Call <функция>


 
sniknik ©   (2011-10-13 10:23) [1]

> есть функция Call
в любом интерпретаторе есть что-то подобное (или я знаю только такие), в компилируемом коде такое невозможно... на зато можно "запустить интерпретар"...


 
karat_1 ©   (2011-10-13 10:26) [2]

ладно, я примерно так и понял.
круг вызываемых функций не настолько большой.
Напишу свой обработчик.


 
Rouse_ ©   (2011-10-13 10:30) [3]

Самое простое, прописать ее в таблице экспорта и дальше как обычно, GetProcAddress() и запуск...


 
karat_1 ©   (2011-10-13 10:50) [4]

тоже вариант.
получается свои функции в dll переписать?


 
Rouse_ ©   (2011-10-13 11:17) [5]

зачем? процедуры тоже замечательно экспортируются :)

А можно забить функции в стринглист, где в Object будет помещаться адрес функции...


 
karat_1 ©   (2011-10-13 11:24) [6]

понятненько. Пойду ка почитаю. Совсем отстал


 
QAZ   (2011-10-13 11:34) [7]


if s="SuperFunction" then SuperFunction;

:D


 
karat_1 ©   (2011-10-13 11:40) [8]

sniknik спасибо за полунаводку
Rouse_ спасибо за наводку

Сделал через длл. А то яндекс при запросе "экспорт функций" наводит все на длл.


 
Anatoly Podgoretsky ©   (2011-10-13 11:58) [9]

> karat_1  (13.10.2011 11:40:08)  [8]

Ну теперь жди проблем с ДЛЛ


 
OW ©   (2011-10-13 12:02) [10]

один пень, нужна таблица соответсвия
Имя - ЧтоВызывать
Хоть в таблице экспорта, GetProcAddress() и запуск.
Хоть стринглист, где в Object будет помещаться адрес функции.
Хоть if s="SuperFunction" then SuperFunction;

А если все объявить через overload и вызывать по размеру аргумента
т.е.
 procedure pr(A:Byte); overload;
 procedure pr(A:Word); overload;
 procedure pr(A:DWord); overload;
проседуру еще RunIt(A : array of byte)? которая массив будет загонять в соотв. переменную и вызывать pr(переменная_эта)
Думаю можно придумать как именно, теоретически вроде должно получится..

НО
это все хорошо,
а как быть с параметрами?
все равно получается, что надо знать параметры. И не только кол-во, но и типы.
Или хотя бы размеры.

поэтому "честный" вызов думается неизбежен для светлого будущего.


 
Rouse_ ©   (2011-10-13 12:07) [11]


> Сделал через длл.

Исполняемый файл тоже имеет таблицу экспорта и тоже как и длл может спокойно экспортировать функции/процедуры...


 
QAZ   (2011-10-13 12:18) [12]

а > QAZ   (13.10.11 11:34) [7] все равно круче ;)


 
karat_1 ©   (2011-10-13 12:22) [13]


> это все хорошо,
> а как быть с параметрами?

у меня все параметры в кол-во 1шт и все строковые. Мне повезло в этом плане.

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

делаю выгрузку данных в шаблон Word. Путем замены текста в шаблоне так называемых "меток", ну например $Name$, на значение поля в выгружаемой таблице.
чтобы адаптировать все это дело под кучу шаблонов и чтобы не дописывать код под новый, я придумал таблицу:
<код шаблона>,<поле в шаблоне>,<поле в таблице>
3, $Name$, FULL_NAME

все отлично работает, но вот незадача, есть всякие тонкости. Например Сумма прописью, Родительный падеж имени, Сокращенное ФИО и тд. Сервер Interbase конечно можно нагрузить различными ХП, что наверное не есть хорошо.
Поэтому пришлось доработать решение, такой вот задачей. В <поле таблице>, через маркер, ну например @, прописывать название функции, которой нужно обработать значение.
Такие вот пироги.


 
karat_1 ©   (2011-10-13 12:25) [14]


> Исполняемый файл тоже имеет таблицу экспорта и тоже как
> и длл может спокойно экспортировать функции/процедуры...
>

по идеии, я теперь эту DLL, могу и к IB прикрутить.
Интересно, сильно нагрузится или нет


 
karat_1 ©   (2011-10-13 12:26) [15]


> Ну теперь жди проблем с ДЛЛ

ну обложился всякими If-ами. Посмотрим


 
OW ©   (2011-10-13 12:41) [16]


> karat_1 ©


> ну например @, прописывать название функции, которой нужно
> обработать значение.


я б вынес в процедуру, как только @ встречается.
а в процедуре уже тупыми if анализировал.
зато любой поймет и поправит, если что. (и сам через пол-года поймешь тоже за 5 сек :) )


 
Сергей М. ©   (2011-10-13 15:24) [17]


> теперь эту DLL, могу и к IB прикрутить


В качестве IB UDF-либы что ли ?


 
Inovet ©   (2011-10-13 15:41) [18]

> [15] karat_1 ©   (13.10.11 12:26)
> > Ну теперь жди проблем с ДЛЛ
>
> ну обложился всякими If-ами. Посмотрим

А как они помогут?


 
han_malign   (2011-10-13 15:46) [19]


> Знаете еще в VB Access есть функция Call <функция>

- ну дык, в VBS(JS,CS) - "функция" это IDispatch(Ex) поддерживающий метод "call"...


 
oxffff ©   (2011-10-13 16:48) [20]

Есть несколько вариантов решения этой задачи.

Самый простой
http://docwiki.embarcadero.com/VCL/en/System.TObject.MethodAddress


 
Сергей М. ©   (2011-10-13 16:50) [21]


> Самый простой


А еще, пожалуй, проще - TObjectDispatch


 
b z   (2011-10-13 18:39) [22]

Еще проще, reflection, или нет?


 
Dimka Maslov ©   (2011-10-13 19:56) [23]


> oxffff ©   (13.10.11 16:48) [20]


Такое возможно только для публишед-методов. И про это было написано в справке. Сейчас почему-то уже не написано...


 
karat_1 ©   (2011-10-14 10:36) [24]

А что то вы тут междусобойчик устроили? =))
Ну хоть ссылкой поделились. Спасибо.


 
DiamondShark ©   (2011-10-21 15:27) [25]


> В <поле таблице>, через маркер, ну например @, прописывать
> название функции, которой нужно обработать значение.

А реализовать эту функцию на сервере не получается? В SQL нет проблем с вызовом функции по имени, вообще никаких.


 
DiamondShark ©   (2011-10-21 15:53) [26]


> Dimka Maslov ©   (13.10.11 19:56) [23]
> > oxffff ©   (13.10.11 16:48) [20]Такое возможно только
> для публишед-методов. И про это было написано в справке.
>  Сейчас почему-то уже не написано...

Видимо, потому что сейчас есть расширенная RTTI.



Страницы: 1 вся ветка

Текущий архив: 2013.12.01;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.006 c
2-1360865736
Вова
2013-02-14 22:15
2013.12.01
исходник функции Mouse_Event хочу


2-1361265627
kelpie1988
2013-02-19 13:20
2013.12.01
Как создать dll c вложенными функциями?


3-1294580093
adigozelov
2011-01-09 16:34
2013.12.01
Unicode v Ehlib


1-1318486819
karat_1
2011-10-13 10:20
2013.12.01
Как бы запустить функцию, название которой хранится в строке?


15-1371155402
Юрий
2013-06-14 00:30
2013.12.01
С днем рождения ! 14 июня 2013 пятница