Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.03.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
3-87878
ddenisv
2003-03-11 13:24
2003.03.27
DBGridEh - как делать следующее?


1-87889
Makking
2003-03-15 16:40
2003.03.27
Как сохранить изображение из TImage в монохромном формате?


1-87918
Kaginava
2003-03-17 08:16
2003.03.27
TRadioButton


1-88034
BofA
2003-03-14 15:35
2003.03.27
Как перебрать все компоненты, расположенные на TPanel?


1-87966
Dim!S
2003-03-18 05:25
2003.03.27
Есть у меню подменю





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский