2013-03-04 3 views
6

Я пишу редактор пользовательских компонентов, по существу похожий на редактор TActionList, в котором он позволяет создавать субкомпоненты. Редактор имеет кнопки для добавления/удаления компонентов.Дизайнер Delphi, наследуется ли компонент?

Теперь я хотел бы узнать, наследуется ли выбранный компонент, чтобы я мог отключить кнопку удаления. Я не нашел такого члена в IDesigner или связанных с ним интерфейсах.

Если я просто идти вперед и удалить с помощью Designer.DeleteSelection(True); тогда я получаю исключение:

Выбор содержит компонент, ххх, введенный в предка и не могут быть удалены.

Это не так плохо, но я бы предпочел отключить кнопку удаления в первую очередь.

+0

Вы можете получить доступ к списку своих товаров, когда вы выбираете их в своем представлении списка (?) И запрашивать каждый элемент, если 'InheritsFrom' определенного класса. – TLama

+1

@TLama Нет, это не оно. Дэниел говорит о визуальном наследовании, о чем свидетельствует унаследованное ключевое слово в файлах .dfm. –

+0

Я был бы удивлен, если бы это было возможно. Попробуйте сделать то, что вы описали, с помощью запаса 'TActionList'. Сообщение об ошибке: 'Невозможно переименовать компонент Action1, компонент был введен в форме предка. '. Но затем нажмите на действие, и оно все равно исчезнет, ​​и появится еще одно сообщение об ошибке: * Аргумент вне диапазона *. Таким образом, IDE не может понять это правильно! –

ответ

8

Итак, по-видимому, есть способ, проверив TComponent.ComponentState для csAncestor, так:

csAncestor в ComponentState

И это documented:

csAncestor - The компонент был введен в форме предка. Установляется только в том случае, если также установлено csDesigning.

+2

Очень хорошо. Отлично сработано. Возможно, кто-то должен сказать Embarcadero об этом, чтобы они могли исправить свой редактор списка действий! –

+0

+1 хорошая работа .... – bummi