Форум: "Основная";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
ВнизОбъясните на пальцах Найти похожие ветки
← →
Сатир (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c