Как использовать два свойства для одного редактора свойств?

Обратитесь к этому моему предыдущему списку вопросов / ответов. Он описывает, как создать редактор свойств для IDE.

Я создал еще один редактор свойств для совершенно другой цели. В данном случае это селектор символа глифа типаString (потому что он может содержать более одного символа глифа). В отличие от моего другого в упомянутом вопросе / ответе, он очень специфичен для конкретного свойства на конкретномTCollectionItemмой класс.

Все хорошо, и я могу вызвать этот редактор свойств для этого конкретного свойства. Однако у меня есть дилемма. Редактор свойств по своей природе напрямую связан со шрифтом. Пользователь может выбрать символ (глиф) из определенного шрифта. В моем редакторе свойств есть возможность изменить шрифт и просмотреть глифы, содержащиеся в этом шрифте.

Этот компонент также имеет возможность указать шрифт в отдельном TFont имущество. Проблема возникает, когда дело доходит до комбинации обоих Glyph собственность и Font свойство используется в том же редакторе свойств. Когда я вызываю этот редактор для Glyph собственности, он также должен знать Font который он должен использовать. Напротив, когда пользователь выбирает шрифт и символ глифа в этом редакторе, он также должен обновить обаGlyphа такжеFontсвойства.

Короче, PropertyB зависит от PropertyA, Если PropertyAизменения, тоPropertyB будет иметь совершенно другой набор возможных значений. Итак, какой бы редактор я не установил в IDE, он должен позволять пользователюPropertyA а также PropertyB в то же время.

Как сделать так, чтобы редактор свойств имел доступ к нескольким свойствам?

2 ответа

Решение

Решение 1

Вместо редактора свойств реализуйте редактор компонентов. Такой редактор компонентов будет иметь доступ ко всему компоненту, а не только к одному свойству.

Решение 2

Оберните оба ваших свойства внутри выделенного TPersistent класс, а затем создать TClassProperty вместо этого редактор свойств для этого класса. Отдельные свойства фактически не вызывают редактор свойств. Вместо этого их родитель TPersistent вызовет комбинированный редактор свойств, который имеет доступ ко всем свойствам в этом классе. Хороший существующий пример TFont редактор.

TPropertyEditor имеет общественность GetComponent() метод, который можно использовать для доступа к объекту (объектам), свойство которого в данный момент редактируется (несколько объектов с одним и тем же свойством могут быть отредактированы одновременно, если это позволяет редактор свойств). Тогда у вас будет доступ ко всем другим свойствам в том же объекте (ах).

При этом, если ваш редактор отображает всплывающее диалоговое окно для редактирования, он должен быть реализован как редактор компонентов вместо (или в дополнение к) редактора свойств. Редактор свойств должен редактировать только одно свойство за раз, хотя он может зависеть от других свойств только для чтения. Например, Glyph редактор свойств, который также редактирует Font собственность, и наоборот, не очень хороший дизайн. Но компонентный редактор, который редактирует оба, вполне приемлем.

Другие вопросы по тегам