Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1360865736
Вова
2013-02-14 22:15
2013.12.01
исходник функции Mouse_Event хочу


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


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


15-1371187608
Очень злой
2013-06-14 09:26
2013.12.01
"расшарить" вебкамеру


4-1238947064
MultIfleX
2009-04-05 19:57
2013.12.01
Имена сеанса и клиента текущщей сессии пользователя





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский