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

Вниз

Объясните на пальцах   Найти похожие ветки 

 
Сатир ©   (2002-11-14 13:22) [0]

TColorGetter = function(ColorName: String;BaseMap: Boolean =False): TColor of object;
что значит это объявление и как оно работает?


 
Skier ©   (2002-11-14 13:26) [1]

>Сатир
Энто объявление типа - объектная функция, используется
при написании событий...


 
Alx2 ©   (2002-11-14 13:34) [2]

>Сатир © (14.11.02 13:22)
Значит, что TColorGetter должен быть методом объекта.
Соль заключается в том, что этот тип есть склейка адреса точки входа в этот код и адреса VMT (нужно для восстановления конекста объекта, чей метод вызывается). Соттветствено, занимает 8 байт.


 
Skier ©   (2002-11-14 13:39) [3]

>Сатир
Alx2 © (14.11.02 13:34) +
см.
TMethod = record
Code, Data: Pointer;
end;

в SysUtils.pas


 
icWasya ©   (2002-11-14 14:16) [4]

а кусок текста
BaseMap: Boolean =False
означает,
что вызывать этот метод можно с двумя параметрами - String и Boolean
или с одним параметром String, тогда вместо второго будет подставлено False


 
han_malign ©   (2002-11-14 14:32) [5]

Просили же на пальцах

type
TColorListener = class
.................
property onGetColor:TColorGetter;
....................
type
TMyClass = class
protected
ColorListener: TColorListener;
.................
function ColorGetter(ColorName: String;BaseMap: Boolean =False): TColor;
....................
procedure TColorListener.DoGetColor(ColorName: String;BaseMap: Boolean =False): TColor;
begin
if(Assigned(onGetColor))then Result:=onGetColor(ColorName,BaseMap)
else raise Exception.Create;
end;
procedure TColorListener.GetDefaultColor: TColor;
begin
if(Assigned(onGetColor))then Result:=onGetColor("Default")
else Result:=clBlack;
end;
....................
constructor TMyClass.Create;
begin
ColorListener:=TColorListener.Create;
ColorListener.onGetColor:=ColorGetter;//или @ColorGetter, как компилятор скажет
........................................



 
Сатир ©   (2002-11-14 15:15) [6]

2han_malign © (14.11.02 14:32)
дело в том, что этот тип не используется для объявления событий.
есть только такая ф-ция

function ComputeColor(getter:TColorGetter; ColorFunc: String): TColor;
begin
....
Result := getter(ColorFunc,BaseMap);- а как это работает?
ProcessSubFunc;
end;

а ещё есть вызов этой ф-ции
function TStyleColors.MakeColor(ColorFunc: String): TColor;
begin
Result := ComputeColor(FindColor,ColorFunc);
end;


 
Skier ©   (2002-11-14 15:33) [7]

>Сатир
function ComputeColor(getter:TColorGetter; ColorFunc: String): TColor;

getter - это указатель на функцию типа TColorGetter,
соответственно при вызове
ComputeColor вызвана функция FindColor.
Это называется CallBack
В кладовке есть функция копирования файлов - там тоже
используется такой подход - вполне наглядно...


 
Fantasist ©   (2002-11-14 21:41) [8]


> Соль заключается в том, что этот тип есть склейка адреса
> точки входа в этот код и адреса VMT (нужно для восстановления
> конекста объекта, чей метод вызывается). Соттветствено,
> занимает 8 байт.


Да нет проще. Этот тип просто содержит в себе адрес метода, который надо вызвать, и адрес объекта, который надо передать этому методу как параметр self.



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
1-82801
AM
2002-11-13 11:10
2002.11.25
message loop


14-82922
irmantukas
2002-11-05 01:32
2002.11.25
Delphi 7


8-82879
HPN
2002-08-03 22:05
2002.11.25
Звук с микрофона


4-83079
Reals
2002-10-15 18:31
2002.11.25
Как из реестра прочитать стринговое значение...


1-82708
Андрей Прокофьев
2002-11-13 13:27
2002.11.25
Проблема с датой