Как передать уазатель функции!
Как сделать вот что пользователь сам где определяет фунуцию, а
я потом в своем компоненте должен её запустить, как мне передать указатель на функцию в компонент для исполнения...
Интресен сам механизм, буду рад любой реализации!!
[COLOR=silver]Правильно поставленный вопрос содержит в себе половину ответа[/COLOR]
всем привет!
Как сделать вот что пользователь сам где определяет фунуцию, а
я потом в своем компоненте должен её запустить, как мне передать указатель на функцию в компонент для исполнения...
Интресен сам механизм, буду рад любой реализации!!
см. например TList::Sort()
typedef int __fastcall (*TListSortCompare)(void * Item1, void * Item2);
void __fastcall Sort(TListSortCompare Compare);
всем привет!
Как сделать вот что пользователь сам где определяет фунуцию, а
я потом в своем компоненте должен её запустить, как мне передать указатель на функцию в компонент для исполнения...
Интресен сам механизм, буду рад любой реализации!!
Пользователь это кто? Пользователь приложением или программист, использующий твой класс?
А обязательно указатель? Куда проще и надежнее использовать в данном случае параметр шаблона, тогда это паттерн "Стратегия" получается.
Пользователь это кто? Пользователь приложением или программист, использующий твой класс?
А обязательно указатель? Куда проще и надежнее использовать в данном случае параметр шаблона, тогда это паттерн "Стратегия" получается.
Пользователь это программист, который пишет свою функцию(она может быть любой), которая к примеру выводит сообщение "Вася дурак", мне в своем компоненте необходимо сделать что:
1 как -то передать указатель в компонент(не для исполнения а для хранения)-> не знаю как определить cd-во которое бы хранило указатель на эту функцию
2 Потом как-то её запустить!!!
ТО есть принцип какой компонент работает себе работает и все время смотрит на cd-во в котором хранися указатель на функцию если NULL то нечего исполнять, если не NULL то нужно исполнить....
Мне бы, если честно рабочий примерчик увидеть (хотя бы маленький а то времени нет разбираться что и как, нуно срочно все сделать а то кирдык!!! )
P(
Пользователь это программист, который пишет свою функцию(она может быть любой), которая к примеру выводит сообщение "Вася дурак", мне в своем компоненте необходимо сделать что:
1 как -то передать указатель в компонент(не для исполнения а для хранения)-> не знаю как определить cd-во которое бы хранило указатель на эту функцию
2 Потом как-то её запустить!!!
ТО есть принцип какой компонент работает себе работает и все время смотрит на cd-во в котором хранися указатель на функцию если NULL то нечего исполнять, если не NULL то нужно исполнить....
Мне бы, если честно рабочий примерчик увидеть (хотя бы маленький а то времени нет разбираться что и как, нуно срочно все сделать а то кирдык!!! )
P(
Значится так. Пусть посторонний программист имеет у себя "интерфейсную" функцию, имеющую определённую сигнатуру, например:
void InvokeMyFunc()
Затем пусть он в этой "интерфейсной" функции вызывает свою хитрую функцию с произвольной сигнатурой.
Чтобы хранить пользовательскую функцию в течении одной сессии, нужно иметь всего лишь навсего указатель на "интерфейсную" функцию.
Сложнее, если пользовательскую функцию нужно хранить от одной сессии до другой. Тут не обойтись без вспомогательных средств записи/восстановления экземпляров пользовательских классов (если программы ООП) или пользовательских управляющих структур (в случае традиционного структурного программирования).
За пять минут никакого толкового примерчика набросать я не могу. За двадцать пять тоже не рискну :D. Так что, вот тебе ночь, ведро купеческого чая, и пиши/отлаживай на здоровье :D
А проще - не изобретай велосипед, а используй OLE
Да, действительно. А ещё лучше RPC. :)
Может не надо усложнять?
Пользователь это программист, который пишет свою функцию(она может быть любой), которая к примеру выводит сообщение "Вася дурак", мне в своем компоненте необходимо сделать что:
1 как -то передать указатель в компонент(не для исполнения а для хранения)-> не знаю как определить cd-во которое бы хранило указатель на эту функцию
2 Потом как-то её запустить!!!
ТО есть принцип какой компонент работает себе работает и все время смотрит на cd-во в котором хранися указатель на функцию если NULL то нечего исполнять, если не NULL то нужно исполнить....
Мне бы, если честно рабочий примерчик увидеть (хотя бы маленький а то времени нет разбираться что и как, нуно срочно все сделать а то кирдык!!! )
Несколько наводящих вопросов:
1. Для данного компонента будет вызываться только одна подобная функция или функция (указатель) может менятся?
2. И соотв-но, в какой момент времени устанавливается указатель? При инициализации экземпляра класса, в любое время?
3. Вызов по этому указателю происходит внутри данного класса или извне, а в данном классе он только хранится?
4. Вызываемая функция должна иметь какой-то типовой интерфейс или нет? Т.е. известно к примеру, что функция будет всегда иметь тип void() или может иметь и вид void(int), int(char*) и т.п.
Да, действительно. А ещё лучше RPC. :)
Может не надо усложнять?
Несколько наводящих вопросов:
1. Для данного компонента будет вызываться только одна подобная функция или функция (указатель) может менятся?
2. И соотв-но, в какой момент времени устанавливается указатель? При инициализации экземпляра класса, в любое время?
3. Вызов по этому указателю происходит внутри данного класса или извне, а в данном классе он только хранится?
4. Вызываемая функция должна иметь какой-то типовой интерфейс или нет? Т.е. известно к примеру, что функция будет всегда иметь тип void() или может иметь и вид void(int), int(char*) и т.п.
4 - любая сигнатура покрывается "интерфейсной" функцией, имеющей стандартный интерфейс.
3 - обобщим: реализации независима от источника вызова
2 - ещё раз обобщим: инициализация класса и создание функции асинхронны
1 - исходим их наиболее общих допущений - в любое время возможен вызов любой функции пользовательского уровня.
Что получаем? Получаем COM:
1 - OLE Automation
2 - DCOM
3 - Apartments
4 - IUnknown
4 - любая сигнатура покрывается "интерфейсной" функцией, имеющей стандартный интерфейс.
3 - обобщим: реализации независима от источника вызова
2 - ещё раз обобщим: инициализация класса и создание функции асинхронны
1 - исходим их наиболее общих допущений - в любое время возможен вызов любой функции пользовательского уровня.
Что получаем? Получаем COM:
1 - OLE Automation
2 - DCOM
3 - Apartments
4 - IUnknown
Ну давай обобщать дальше. Обобщим языковые аспекты, обобщим платформу и т.д. Еще немного и можно будет заявлять об использовании ИИ.
Я хотел бы получить ответ от автора топика.
Универсальное - враг хорошего.
В зависимости от требований, эту задачу можно решить либо шаблонами (а-ля аллокатор в STL контейнерах), либо хранением указателя. Думаю, COM - это из пушки по воробьям.
В зависимости от требований, эту задачу можно решить либо шаблонами (а-ля аллокатор в STL контейнерах), либо хранением указателя. Думаю, COM - это из пушки по воробьям.
Конечно, способ зависит от того, что хочет создать vladsoft. Скорее всего ему не понадобятся ни шаблоны, ни голые указатели. Сделает по аналогии с событиями в VCL - на __closure.
Конечно, способ зависит от того, что хочет создать vladsoft. Скорее всего ему не понадобятся ни шаблоны, ни голые указатели. Сделает по аналогии с событиями в VCL - на __closure.
Имеено так, тока мне пример нужен того, как это все замутить, а универсальность мне нафиг не нужна :{
Да, действительно. А ещё лучше RPC. :)
Может не надо усложнять?
Несколько наводящих вопросов:
1. Для данного компонента будет вызываться только одна подобная функция или функция (указатель) может менятся?
2. И соотв-но, в какой момент времени устанавливается указатель? При инициализации экземпляра класса, в любое время?
3. Вызов по этому указателю происходит внутри данного класса или извне, а в данном классе он только хранится?
4. Вызываемая функция должна иметь какой-то типовой интерфейс или нет? Т.е. известно к примеру, что функция будет всегда иметь тип void() или может иметь и вид void(int), int(char*) и т.п.
Ответы:
1 Указатель меняться не будет один на всю жизнь!
2 указатель устанавливается только послде создания класса
3 Вызов по этому указателю происходит внутри класса
4 да можно void vasya(void)
Ну давай обобщать дальше. Обобщим языковые аспекты, обобщим платформу и т.д. Еще немного и можно будет заявлять об использовании ИИ.
Я хотел бы получить ответ от автора топика.
Универсальное - враг хорошего.
В зависимости от требований, эту задачу можно решить либо шаблонами (а-ля аллокатор в STL контейнерах), либо хранением указателя. Думаю, COM - это из пушки по воробьям.
Через Ole и COM точно делать не буду! нужно простыми средствами!
1 Указатель меняться не будет один на всю жизнь!
2 указатель устанавливается только послде создания класса
3 Вызов по этому указателю происходит внутри класса
4 да можно void vasya(void)
Что-то наподобие:
YourClass: public YourBaseClass {
private:
pfunc ExternFunc;
public:
void SetExternFunc(pfunc);
void MegaProcessing();
};
YourClass::YourClass()
: YourBaseClass(),ExternFunc(NULL)
{
}
void YourClass::SetExternFunc(pfunc extfunc)
{
ExternFunc = extfunc;
}
void YourClass::MegaProcessing()
{
if(ExternFunc) ExternFunc();
}
:D
Что-то наподобие:
YourClass: public YourBaseClass {
private:
pfunc ExternFunc;
public:
void SetExternFunc(pfunc);
void MegaProcessing();
};
YourClass::YourClass()
: YourBaseClass(),ExternFunc(NULL)
{
}
void YourClass::SetExternFunc(pfunc extfunc)
{
ExternFunc = extfunc;
}
void YourClass::MegaProcessing()
{
if(ExternFunc) ExternFunc();
}
:D
спасибо сейчас времени нет чтоб проверить но когда приду домой то обезательно проверю....
fellow рулит! :)