![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразование типа pointer в указатель метода. [D7, WinXP]
Kostafey © (2005-10-07 21:04:00)Прошу помощи у мастеров:
TFunctions.MethodAddress(FunctName);
- возвращает pointer на метод с именем FunctName, где FunctName:shortstring а как этот pointer преобразовать к указателю на метод следующего вида:
TFunc = function (x:real):real of object;
(кстати метод с именем FunctName имеет ту же структуру)
Если писать просто
TFunc(TFunctions.MethodAddress(FunctName));
- то получиться ошибка приведения типов,
TFunc(TFunctions.MethodAddress(FunctName)^);
- тогда компиляция проходит успешно, но при запуске приложение аварийно завершается с ошибкой доступа к памяти (кто б сомневался)
Так как из pointer сделать function (x:real):real of object ???
Piter (2005-10-07 21:43:00) [21]Да, при всей свой легкости я не знаю как решить задачку :(
Правда, при этом я и не совсем понимаю смысл от использования MethodAddress, но с точки зрения конвертации типов интересно...
По идее:
Kostafey © (07.10.05 21:04)
TFunc(TFunctions.MethodAddress(FunctName));
должно работать... ан не работает...
Zeqfreed (2005-10-07 21:41:00) [22]Kostafey © (07.10.05 21:04)
А зачем ты используешь модификатор of object? Без него все прекрасно работает. Ну или если он необходим, то:
var
tmp : TFunc;
begin
tmp := Form1.MethodAddress('Foo');
TFunc(tmp)(0);
Kostafey (2005-10-07 21:40:00) [23]
> Piter © (07.10.05 21:37) [2]
>
> Хм... интересный вопрос... я ответа не знаю...
>
> Eraser © (07.10.05 21:25) [1]
>
> ты вообще о чем?
Говорит-то но все правильно, но проблемы-то это не решает :(((
Kostafey (2005-10-07 21:39:00) [24]
> Метод и функция/процедура - две большие разницы!
Да, я уже отказался от функций, теперь работают только методы классов !
Kostafey (2005-10-07 21:38:00) [25]Спасибо, конечно, за ответ.
> Читать справку.
Да вроде все смотрел.
> class function MethodAddress(const Name: ShortString): Pointer;
о нем и речь
> If Name does not specify a published method for the object,
> MethodAddress returns nil (Delphi) or NULL (C++).
Да, я объявил эти методы в разделе published класса.
А как преобразовать типы-то ?
Piter (2005-10-07 21:37:00) [26]Хм... интересный вопрос... я ответа не знаю...
Eraser © (07.10.05 21:25) [1]
ты вообще о чем?
Eraser (2005-10-07 21:25:00) [27]
> Kostafey © (07.10.05 21:04)
Читать справку.
Особенно:
Returns the address of a published method.
Delphi syntax:
class function MethodAddress(const Name: ShortString): Pointer;
C++ syntax:
static void * __fastcall MethodAddress(TClass cls, const ShortString &Name);
void * __fastcall MethodAddress(const ShortString &Name) { return MethodAddress(ClassType(), Name); }
Description
MethodAddress is used internally by the streaming system. When an event property is read from a stream, MethodAddress converts a method name, specified by Name, to a pointer containing the method address. There should be no need to call MethodAddress directly.
If Name does not specify a published method for the object, MethodAddress returns nil (Delphi) or NULL (C++).
Метод и функция/процедура - две большие разницы!