Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: CL | DM;

Вниз

Вызов метода класса (с параметрами) через типизированный казатель   Найти похожие ветки 

 
Cyrax ©   (2006-09-26 19:05) [0]

Как ето самое в Delphi ?


 
alex_*** ©   (2006-09-26 19:06) [1]

MyObject(p).method(p1, p2);


 
alex_*** ©   (2006-09-26 19:07) [2]

obj: TObject

Тоже типизированный казатель, кстати


 
TStas ©   (2006-09-26 19:11) [3]

Дык указатель на объект не совсем ведь нормальный указатель. Его ведь нельзя разыменовать, к примеру.


 
Cyrax ©   (2006-09-26 19:12) [4]

p - должен быть типа казатель на такую-то ункцию с такими-то параматами...функцию


 
TStas ©   (2006-09-26 19:13) [5]

Дык тогда это не указатель вовсе, в процедурный тип.


 
clickmaker ©   (2006-09-26 19:15) [6]


> [4] Cyrax ©   (26.09.06 19:12)

казатель на функцию объявляется так:

type TMyFunction = function(p1: integer; p2: string): integer;

var p: TMyFunction;


 
Cyrax ©   (2006-09-26 19:16) [7]

clickmaker ©   (26.09.06 19:15) [6]

Это и недо так...


 
Cyrax ©   (2006-09-26 19:16) [8]

тьфу, надо...


 
Cyrax ©   (2006-09-26 19:18) [9]

Нужно объявить указатель на метод класса, затем через конкретный экземпляр этого класса вызвать по этому указателю функцию...


 
Eraser ©   (2006-09-26 19:23) [10]

> [9] Cyrax ©   (26.09.06 19:18)

type
 TMyFunction = function(p1: integer; p2: string): integer of object;


 
default ©   (2006-09-26 19:43) [11]

надо думать ту самую задачу решаешь?:):):)


 
Cyrax ©   (2006-09-26 19:57) [12]

Вася! Привет.
Как ты догадался...


 
alex_*** ©   (2006-09-26 20:02) [13]

а у default"a прописано имя Александр, однако


 
Cyrax ©   (2006-09-26 20:07) [14]

Так это не имя !


 
default ©   (2006-09-26 20:25) [15]

alex_*** ©   (26.09.06 20:02) [13]
правильно прописано


 
Cyrax ©   (2006-09-26 20:33) [16]

default, чудо разрабатывается на C++. Потом при желании можно будет сконвертить и на Object Pascal, и на C#...


 
Сергей М. ©   (2006-09-26 21:01) [17]


> Cyrax


type
 TMyMethod = procedure(..) of object;

...

var
 MyMethod: TMyMethod; // вот тебе тот самый типизированный указатель

..

MyMethod(..); //а вот тебе вызов метода класса через тот самый типизированный указатель

?


 
palva ©   (2006-09-26 22:50) [18]

> MyMethod: TMyMethod; // вот тебе тот самый типизированный указатель
Какой же это указатель? Указатель это когда
MyMethod: ^TMyMethod;


 
Cyrax ©   (2006-09-26 23:02) [19]

Говорю с колокольни C++:
переменная функционального типа есть указатель на функцию/метод...

Да и вообще, отсутствие крыши не говорит о значимых типах...


 
Суслик ©   (2006-09-26 23:22) [20]

пишу тут, но идея верна - иногда так сам делаю.

var
  m: tmethod;
  o: tmyclass;
begin
  m.code := @tmyclass.method;
  ...
  o := tmyclass.cretae();
  m.data := o;
  m();
end;


 
Суслик ©   (2006-09-26 23:24) [21]

не, вроде еще m перед вызовом надо приведением типов к method pointer преобразовать

type
  tm = procedure(); of object;
begin
  ...
  tm(m)();
end;


 
Суслик ©   (2006-09-26 23:30) [22]

Меня тут совесть замучала - кидать непроверенные примеры.
Вот рабочий пример. Я правда вопроса не очень понял, т.к. кроме исходного топика не читал, но может будет полезным.

program Project1;
uses
 SysUtils, Windows;
type
  TMyMethod = procedure (a: integer) of object;

  TMyClass = class
     procedure M(a: integer);
  end;
procedure TMyClass.M(a: integer);
begin
  MessageBox(0, PChar(IntToStr(a)), "Hi", 0);
end;
var
  m: TMethod;
  c: TMyClass;
begin
  m.Code := @TMyClass.M;
  c := TMyClass.Create();
  m.Data := c;
  TMyMethod(m)(1);
end.


 
palva ©   (2006-09-26 23:55) [23]

Вот работающий код:

{$APPTYPE CONSOLE}
type
TC = class
 fint: Integer;
 function f(n: Integer): Integer;
end;
fun = function (n: Integer): Integer of object;
sfun = function (o: TC; n: Integer): Integer;

function TC.f(n: Integer): Integer;
begin
 Result := n + fint;
end;

var
 c1, c2: TC;
 p: ^fun;
begin
 c1 := TC.Create;
 c1.fint := 5;
 c2 := TC.Create;
 c2.fint := 1;
 p := @TC.f;
 WriteLn(sfun(p)(c1, 4)); // 9
 WriteLn(sfun(p)(c2, 4)); // 5
 c1.Free;
end.


 
Суслик ©   (2006-09-27 00:10) [24]

Если пошла мода на работающий код, то посмотрите и на такой :)

uses
  SysUtils,Windows;
type
  TMyMethod = procedure(a: integer) of object;
  TMyClass = class
     class procedure M(a: integer);
  end;
class procedure TMyClass.M(a: integer);
begin
  MessageBox(0, PChar(IntToStr(a)), "Hi", 0);
end;
var
  m: TMyMethod;
begin
  m := TMyClass.M;
  m(1);
end.


 
palva ©   (2006-09-27 00:23) [25]

Я понял задачу так, чтобы функция использовала поля из разных объектов, поэтому искал способы как при вызове функции через указатель кроме собственных параметров передать туда еще и объект, содержащий поля.



Страницы: 1 вся ветка

Текущий архив: 2006.10.15;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.085 c
15-1158810548
Pazitron_Brain
2006-09-21 07:49
2006.10.15
Стало надо виртуальную машину...


2-1159267336
syte_ser78
2006-09-26 14:42
2006.10.15
ожидание documentcomplete


2-1159245101
Dima K
2006-09-26 08:31
2006.10.15
CheckBox в ячейке DBGrid


15-1158863556
McSimm
2006-09-21 22:32
2006.10.15
17-ая ежегодная выставка информационных технологий Softool 2006


15-1158741443
Max Zyuzin
2006-09-20 12:37
2006.10.15
Формирование отчетов. Выбор средства формирования