Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Преобразование типа pointer в указатель метода. [D7, WinXP]


Страницы:   1 2

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')
-выдаст ошибку приведения типов !!!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо