bdr> Прочитал твои два послания. Спасибо за информацию.
bdr> У меня к тебе два вопроса, если есть время.
bdr> 1. Чем все таки лучше и правильно ли использовать
bdr> Init PROCEDURE(*GROUP _objB)
bdr> или как приводил Андрей передавать адрес класса в STRING
bdr> и почему неиспользовать
bdr> Init PROCEDURE(ClassB _objB)
Как внес поправку Андрей — передавать адрес через строку удобнее при запуске нового потока. Так как только строки возможно передавать в качестве параметров. При обычном вызове — лучше передавать через группу, т.к. — это «родной» формат для класса. Использовать в качестве параметра класс — тоже правильно. Другое дело, что при таком описании ты не сможешь в эту процедуру передать другой класс. А при передаче через строку или группу можно передавать любые классы.
bdr> 2.Второй вопрос несколько на другую тему, но о классах
bdr> Описаны 3 типа класса: класс А; и В и С порожденные от А
bdr> В некую процедуру(это может быть и метод вообще другого класса)
bdr> в качестве параметра передаются класс типа В или С
bdr> ( Procedure(ClassA CurrentClass)). Как в этой процедуре определить
bdr> что передан класс типа В или класс типа С, неспользуя дополнительных
bdr> параметров. В DELPHY для этого есть AS.
Два способа:
я иногда завожу в классах строковую переменную, в которую при инициализации записываю название типа класса.
если оба класса различаются по общему размеру свойств, то можно сравнивать размер переданного класса.
Есть, правда, еще один способ. Посложнее. Класс передается в процедуру по адресу его буфера. Первым лонгом в этом буфере идет адрес таблицы виртуальных методов. Вот уже он — разный для разных классов. Он назначается на этапе компиляции. Так что, в принципе, в начале программы можно составить некую таблицу этих адресов VMT для разных классов и уже по ней идентифицировать классы. Кстати, если у класса нет виртуальных методов или вообще нет методов — все равно этот параметр есть. Он используется RTL-библиотекой для получения полной инфы о структуре класса. Эта инфа записана непосредственно ПЕРЕД тем адресом, на который указывает адрес VMT.