Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.57 MB
Время: 0.047 c
4-15365
Stainer
2002-11-19 16:36
2003.01.06
Клик по popup menu


4-15370
Eug201
2002-11-19 14:40
2003.01.06
Модальное окно


7-15338
der
2002-10-23 16:32
2003.01.06
мышь вкл/выкл


8-15164
Aleksey Rykov
2002-09-13 01:48
2003.01.06
DirectDraw в оконном режиме


1-15120
Groove
2002-12-23 08:03
2003.01.06
ХРАНЕНИЕ табличных данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский