Форум: "Основная";
Текущий архив: 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.007 c