powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов процедуры с произвольным именем в runtime
13 сообщений из 13, страница 1 из 1
Вызов процедуры с произвольным именем в runtime
    #32078068
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как сделать subj????

Поясняю: Нужно написать процедуру/функция, кот. будет иметь вид
procedure Call(ProcName: string);

где ProcName - имя процедуры, к примеру, 'TabSheet1Hide'...
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078087
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак... имхо.
Можно вызвать только метод/проперть класса через VMT напрямую или средствами преобразования указателей через обход поименнованных методов объекта.
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078090
dkstranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень просто.
Передай процедуру в качестве параметра.

Таким образом, например, реализована обработка событий
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078100
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> dkstranger
Т.е. ты хочешь сказать
Код: plaintext
1.
2.
3.
4.
5.
procedure Call(ProcName: string); 
begin
  @ProcName;
  //что равно @'Процедура1'
end;

Человеку ведь надо по стринговому имени а не по типизированному указателю...
dkstranger покажика, как транслируешь стринг в типизированный указатель процедуры?
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078102
dkstranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2KirillovA
А ты не можешь найти процедуру по имени?
У меня сейчас под рукой нет кода примера
(соответ модуль и процедуры типа TNotifyEvent
генерит run-time), но это - не проблема
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078122
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> dkstranger
По имени - никогда.
напиши две процедуры и обратись к одной из них в третьей процедуре - но не напрямую а через строковый параметр... да и еще чтоб при отсутствии такой процедуры в твоей маленькой проги - экшепн вылетал сообразный моменту. )))
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078128
SiDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример дерганья произвольной из длл-ки.
type
GetStringFunction=function(RequestString: PChar): PChar;

Тут может быть процедура, например:
PlugInProcedureStart=procedure(MyDevID, MyDevNo: integer);
или
PlugInProcedureStop=procedure;


var
pproc: pointer;
pproc:=GetProcAddress(PlugIn.Address, PChar(ProcName));
if(pproc<>nil)then
Process:=String(GetStringFunction(pproc)(PChar(RequestString)))
или в случае процедуры
PlugInProcedureStart(pproc)(MyDevID, MyDevNo);

else
Process:='';

где
PlugIn.Address:=LoadLibrary(PChar(DLLName));

Проще дергать по поинтеру на процедуру... Хотя дело вкуса...

Процедуры и фнкции должны быть объявлены с far
Если не из длл-ки, то еще проще, вместо хэндла длл-и используем HInstance (вместо PlugIn.Address)
Вот собссно и все что я хотел сказать :)
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078132
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, буду копать :)
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078135
dkstranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2KirillovA
Я думаю, надо внести уточнение...
По имени можно обращаться далеко не к любой процедуре
(имен процедур в exe нет).
Такого типа управление можно передавать только к экземплярам
классов, у ктр есть свойство name
Именно поэтому я использую в подобных случаях
типы TNotifyEvent и его наследники..
А насчет поиска по имени - просто не помню, но когда то
я делал нечто подобное
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078144
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> dkstranger
дык я и сказал что у классов только можно по произвольному имени выдернуть... посредством неявного/явного использования vmt.
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078167
dkstranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Kirillov
Согласен.
Предлагаю подвести итоги
1. Вызывать можно не любую процедуру, а только
соответствующий экземпляр компонента
2. Список компонентов можно получить по TForm.Components

В результате можно предложить такой путь
а) определить, какого рода процедуры будут нужны
и оформить их, например как TNotifyEvent
б) сделать обработчик, который бегает по TForm.Components
и, если найдет, передает туды управление
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078173
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> dkstranger
согласен.
...
Рейтинг: 0 / 0
Вызов процедуры с произвольным именем в runtime
    #32078283
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо :)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вызов процедуры с произвольным именем в runtime
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]