Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1091564102
Alex_Bredin
2004-08-04 00:15
2004.08.22
Рыбалка


3-1091005053
Manfred
2004-07-28 12:57
2004.08.22
TClientDataSet.Locate ничего не находит


6-1087902372
w666w
2004-06-22 15:06
2004.08.22
Как написать простейший socks прокси...


4-1089629598
Alexiy
2004-07-12 14:53
2004.08.22
Корявая GetOpenFileName


1-1091703629
Spike
2004-08-05 15:00
2004.08.22
Открыть папку и выделить в ней нужный мне файл...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский