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

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

Процедурный тип в TP7


Влад ©   (2004-07-30 22:21:00) 

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

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

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

Type

TNotifyEventTP = procedure(...);

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

...
OnRead := DoRead;
...

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


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

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

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;


GuAV   (2004-07-31 17:26:00) [2]


> Глеб ©   (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-07-31 05:47:00) [3]

GuAV ©   (31.07.04 02:52) [3]

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


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

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


GuAV   (2004-07-31 02:52:00) [5]

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

 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 01:03:00) [6]

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

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


wicked   (2004-07-30 23:25:00) [7]

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


Наверх

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