![]() |
| ||
|
|
Новости |
Поиск |
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 ???
Eraser (2005-10-07 22:14:00) [1]
> Kostafey © (07.10.05 22:09) [26]
Лучше делай через TMethod, как begin...end советовал - это более правильно.
Kostafey (2005-10-07 22:09:00) [2]
> Zeqfreed © (07.10.05 22:02) [24]
> tmp := Form1.MethodAddress('Foo');
Спасибо, вопрос решен, но у меня упорно не работает тогда
Varints[i]:=TFunctions.MethodAddress(FunctName);
А так работает:
@Varints[i]:=TFunctions.MethodAddress(FunctName);
begin...end (2005-10-07 22:02:00) [3]Если фигурирующий тут метод обращается к полям объекта либо вызывает динамические или виртуальные методы, то нужно ещё связать его с объектом, иначе будет ошибка на этапе исполнения.
Более правильно делать так:
type
TFunc = function(x: Real): Real of object;
var
fn: TFunc;
begin
TMethod(fn).Code := MethodAddress('...');
TMethod(fn).Data := идентификатор_соответствующего_экземпляра_класса;
fn(...);
end
Содержимое поля Data внутри метода будет рассматриваться как Self.
Zeqfreed (2005-10-07 22:02:00) [4]Zeqfreed © (07.10.05 22:00) [23]
Ой, извиняюсь, работает, конечно, но там я убрал of object, хотя вроде потом обратно возвращал.. эх.. ну хорошо, что ты уже нашёл решение :)
Zeqfreed (2005-10-07 22:00:00) [5][6] работает, проверял.
Вот 'полный' код:
...
type
TFunc = function (x : Real) : Real;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
published
function Foo(x : Real) : Real;
end;
...
function TForm1.Foo(x : Real) : Real;
begin
ShowMessage('It works');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
tmp : TFunc;
begin
tmp := Form1.MethodAddress('Foo');
TFunc(tmp)(0);
end;
Компилятор D7, хотя врядли это имеет значение в данном случае.
Kostafey (2005-10-07 21:58:00) [6]...замяли ладно ?
ВОПРОС ПОХОЖЕ РЕШЕН !
СПАСИБО !!!
Eraser (2005-10-07 21:57:00) [7]
> Kostafey © (07.10.05 21:56) [20]
Бывает )
Kostafey (2005-10-07 21:56:00) [8]
> Eraser © (07.10.05 21:50) [16]
Уй, прошу прощения !
@FFF:=TFunctions.MethodAddress(FunctName); - РАБОТАЕТ!
TFunc(...) Забыл убрать - жутко сорри !
Eraser (2005-10-07 21:55:00) [9]
> Kostafey © (07.10.05 21:52) [18]
И где в [9] ты видишт вот эту галиматью@FFF:= TFunc(TFunctions.MethodAddress(FunctName) );? )
Kostafey (2005-10-07 21:52:00) [10]
> Eraser © (07.10.05 21:50) [16]
>
>
> > Kostafey © (07.10.05 21:49) [15]
>
> Пробовал - работает!
>
> Что есть fn у тебя ?
> И что есть testit ?
ТЫ ЧТО ИЗДЕВАЕЩЬСЯ ???
var i:byte;
FunctName:shortstring;
FFF:TFunc;
begin
for i:=1 to VariantNumbers do
begin
FunctName:='f_var'+inttostr(i);
@FFF:=TFunc(TFunctions.MethodAddress(FunctName));
end;
.....
@FFF:=TFunc(TFunctions.MethodAddress(FunctName)); - не работает !
Piter (2005-10-07 21:50:00) [11]Ой, все, я спать... Блин, это ведь простейшая задача...
Это ведь фактически тоже самое что в DLL GetProcAddress использовать...
Тьфу, я спать блин...
Eraser в [15] все верно написал...
Eraser (2005-10-07 21:50:00) [12]
> Kostafey © (07.10.05 21:49) [15]
Пробовал - работает!
Что есть fn у тебя ?
И что есть testit ?
Kostafey (2005-10-07 21:49:00) [13]
> Eraser ©
> > @fn := MethodAddress('testit');
Не, пробовал - invalid typecast !!!
Eraser (2005-10-07 21:47:00) [14]
> Kostafey © (07.10.05 21:46) [11]
А почему оно должно не работать?
Eraser (2005-10-07 21:46:00) [15]
> Eraser © (07.10.05 21:43) [9]
Здесь testit- published method текущего класса (формы).
begin...end (2005-10-07 21:46:00) [16]> Piter © (07.10.05 21:37) [2]
> ты вообще о чем?
Видимо, о том, что, как минимум, метод должен быть published.
> Piter © (07.10.05 21:43) [7]
> должно работать...
Почему должно?
Kostafey (2005-10-07 21:46:00) [17]
> Eraser © (07.10.05 21:43) [9]
>
>
> > Kostafey © (07.10.05 21:39) [4]
>
> Ферштейн!
> Тады,
>
> TFunc = function (x:real):real of object;
> ...
> var
> fn: TFunc;
> begin
> @fn := MethodAddress('testit');
> fn(..); // можно вызывать метод
А ты сам-то пробовал, такое может работать???
Ладно я сейчас !!!
Kostafey (2005-10-07 21:45:00) [18]
> Piter ©
> должно работать... ан не работает...
Да, верно.
Может какя функция пробразования типов есть ?
Eraser (2005-10-07 21:43:00) [19]
> Kostafey © (07.10.05 21:39) [4]
Ферштейн!
Тады,
TFunc = function (x:real):real of object;
...
var
fn: TFunc;
begin
@fn := MethodAddress('testit');
fn(..); // можно вызывать метод
Kostafey (2005-10-07 21:43:00) [20]
> var
> tmp : TFunc;
> begin
> tmp := Form1.MethodAddress('Foo');
> TFunc(tmp)(0);
А вот tmp := Form1.MethodAddress('Foo')
-выдаст ошибку приведения типов !!!