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

Вниз

Процедурный тип в TP7   Найти похожие ветки 

 
Влад   (2004-07-30 22:21) [0]

Доброго времени суток уважаемые коллеги.
Вопрос прост:

Как в TP7 объявить тип, который соответствует методу объекта.

Например, чтобы можно было сделать так:

Type

TNotifyEventTP = procedure(...);

TObj = Object
Public
 OnRead : TNotifyEventTP;
 Procedure DoRead(...);
End;

...
OnRead := DoRead;
...

Извините, что вопрос немного не соответстует тематике форума.


 
wicked ©   (2004-07-30 23:25) [1]

имхо стандартными средствами - никак, поскольку "методный" (closure) тип появился только в delphi...


 
Влад   (2004-07-31 01:03) [2]

Пока что обошел эту проблему с помощью передачи указателя на объект (@self), но получается не очень красиво. Объекты более низкого уровня обращаются к интересующим методам объектов врехнего уровня причем к приватным... Из-за этого не могу разнести их в разные модули.

> имхо стандартными средствами - никак
может есть какие-то нестандартные средства?


 
GuAV ©   (2004-07-31 02:52) [3]

вот так удалось получить адреса методов...

 TObj = object
   procedure P1;
   function P2: Integer;
   procedure P3(var Z: Byte);
 end;

procedure TObj.P1;
begin
end;

function TObj.P2: Integer;
begin
end;

procedure TObj.P3(var z: Byte);
begin
end;

type TObjProc=(P1,P2,P3);

procedure ProcArray; assembler;
asm
 CALL TObj.P1;
 CALL TObj.P2;
 CALL TObj.P3;
end;

type
PProcArray = ^TProcArray;
TProcArray = array[TObjProc] of
packed record
  CALL: Byte;
  Ptr: Pointer;
end;

const
ProcArrPtr: PProcArray = @ProcArray;

function AddrOf(Proc: TObjProc): Pointer;
begin
 AddrOf:=ProcArrPtr^[Proc].Ptr;
end;

Вызывать можно попробовать что-то типа CALL DWORD PTR ES:[DI], перед которым толкнуть в стек Self (это проверенно, работает). хранить в чём то типа

type
 TEvent = object
   Code, Data: Pointer;
 end;

, короче, имхо делается... но работы много


 
Глеб ©   (2004-07-31 05:26) [4]

В Turbo Pascal нет процедурного типа.


 
Влад   (2004-07-31 05:47) [5]

GuAV ©   (31.07.04 02:52) [3]

Очень оригинально ищутся адреса методов.
Идею понял, спасибо


 
GuAV ©   (2004-07-31 17:26) [6]


> Глеб ©   (31.07.04 05:26) [4]
> В Turbo Pascal нет процедурного типа.

Да что Вы говорите?

Procedural types

Standard Pascal treats procedures and functions strictly as program parts
that can be executed through procedure or function calls.

Borland Pascal has a much broader treatment of procedures and functions.
Through procedural types, it allows procedures and functions to be treated
as objects that can be assigned to variables and passed as parameters.

A procedural-type declaration specifies parameters and, for a function,
result type.

The syntax for a procedural-type declaration is identical to procedure or
function header, except that it omits the identifier after the procedure or
function keyword.

Examples:
type
  Proc = procedure;
  SwapProc = procedure(var X, Y: Integer);
  StrProc = procedure(S: string);
  MathFunc = function(X: Real): Real;
  DeviceFunc = function(var F: text): Integer;
  MaxFunc = function(A, B: Real; F: MathFunc): Real;

Parameter names in a procedural-type declaration to not affect the meaning
of the declaration.

Borland Pascal does not let you declare functions that return
procedural-type values.

A function result value must be a string, Real, Integer, Char, Boolean,
Pointer, or a user-defined enumeration.

See Also:
Procedural-type constants


 
Влад   (2004-08-04 17:14) [7]

Нашел более менее красивое решение проблемы, если кому в будущем понадобится вот код:

TObj = Object
Private
 FOwner    : Pointer;
 Procedure  Execute;
Public
 OnEvent        : Pointer;
 ...
 Constructor Create(Owner: Pointer);
End;

Constrcutor TObj.Create;
Begin
 FOwner := Owner;
End;

Procedure TObj.Execute;
Var Proc,Owner:Pointer;
Begin
 If (FOwner<>Nil) And (OnEvent<>Nil) Then
 Begin
   Proc := OnEvent;
   Owner := FOwner;
   Asm
     DB   66h
     Mov  Ax,Word Ptr [Owner]
     Db   66h
     Push Ax
     Call Proc
   End;
 End;
End;

Использовать очень просто в методах других объектов:
TSomething = Object
Private
 Obj : TObj;
 Procedure DoJob;
..
Public
 Procedure DoSomething;
..
End;

Procedure TSomething.DoSomething;
Begin
 ...
 Obj.Create(@Self);
 Obj.OnEvent := (@TSomething.DoJob);
 ...
End;



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

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

Наверх




Память: 0.49 MB
Время: 0.027 c
3-1090912704
Fynjy
2004-07-27 11:18
2004.08.22
Как удалить таблицу из базы?


14-1091601926
Layner
2004-08-04 10:45
2004.08.22
Есть JAVA приложение для телефона, можно ли его запустить


1-1091965649
Relaxxx
2004-08-08 15:47
2004.08.22
Выделение итемса TreeView по его значеню в Data


4-1088894848
Spy.RU
2004-07-04 02:47
2004.08.22
Доступ к строке инициализации модема


3-1090667869
Wolfram
2004-07-24 15:17
2004.08.22
Количество записей