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

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

Скачать Бесплатно!
Для того чтобы скачать эту работу.
1. Пожалуйста введите слова с картинки:

2. И нажмите на эту кнопку.
закрыть



следнее, только что рассмотренное нами, чудо. Задумайтесь, как Delphi удается сводить в одном выражении значения разных типов? А если один из членов выражения - variant?

Фокус первый (Variant trick)

Читаем Help в разделе "Variants in expressions":

...In a binary operation, if only one operand is a variant, the other is converted to a variant..

Не кажется ли вам это удивительным - variant можно складывать с чем угодно. Например, integer плюс variant - будет variant, а variant можно опять складывать с чем угодно...

Новая кнопка на форме будет выполнять следующие действия:

procedure TfrmAllMiracles.btnVarTrickClick(Sender: TObject);

var

v: variant;

b: boolean;

i: integer;

s: string;

d: TDatetime;

x: Double;

begin

v:=0;

b := true;

i := 2;

s := 3;

d := StrToDateTime(01/01/01);

x := 5;

v := v+b+i+s+d+x;

ShowMessage(VarToStr(v));

end;

Figure 15.

Не кажется ли вам, что чудо уже то, что этот код компилируется, а ведь он еще и выдает какой-то результат. А ведь все очень просто - "variant можно складывать с чем угодно" и снова получим - variant.

Однажды ко мне обратился один мой знакомый с вопросом нет ли в Delphi чего-то подобного скрытому параметру Self, но для оператора with. Нет - ответил я ему сперва, а потом задумался...

Фокус второй (With-trick)

Предположим у нас есть следующая функция:

procedure ShowText(sl: TStringList);

begin

ShowMessage(sl.text);

end;

Figure 16.

И кнопка на форме:

procedure TfrmAllMiracles.btnWithSelfTrickClick(Sender: TObject);

var

sl: TStringList;

begin

sl := TStringList.Create;

try

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

ShowText(sl);

finally

sl.Free;

end;

end;

Figure 17.

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

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

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

...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.

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

 

s