Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Присвоить метод объекта переменной процедурного типа

Автор: Василий1488 12.04.2014 5:40

Здравствуйте!
Возникла такая проблема:
Не могу присвоить процедурной переменной метод объекта (пишет неправильное использование функции)
На сколько помню, то в делфи для этого при объявлении проц. типа надо указать of object. Как это сделать в турбопаскале? Если никак, то где можно прочитать про то, как происходит вызов метода объекта (есть идея вызвать непосредственно по адресу, но как его заставить обработать нужный объект?)...
Заранее спасибо!

Автор: OCTAGRAM 18.04.2014 8:31

Цитата(Василий1488 @ 12.04.2014 5:40) *
Если никак, то где можно прочитать про то, как происходит вызов метода объекта (есть идея вызвать непосредственно по адресу, но как его заставить обработать нужный объект?)...


Да, у меня тоже никак не получилось получить этот адрес, даже в Pointer.

По идее, так же, как и у обычных процедур, только указатель на нужный объект первым параметром перед всеми остальными. Тут ещё надо помнить, что переменные процедурных типов вызываются как FAR, а по умолчанию процедуры компилируются как NEAR. Директиву FAR применительно к методам объектов TP не принимает. Либо они всегда FAR, либо это не предусмотрено. Можно попробовать компилировать с {$F+} на всякий случай.

Автор: KIN 22.05.2014 2:20

Цитата(Василий1488 @ 12.04.2014 1:40) *

Здравствуйте!
Возникла такая проблема:
Не могу присвоить процедурной переменной метод объекта (пишет неправильное использование функции)
На сколько помню, то в делфи для этого при объявлении проц. типа надо указать of object. Как это сделать в турбопаскале? Если никак, то где можно прочитать про то, как происходит вызов метода объекта (есть идея вызвать непосредственно по адресу, но как его заставить обработать нужный объект?)...
Заранее спасибо!

Для того, чтобы объявить класс на Pascal необходимо воспользоваться ключевым словом Object . Так как класс всегда является типом, делать это можно лишь в Type части программы:

Type
Class1 = Object
{список полей}
A: Byte;
V: Real;
{список методов}
Procedure Nothing(Var K: Byte);
End;
Легко заметить, что поля и методы (общее для них название - члены класса) объявляются очень похоже на поля записи и обычные процедуры/функции. Объекты класса объявляются так же, как и обычные переменные:

Var Object1, Object2: Class1;
Соотвенно, доступ к полям объекта некоторого класса производится аналогично доступу к полям записи:

Object1.V:= Object2.A;
Обращение к методам класса производится аналогичным образом:

Object1.Nothing(Object1.A);