Помогите пожалуйста,
По сути надо реализовать список компонент и возможность добаления их на форму из этого списка, но только с помощью введения свойста — коллекции, как сделать чтобы внутри коллекции были объекты разных классов, обычные визуальные делфийские компоненты, т.е. наследники TControl, можно ли как-то приводить TControl к ним, но где это надо делать — в реализации методов коллекции или уже при реализации самой программы, испрользуя все-таки элементы коллекции как объекты NControl?
Заранее огромное спасибо.
Здравствуйте Maybe, Вы писали:
M>Помогите пожалуйста, M>По сути надо реализовать список компонент и возможность добаления их на форму из этого списка, но только с помощью введения свойста — коллекции, как сделать чтобы внутри коллекции были объекты разных классов, обычные визуальные делфийские компоненты, т.е. наследники TControl, можно ли как-то приводить TControl к ним, но где это надо делать — в реализации методов коллекции или уже при реализации самой программы, испрользуя все-таки элементы коллекции как объекты NControl? M>Заранее огромное спасибо.
Х-м-м. А может, тебе лучше юзать TList? IMHO геморроя намного меньше будет. В TList элементы представлены простыми указателями. Приводи к какому угодно типу и вперед! И дописывать реализацию TCollectionItem'ов не придётся.
--
К вашим услугам,
Re[2]: элементы различных классов в одной коллекции
От:
Аноним
Дата:
20.03.02 16:04
Оценка:
Здравствуйте Spaider, я бы с удовольствием юзать Тлист,
но это задание на лабу, написано сделать только через NCollextion :((
Re[3]: элементы различных классов в одной коллекции
Здравствуйте Аноним, Вы писали:
А>Здравствуйте Spaider, я бы с удовольствием юзать Тлист, А>но это задание на лабу, написано сделать только через NCollextion (
А не мог бы ты кинуть задание в более конкретной форме?
Вообще-то, "стандартный" путь создания своих коллекций состоит в создании потомка от TCollection, который содержит набор потомков TCollectionItem'а. Чем он тебя не устраивает?
--
К вашим услугам,
Re[4]: элементы различных классов в одной коллекции
От:
Аноним
Дата:
20.03.02 16:48
Оценка:
Здравствуйте Spaider
Конечно я могла бы кинуть задание как оно было поставленно:
Создать наследника TComponent, имеющего свойство TCollection
и элементы коллекции — другие компоненты на форме (TControl и выше)
Я знаю как вживить в компонент коллекцию, я только не понимаю, если я сделаю коллекцию
TControl'ов как мне их приводить потом к NButton, TEdit,Tlabel и тд? Разве что через As
но я не уверенна :( И еще непонятно как отображать эти компонеты на форме, их же обычным методом Paint не выведешь....
Re[5]: элементы различных классов в одной коллекции
Здравствуйте Аноним, Вы писали:
А>Здравствуйте Spaider
А>Я знаю как вживить в компонент коллекцию, я только не понимаю, если я сделаю коллекцию А>TControl'ов как мне их приводить потом к NButton, TEdit,Tlabel и тд? Разве что через As А>но я не уверенна И еще непонятно как отображать эти компонеты на форме, их же обычным методом Paint не выведешь....
Эхх... А РТТИ зачем ? Валенки сушить ? Ж Кроме того, можно создать интерфейс и наследовать от него и по выбору TAggObject/TInterfaced
МВС
Люди слышат только те вопросы, на которые они в состоянии найти ответ. (с)
Re[5]: элементы различных классов в одной коллекции
Здравствуйте Аноним, Вы писали:
А>Здравствуйте Spaider
А>TControl'ов как мне их приводить потом к NButton, TEdit,Tlabel и тд? Разве что через As
А>но я не уверенна И еще непонятно как отображать эти компонеты на форме, их же обычным методом Paint не выведешь....
Нужно указать объекту кто его будет рисовать:
If Object is TEdit then TEdit(Object).Parent = Form1 // покажет на форме
ну или (Obgect as TEdit).SomeMetod
If Object is TLabel then...
//А если просто показать, то не нужно конретизировать, а прямо
TControl(Object).Parent = Form1;
Re[6]: элементы различных классов в одной коллекции
Здравствуйте vav, Вы писали:
А>>TControl'ов как мне их приводить потом к NButton, TEdit,Tlabel и тд? Разве что через As А>>но я не уверенна И еще непонятно как отображать эти компонеты на форме, их же обычным методом Paint не выведешь.... vav>Нужно указать объекту кто его будет рисовать: vav>
vav>If Object is TEdit then TEdit(Object).Parent = Form1 // покажет на форме
vav>ну или (Obgect as TEdit).SomeMetod
vav>If Object is TLabel then...
vav>//А если просто показать, то не нужно конретизировать, а прямо
vav>TControl(Object).Parent = Form1;
vav>
Ну, вроде, с приведением типов всё более-менее ясно
Только всё равно осатается некоторая двусмысленность... Начнем с того, что надо хранить в коллекции? Уже созданные экземпляры объектов? Как тогда быть с инициализацией/изменением их свойств? Poperty Editor прикруривать?
Да, еще деталька, фактически, при установке
TSomeControl.Parent:=MyLovelyForm;
компонент становится частью массива Controls этой формы. А следовательно, сам знает как и, главное, где себя отображать.
TIP: Если спуститься на один уровень наследования ниже, т.е. к TWinControl, то у него есть замечательный метод PaintTo. Для показухи -- просто супер, изображение формирует сам контрол, ты его отображаешь, а действий никаких с ним юзер сделать не может, ведь это всего лишь картинка
PS В таких форумах как-то по дефолту предполагаешь мужской род собеседника. Простите, мисс
--
К вашим услугам,
Re[7]: элементы различных классов в одной коллекции
Здравствуйте Maybe, Вы писали:
M>Помогите пожалуйста, M>По сути надо реализовать список компонент и возможность добаления их на форму из этого списка, но только с помощью введения свойста — коллекции, как сделать чтобы внутри коллекции были объекты разных классов, обычные визуальные делфийские компоненты, т.е. наследники TControl, можно ли как-то приводить TControl к ним, но где это надо делать — в реализации методов коллекции или уже при реализации самой программы, испрользуя все-таки элементы коллекции как объекты NControl? M>Заранее огромное спасибо.
Все очень просто. Вы, наверное, заметили, что в коллекции надо хранить TCollectionItem, а вовсе не TControl. Поэтому надо сделать класс-обертку, потомок TCollectionItem:
TControlContainerItem = class(TCollectionItem)
published
property Control: TControl;
end;
Достаточно нажать Shift+Ctrl+С на этом коде, чтобы он доопределил проперть. Нам не понадобится что-либо дополнять в этом коде.
В принципе, это все. Остается в конструкторе компонента, включающего коллекцию, сгенерить TCollection.Create(TControlContainerItem).
Дельфи включает редактор ЛЮБЫХ коллекций.
Элементы коллекций редактируются тем же проперти инспектором. Маленькое примечание: свойство Control имеет тип, порожденный от TComponent. Для проперти инспектора это является сигналом того, что имеется в виду не агрегированный объект (как был бы, напрмер, TFont), а ссылка на объект, лежащий на форме. Поэтому редактироваться он будет точно так же, как свойство TLabel.FocusControl или TListView.SmallImages — инспектор покажет все объекты требуемого класса, которые лежат на форме.
И не слушайте никого, щас вас заставят рисовать контролы в чужой девайс контекст. А все, что надо написать руками — это 7 строчек кода. 4 — показаннные выше, еще одна:
property Controls: TCollection;
(тоже потребует нажатия Shift+Ctrl+C)
и две строки — в конструкторе