Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Нужно сделать свой список компонентов в редакторе свойства   Найти похожие ветки 

 
kmi   (2005-03-14 18:18) [0]

Задача такая. Имеется редактор свойства, наследуемый от TComponentProperty. По умолчанию он создает в Инспекторе выпадающий список всех компонентов, которые могут быть значением данного свойства и которые расположены в модулях, указанных в разделе uses редактируемого модуля.
Но мне нужно из этих компонентов выбрать те, у которых свойство Tag совпадает по значению со свойством Tag данного компонента. Т.е. фактически нужно создать свой список. Как получить проверить свойство Tag у компонентов в других модулях?


 
Юрий Зотов ©   (2005-03-14 19:48) [1]

Давайте начнем с главного. Предположим, Вы задачу решили, нужный список сформирован, юзер раскрыл его и выбрал один из компонентов (назовем его C). Пока что все хорошо.

ОК, теперь юзер берет - и меняет свойство Tag у компонента C или у Вашего. Имеет полное право. А ссылка-то у Вас осталась на компонент C, она же не изменилась. Но перестала соответствовать Вашему условию отбора.

И как быть?


 
kmi   (2005-03-14 20:09) [2]

Это не принципиально. Во-первых, программа для внутреннего пользования. Во-вторых, вместо Tag я могу добавить свое свойство и заполнять его по определенным условиям.


 
Юрий Зотов ©   (2005-03-14 22:13) [3]

> 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 23:58) [4]

Спасибо, все работает прекрасно!


 
Юрий Зотов ©   (2005-03-15 00:39) [5]

> kmi   (14.03.05 23:58) [4]

Учитывая, что юзер может ввести имя компонента и вручную, нужно проверять совпадение Tag еще и в методе Set самого свойства. При несоответствии - возбуждать исключение.


 
kmi   (2005-03-15 02:58) [6]

Согласен. Это было сделано еще при создании компонента.


 
Юрий Зотов ©   (2005-03-15 03:16) [7]

> kmi   (15.03.05 02:58) [6]

И конечно, не было забыто про Notification и FreeNotification?
:о)


 
kmi   (2005-03-16 01:19) [8]

:)



Страницы: 1 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
3-1129092338
Anics
2005-10-12 08:45
2005.11.20
Кто-нибудь пробовал в TDBGrid устроить автонумерацию строк?


14-1130184262
Volodya
2005-10-25 00:04
2005.11.20
Переполнение йомкости для отработаного чернила


9-1117766893
Нужен Хелп
2005-06-03 06:48
2005.11.20
А есть ли пример кода игры, чтобы по Интернету двое могли играть?


11-1111908939
Serr
2005-03-27 11:35
2005.11.20
Вопрос по базам


14-1130352479
x.pro
2005-10-26 22:47
2005.11.20
филовоский вопрос