Форум: "Основная";
Текущий архив: 2013.12.01;
Скачать: [xml.tar.bz2];
ВнизКак бы запустить функцию, название которой хранится в строке? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.003 c