![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужно сделать свой список компонентов в редакторе свойства [D7, WinXP]
kmi © (2005-03-14 18:18:00)Задача такая. Имеется редактор свойства, наследуемый от TComponentProperty. По умолчанию он создает в Инспекторе выпадающий список всех компонентов, которые могут быть значением данного свойства и которые расположены в модулях, указанных в разделе uses редактируемого модуля.
Но мне нужно из этих компонентов выбрать те, у которых свойство Tag совпадает по значению со свойством Tag данного компонента. Т.е. фактически нужно создать свой список. Как получить проверить свойство Tag у компонентов в других модулях?
kmi (2005-03-16 01:19:00) [1]:)
Юрий Зотов (2005-03-15 03:16:00) [2]> kmi (15.03.05 02:58) [6]
И конечно, не было забыто про Notification и FreeNotification?
:о)
kmi (2005-03-15 02:58:00) [3]Согласен. Это было сделано еще при создании компонента.
Юрий Зотов (2005-03-15 00:39:00) [4]> kmi (14.03.05 23:58) [4]
Учитывая, что юзер может ввести имя компонента и вручную, нужно проверять совпадение Tag еще и в методе Set самого свойства. При несоответствии - возбуждать исключение.
kmi (2005-03-14 23:58:00) [5]Спасибо, все работает прекрасно!
Юрий Зотов (2005-03-14 22:13:00) [6]> kmi (14.03.05 20:09) [2]
Свое свойство вместо Tag - это уже лучше. Но ведь и его юзер может изменить - и снова возникнет та же самая ситуация.
Значит, или нельзя давать юзеру его менять, или при его изменении компонент, у которого его изменили обязан будет оповестить все компоненты, которые на него ссылаются о том, что свойство изменено - чтобы они могли скорректировать ссылку.
Ладно, это дело Ваше, но советую этот вопрос хорошо продумать, иначе все остальное просто теряет смысл.
А делается это так - пишется и регистрируется редактор свойства, в котором callback-процедура, переданная в GetValues, подменяется своей. Вот в этой своей процедуре и накладываем нужный фильтр.
type
TCompRefProperty = class(TComponentProperty)
private
FSaveStrProc: TGetStrProc;
procedure StrProc(const S: string);
public
procedure GetValues(Proc: TGetStrProc); override;
end;
procedure TCompRefProperty.GetValues(Proc: TGetStrProc);
begin
FSaveStrProc := Proc;
inherited GetValues(StrProc)
end;
procedure TCompRefProperty.StrProc(const S: string);
begin
if TComponent(GetComponent(0)).Tag = Designer.GetComponent(S).Tag then
FSaveStrProc(S)
end;
kmi (2005-03-14 20:09:00) [7]Это не принципиально. Во-первых, программа для внутреннего пользования. Во-вторых, вместо Tag я могу добавить свое свойство и заполнять его по определенным условиям.
Юрий Зотов (2005-03-14 19:48:00) [8]Давайте начнем с главного. Предположим, Вы задачу решили, нужный список сформирован, юзер раскрыл его и выбрал один из компонентов (назовем его C). Пока что все хорошо.
ОК, теперь юзер берет - и меняет свойство Tag у компонента C или у Вашего. Имеет полное право. А ссылка-то у Вас осталась на компонент C, она же не изменилась. Но перестала соответствовать Вашему условию отбора.
И как быть?