.
Monday 21st of May 2012    

Информация

Счетчики

Голосование

Лучшая марка телефона
 

Реклама

фильмы онлайн

фильмы онлайн


Функция FieldAddress
загрузка...

Функция FieldAddress возвращает указатель на поле объекта, а функция MethodAddress - указатель на метод объекта. В качестве параметра следует передать строку с названием поля или метода соответственно. Функция Method-Name решает обратную задачу: возвращает название метода при помощи указателя.

Поместите на форму три кнопки TButton и многострочный текстовый редактор - компонент TMemo. В процедуре обработки события OnClick() первой и второй кнопки напишите одну единственную строку:

procedure TForml.Button1Click(Sender: TObject); begin

MessageBeep(O); end;

Это что-то вроде строки-пустышки, заставляющей компьютер издавать системный звук. А обработку события щелчка по третьей кнопке повторите в соответствии с нижеизложенным листингом:

procedure TForml.Button3Click(Sender: TObject); var i : Integer;

s : String;

p : Pointer;

begin

Screen. Cursor:=crHourgLass; Memo1.Clear;

for i:=1 to High(integer)-1 do

{Это очень длинный цикл, т. к. High(Integer)-1 возвратит число 2147483646} begin

p:=Ptr(i);

s:=TForm1.MethodName(p);

if s<>'' then Memo1.Lines.add(Format('%d %s',[i, s])); end;

Screen.Cursor:=crDefault; end;

Запустите программу и запаситесь терпением. В весьма длинном цикле перебираются все неотрицательные значения, которые способна принимать переменная i. Указатель на целочисленное значение i мы получаем при помощи функции Ptr(), а затем спрашиваем у представителя класса TForm1 главной формы проекта, есть ли у него метод (функция MethodName) с таким указателем, и если таковой имеется, то выводим его адрес и название в поле Memo. Если все сделано верно, то в результате выполнения программы в memo-поле окажутся две строки - Button1Click и Button3Click.

А в следующем листинге продемонстрирован способ вызова найденного метода. Функция MethodAddress() пытается найти процедуру с именем Button1-Click(). И если такая процедура обнаружена, то осуществляется ее вызов.

procedure TForm1.Button2Click(Sender: TObject); var p : pointer;

Button1Click : procedure(Sender: TObject); begin

p:=TForm1.MethodAddress('Button1Click'); if Assigned(p)=true then begin

@Button1Click:=p; Button1Click(sender); end; end;

При таком способе вызова необходимо обращать особое внимание не только на имя, но и на код вызываемой процедуры. Поясню на примере. Внесите из-

менения в событие, возникающее при щелчке по первой кнопке, и вновь попытайтесь вызвать его щелчком по кнопке Button2.

procedure TForm1.Button1Click(Sender: TObject); begin

//MessageBeep(O);

Button1.Caption:='';

end;

Delphi известит об ошибке доступа к некоторому адресу. Другими словами, ошибка возникает при обращении к свойствам и методам объектов.


загрузка...
 

Самое популярное:

bottom

карта сайта