![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как бы запустить функцию, название которой хранится в строке?
karat_1 © (2011-10-13 10:20:00)Не могу сходу решить. Может существует какое решение?
Предположим в строке хранится название функции. Как бы ее запустить?
Знаете еще в VB Access есть функция Call <функция>
DiamondShark (2011-10-21 15:53:00) [1]
> Dimka Maslov © (13.10.11 19:56) [23]
> > oxffff © (13.10.11 16:48) [20]Такое возможно только
> для публишед-методов. И про это было написано в справке.
> Сейчас почему-то уже не написано...
Видимо, потому что сейчас есть расширенная RTTI.
DiamondShark (2011-10-21 15:27:00) [2]
> В <поле таблице>, через маркер, ну например @, прописывать
> название функции, которой нужно обработать значение.
А реализовать эту функцию на сервере не получается? В SQL нет проблем с вызовом функции по имени, вообще никаких.
karat_1 (2011-10-14 10:36:00) [3]А что то вы тут междусобойчик устроили? =))
Ну хоть ссылкой поделились. Спасибо.
Dimka Maslov (2011-10-13 19:56:00) [4]
> oxffff © (13.10.11 16:48) [20]
Такое возможно только для публишед-методов. И про это было написано в справке. Сейчас почему-то уже не написано...
b z (2011-10-13 18:39:00) [5]Еще проще, reflection, или нет?
Сергей М. (2011-10-13 16:50:00) [6]
> Самый простой
А еще, пожалуй, проще - TObjectDispatch
oxffff (2011-10-13 16:48:00) [7]Есть несколько вариантов решения этой задачи.
Самый простой
http://docwiki.embarcadero.com/VCL/en/System.TObject.MethodAddress
han_malign (2011-10-13 15:46:00) [8]
> Знаете еще в VB Access есть функция Call <функция>
- ну дык, в VBS(JS,CS) - "функция" это IDispatch(Ex) поддерживающий метод"call"...
Inovet (2011-10-13 15:41:00) [9]> [15] karat_1 © (13.10.11 12:26)
> > Ну теперь жди проблем с ДЛЛ
>
> ну обложился всякими If-ами. Посмотрим
А как они помогут?
Сергей М. (2011-10-13 15:24:00) [10]
> теперь эту DLL, могу и к IB прикрутить
В качестве IB UDF-либы что ли ?
OW (2011-10-13 12:41:00) [11]
> karat_1 ©
> ну например @, прописывать название функции, которой нужно
> обработать значение.
я б вынес в процедуру, как только @ встречается.
а в процедуре уже тупыми if анализировал.
зато любой поймет и поправит, если что. (и сам через пол-года поймешь тоже за 5 сек :) )
karat_1 (2011-10-13 12:26:00) [12]
> Ну теперь жди проблем с ДЛЛ
ну обложился всякими If-ами. Посмотрим
karat_1 (2011-10-13 12:25:00) [13]
> Исполняемый файл тоже имеет таблицу экспорта и тоже как
> и длл может спокойно экспортировать функции/процедуры...
>
по идеии, я теперь эту DLL, могу и к IB прикрутить.
Интересно, сильно нагрузится или нет
karat_1 (2011-10-13 12:22:00) [14]
> это все хорошо,
> а как быть с параметрами?
у меня все параметры в кол-во 1шт и все строковые. Мне повезло в этом плане.
А делаю я задачку. Хочу максимум глобализовать свое решение, чтобы потом код минимум подгонять и менять и шахматить настройками уже на стороне клиента.
делаю выгрузку данных в шаблон Word. Путем замены текста в шаблоне так называемых "меток", ну например $Name$, на значение поля в выгружаемой таблице.
чтобы адаптировать все это дело под кучу шаблонов и чтобы не дописывать код под новый, я придумал таблицу:
<код шаблона>,<поле в шаблоне>,<поле в таблице>
3, $Name$, FULL_NAME
все отлично работает, но вот незадача, есть всякие тонкости. Например Сумма прописью, Родительный падеж имени, Сокращенное ФИО и тд. Сервер Interbase конечно можно нагрузить различными ХП, что наверное не есть хорошо.
Поэтому пришлось доработать решение, такой вот задачей. В <поле таблице>, через маркер, ну например @, прописывать название функции, которой нужно обработать значение.
Такие вот пироги.
QAZ (2011-10-13 12:18:00) [15]а > QAZ (13.10.11 11:34) [7] все равно круче ;)
Rouse_ (2011-10-13 12:07:00) [16]
> Сделал через длл.
Исполняемый файл тоже имеет таблицу экспорта и тоже как и длл может спокойно экспортировать функции/процедуры...
OW (2011-10-13 12:02:00) [17]один пень, нужна таблица соответсвия
Имя - ЧтоВызывать
Хоть в таблице экспорта, 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(переменная_эта)
Думаю можно придумать как именно, теоретически вроде должно получится..
НО
это все хорошо,
а как быть с параметрами?
все равно получается, что надо знать параметры. И не только кол-во, но и типы.
Или хотя бы размеры.
поэтому "честный" вызов думается неизбежен для светлого будущего.
Anatoly Podgoretsky (2011-10-13 11:58:00) [18]> karat_1 (13.10.2011 11:40:08) [8]
Ну теперь жди проблем с ДЛЛ
karat_1 (2011-10-13 11:40:00) [19]sniknik спасибо за полунаводку
Rouse_ спасибо за наводку
Сделал через длл. А то яндекс при запросе "экспорт функций" наводит все на длл.
QAZ (2011-10-13 11:34:00) [20]
if s='SuperFunction' then SuperFunction;
:D