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

Вниз

Type Proc = procedure of object; ?   Найти похожие ветки 

 
Mif   (2003-03-11 23:53) [0]

Никогда не встречал такой конструкции

Type Proc = procedure of object

что означает это of object ?

И вообще, тип процедура ?


 
jack128 ©   (2003-03-12 00:09) [1]

of object означает что это метод, а не процедура

type
TTestClass = class
procedure MethodProc;
end;

procedure TTestClass.MethodProc;
begin

end;

procedure MyProc;
begin

end;

Type TMethodProc = procedure of object;

var i : TMethodProc;
t : TTestClass;

procedure TForm1.Button1Click(Sender: TObject);
begin
i := t.MethodProc;
i := MyProc; //Ошибка!!!!
end;


 
Palladin ©   (2003-03-12 00:13) [2]


> Mif (11.03.03 23:53)

я встречал... в хелпе...


 
Юрий Зотов ©   (2003-03-12 00:32) [3]

> И вообще, тип процедура?
Не "тип процедура", а процедурный тип. Вполне обычная вещь. А почему бы и нет, собственно? В Паскале еще и не такие типы накрутить можно - это одна из его сильных сторон.


> Никогда не встречал такой конструкции
Значит, пока еще мало книг по Паскалю и Delphi прочитали.


 
kaif ©   (2003-03-12 00:36) [4]

Все обработчики событий (как было правильно уже сказано, методы) имеют такой тип.
Например, знаменитый TNotifyEvent - тип события TButton.OnClick

type
TNotifyEvent = procedure(Sender: TOBject) of object;

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

Например,
type TVasiaEvent = procedure(Vasia_ID: integer; var Pupkin: string);

на событие такого типа вплне можно назначить любую процедуру:

procedure TForm1.AAA(Vasia_ID: integer; var Pupkin: string);

А можно еще круче:

var
MMM: TVasiaEvent;
s: string;
begin
MMM := AAA;
s := "Пупкин Великий и Ужасный";
MMM(12, s); //и это сработает!
end;


 
Думкин ©   (2003-03-12 06:33) [5]

Ну да, а как еще динамически DLL цеплять?


 
y-soft ©   (2003-03-12 07:40) [6]

>Думкин © (12.03.03 06:33)
Если Вы о методах, то из Dll их обычно не экспортируют - возможны проблемы совместимости. Экспортируют, как правило, линейные функции


 
KA_   (2003-03-12 11:32) [7]

2 y-soft:
А какже интерфейсы?


 
y-soft ©   (2003-03-12 11:37) [8]

>KA_ (12.03.03 11:32)
Это уже из другой области


 
Serginio   (2003-03-12 12:42) [9]

Type Proc = procedure of object отличается от
Type Proc = procedure тем что не объектная прцедура содержит ссыку на процедуру а объектная на запись
TMethod= Record
data:Pointer; // ссылка на экземпляр класса (например SElf)
Code:Pointer; // ссылка на метод
end;
так "procedure of object" является методом класса (объекта).


 
Mif   (2003-03-12 17:09) [10]

то есть, процедурный тип - это указатель на метод класса ?

Или экземпляра класса ?


 
Serginio   (2003-03-12 17:20) [11]

Type TProc = procedure of object;

TmyClass= Class(Object)
Procedure Hy;
end;
var MyClass:TmyClass;
MyProc:TProc;
Begin
MyClass:=TmyClass.Create;
MyProc:=MyClass.Hi;
//--------------------------------
Надеюсь понятно


 
Юрий Зотов ©   (2003-03-12 19:50) [12]

> Mif (12.03.03 17:09)
> то есть, процедурный тип - это указатель на метод класса ?

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

Если в описании есть "of object" - значит, данный процедурный тип задает метод класса. Если нет - то обычную процедуру (функцию). Отличаются он тем, что метод класса неявно получает еще один параметр - ссылку на экземпляр класса (или на сам класс, если это классовый метод).

А вот ПЕРЕМЕННАЯ данного процедурного типа - это уже указатель. Он содержит АДРЕС какой-то процедуры (функции, метода). Причем эта процедура (функция, метод) должны точно соответствовать описанию, которое задает данный процедурный тип.

Вот простые аналоги:

type
PInt = ^Integer; // Тип указателя на целое
TFunc = // Процедурный тип
function(A: integer; var B: string): double; stdcall;
TObjFunc = // Другой процедурный тип
function(A: integer; var B: string): double of object; stdcall;

var
P: PInt; // Адрес целого
F: TFunc; // Адрес функции типа TFunc;
O: TObjFunc; // Адрес метода типа TObjFunc

Обратите внимание - типы TFunc и TObjFunc несовместимы - из-за описателя "оf object" у них разное количество параметров.


 
Tux ©   (2003-03-12 22:46) [13]

Гы :-) kaif не в "Потрепаться" :-) !
Нонсенс :-)


 
Mif   (2003-03-13 19:25) [14]

1) Ага. Если я правильно понял:

type

TMyClass = class
value:integer;
procedure SetValue;
end;

TFunc: procedure of object;
...

var Func:TFunc;
MyClass:TMyClass;
...
procedure TMyClass.SetValuse;
begin
value:=5;
end;

...

MyClass:=TMyClass.Create;
Func:=MyClass.SetValue


В результате, если я вызову

func;

То в экземпляре MyClass класса TMyClass свойство value станет равным 5 ?

2) А зачем такой тип был введен ? Чем он облегкчает жизнь ?


 
Романов Р.В. ©   (2003-03-13 19:36) [15]


> А зачем такой тип был введен ? Чем он облегкчает жизнь ?

В основном для работы с Events



 
Serginio   (2003-03-13 19:55) [16]

Иногда нужно просто передать передать ссылку на процедуру в другую процедуру. Также при передаче ссылки из DLL, а так же по аналогии с виртуальными методами если не нужно вызывать метод предка легче использовать ссылку на метод и переопределять в конструкторе как это делается в эвентах


 
Mif   (2003-03-13 20:52) [17]

>Иногда нужно просто передать передать ссылку на процедуру в
>другую процедуру

ну так и передавай Proc2(@proc1)


 
Serginio   (2003-03-13 21:01) [18]

не совсем так ты должен передать структуру
TMethod= Record
data:Pointer; // ссылка на экземпляр класса (например SElf)
Code:Pointer; // ссылка на метод
end;
так как эта процедура конкретно привязана к уже созданному экземпляру класса. А в твоем случае передастся только Code.



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

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

Наверх




Память: 0.51 MB
Время: 0.019 c
14-88225
Supreme 2
2003-03-11 18:32
2003.03.27
Народ, я вернулся!!!


4-88298
LeReve
2003-01-30 18:09
2003.03.27
Как привельно использовать GetDIBits???


1-88071
Almidagu
2003-03-15 01:18
2003.03.27
Прошу помоши! StrToFloat в Delphi 3?


1-87931
Сергей
2003-03-13 19:04
2003.03.27
Подскажите, когда возникает ошибка Out Of Memory?


1-87964
KDenis
2003-03-12 20:12
2003.03.27
Как изменить цвет компонента TMainMenu?