

| стрелялки |
| спорт |
| драки |
| стратегии |
| гонки |
| логические |
| азартные |
| аркады |
| эротические |
| фильмы онлайн |
| Функция 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 известит об ошибке доступа к некоторому адресу. Другими словами, ошибка возникает при обращении к свойствам и методам объектов. |
