Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизПроцедурный тип в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.033 c