Ну, выпадающий список значений это мы тоже видели, знаем... Например, когда нужно true/false поставить или еще что-то выбрать. Кстати в предыдущем шаге на первом скриншоте как раз и показан такой список. Так вот. Сделать такую вещь довольно просто... Можно сказать элементарно... Для этого немного теории, о которой мы умолчали в прошлом шаге.
Вообще, у редакторов свойств есть довольно много методов, которые необходимо переопределять, чтобы добиться желаемого эффекта. Вот те методы, которые используются для диалогов и выпадающих списков:
Метод GetAttributes устанавливает, что наш редактор свойств умеет делать, например:
__fastcall TPropertyAttributes TColorProperty::GetAttributes() { return TPropertyAttributes() << paMultiSelect << paDialog << paValueList; }
Соответственно устанавливает, что пользователь (или все же программист?) может открыть диалог, выбрать из выпадающего списка, и в тоже время может устанавливать значение свойства, даже если выбрано несколько сходных компонентов одновременно.
Значения могут быть следующими:
Теперь код, который это все продемонстрирует. Поскольку в нашем компоненте особенно подходящего под это нет, я решил для примера выбрать свойство Title. Выглядит все это так:
// --- FolderDialog.h class PACKAGE TFolderStatusPropertyEditor : public TStringProperty { public: __fastcall TFolderStatusPropertyEditor(void):Dsgnintf::TStringProperty(Designer,0){}; virtual void __fastcall GetValues(Classes::TGetStrProc Proc); TPropertyAttributes __fastcall GetAttributes() { return TPropertyAttributes()<<paValueList; }; }; // // // --- FolderDialog.cpp // ... namespace Folderdialog { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TFolderDialog)}; RegisterComponents("Ossam", classes, 0); PTypeInfo ti = *GetPropInfo(__typeinfo(TFolderDialog),"Root")->PropType; RegisterPropertyEditor(ti, __classid(TFolderDialog), "Root",__classid(TFolderPropertyEditor)); ti = *GetPropInfo(__typeinfo(TFolderDialog),"Title")->PropType; RegisterPropertyEditor(ti, __classid(TFolderDialog), "Title",__classid(TFolderStatusPropertyEditor)); } } void __fastcall TFolderStatusPropertyEditor::GetValues(Classes::TGetStrProc Proc) { Proc("Here you select the folder"); Proc("Now you select the folder"); Proc("Silly, didn't you get what to do?"); Proc("Alright, you need not to select a folder"); }
Ну вот. Должно получиться так:
Надеюсь, этот шаг был для Вас полезной информацией. Здесь есть ссылка на архив с последней версией компонента.