Шаг 85 - Редакторы свойств, выпадающий список значений

Ну, выпадающий список значений это мы тоже видели, знаем... Например, когда нужно 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");
}

Ну вот. Должно получиться так:

gif/85_1.gif (2063 b)

Надеюсь, этот шаг был для Вас полезной информацией. Здесь есть ссылка на архив с последней версией компонента.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 19.09.2002