Форум: "Основная";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];
ВнизРедактор свойств Найти похожие ветки
← →
perov (2002-12-24 11:29) [0]Возникла необходимость написать редактор для свойст, имеющих тип TMyObjectClass (TMyObjectClass = class of TMyObject). Среди стандартных редакторов свойств нужного нет. Поэтому пишу свой. Получить список нужных мне зарегистрированных классов проблем нет. Возникли вопросы при чтении текущего установленного значения (можно попробовать реализацию из редактора TClassPropertyEditor) и особенно при установки нового значения.
Можно ли и как установить в редакторе свойств значение для свойст с типом ?
← →
Юрий Зотов (2002-12-24 14:46) [1]Думал-думал - так и не понял. При чем тут метакласс и список зарегистрированных классов? И какие конкретно проблемы с чтением/установкой свойств?
Может, попроще как-то, попонятнее, без терминологии?
← →
perov (2002-12-25 07:15) [2]есть такая структура классов
TMyBaseObject=class......
TMyObject1 = class(TMyBaseObject).....
TMyObject2 = class(TMyBaseObject).....
TMyObject2_1 = class(TMyObject2).....
TMyObject2_2 = class(TMyObject2).....
TMyBaseClass = class of TMyObject;
TMyClass1 = class ofTMyObject1 ;
TMyClass2 = class of TMyObject2 ;
TMyClass2_1 = class of TMyObject2_1;
TMyClass2_2 = class of TMyObject2_2;
синтаксис конструкторов у все классов одинаков, все классы зарегестрированны
Есть компонент
TMyComponent=class(TComponent)
private
fItemClass: TMyBaseClass;
published
property ItemClass: TMyBaseClass read fItemClass write fItemClass;
end;
свойство должно содержать одно из значений TMyClass*
стандартных редакторов свойст такого типа нет. а при написании собсвенного возникли вопросы
1. как установить в редакторе новое значение.
2. как прочитать в редакторе текущее значение (хотя можно воспользоваться приемом как в ClassPropertyEditor)
← →
MBo (2002-12-25 07:21) [3]Хотелось бы узнать, как ты используешь эту (довольно специфическую) конструкцию, т.н. метакласс?
TMyBaseClass = class of TMyObject;
Какой смысл у свойства такого типа???
(возможно, я чего-то недопонимаю)
← →
perov (2002-12-25 07:31) [4]в рун-тайме создаю экземпляр того класса, который содержится в свойстве
var
c: TMyBaseObject;
begin
c := ItemClass.Create(...);
....
end;
← →
Юрий Зотов (2002-12-25 10:21) [5]Если я правильно понял задачу, проблема заключается в получении списка зарегистрированных классов (чтобы построить редактор свойства с выпадающим списком). Привожу пример формирования такого списка всех зарегистрированных в IDE компонентов вплоть до TComponent. Нужно будет продлить его до нужного класса и при формировании списка сделать соответствующую фильтрацию (чтобы в список попали только нужные классы).
uses
ExptIntf;
procedure GetComponents(List: TStrings);
var
i, j: integer;
AClass: TClass;
begin
List.AddObject("TComponent", TComponent);
for i := 0 to ToolServices.GetModuleCount - 1 do
for j := 0 to ToolServices.GetComponentCount(i) - 1 do
begin
AClass := TClass(GetClass(ToolServices.GetComponentName(i, j)));
while AClass <> nil do
begin
List.AddObject(AClass.ClassName, AClass);
if AClass.ClassName = "TComponent"
then AClass := nil
else AClass := AClass.ClassParent
end
end
end;
Код выдран из рабочего эксперта, но подправлен "на ходу" (убрано лишнее) - поэтому в нем возможны погрешности, подправьте сами.
Последнее. Думаю, метаклассы в данном случае не нужны, а будет лучше и проще сделать свойство fItemClass строковым (не сам класс, а его имя) и создавать объект по имени его класса (через GetClass). Тогда редактор свойства элементарно наследуется от TStringProperty, у него перекрываются GetAttributes (paValueList) и GetValues (примерно с тем кодом, который приведен выше). Собственно, это и все.
← →
perov (2002-12-25 12:32) [6]уу, как сложно...
список классов я получил через TClassFinder...
про создание списков у строкового свойства мне в голову не пришло :(.
Огромное спасибо.
з.ы.
На данный момент я поступил немного сложнее: Создал перечислимый тип, у которого значениями являются имена классов (без первой буквы) и потом уже восстанавливаю полное имя класса + FindClass
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.012 c