Реферат: Семь чудес и два фокуса на Дельфи

end;

end;

Figure 17.

И мы, по каким-то причинам, хотим избавиться от локальной переменной sl. Но для того, что бы обратиться к функции ShowText, мы должны передать ей параметр типа TStringList. Откуда же его взять?

Давайте порассуждаем. Каждый метод получает скрытый параметр Self, может быть как-то можно вытащить его оттуда? Писать для этого специальный метод какого-то класса не хотелось бы - ведь это работало бы только для его потомков.

Давайте почитаем Help, раздел "TMethodtype":

...This type can be used in a type cast of a method pointer to access the code and data parts of the method pointer...

Не это ли то, что мы ищем?

Определимтипифункцию:

type

TSimpleMethod = procedure of object;

function GetWithSelf(const pr: TSimpleMethod): TObject;

begin

Result := TMethod(pr).Data;

end;

Figure 18.

Как видите, функция принимает указатель на метод, а возвращает обьект, являющийся владельцем этого метода. Но каким же методом мы воспользуемся? Например, метод Free, ведь его история восходит еще к самому TObject'у. Теперьпроверимсебя:

procedure TfrmAllMiracles.btnWithSelfTrickClick(Sender: TObject);

begin

with TStringList.Create do

try

CommaText := '1,2,3,4,5,6,7,8,9,0';

ShowText(TStringList(GetWithSelf(Free)));

finally

Free;

end;

end;

Figure 19.

Проверьте - работает.

К-во Просмотров: 808
Бесплатно скачать Реферат: Семь чудес и два фокуса на Дельфи