элементы различных классов в одной коллекции
От: Maybe Украина  
Дата: 20.03.02 12:55
Оценка:
Помогите пожалуйста,
По сути надо реализовать список компонент и возможность добаления их на форму из этого списка, но только с помощью введения свойста — коллекции, как сделать чтобы внутри коллекции были объекты разных классов, обычные визуальные делфийские компоненты, т.е. наследники TControl, можно ли как-то приводить TControl к ним, но где это надо делать — в реализации методов коллекции или уже при реализации самой программы, испрользуя все-таки элементы коллекции как объекты NControl?
Заранее огромное спасибо.
Re: элементы различных классов в одной коллекции
От: Spaider Верблюд  
Дата: 20.03.02 13:12
Оценка:
Здравствуйте Maybe, Вы писали:

M>Помогите пожалуйста,

M>По сути надо реализовать список компонент и возможность добаления их на форму из этого списка, но только с помощью введения свойста — коллекции, как сделать чтобы внутри коллекции были объекты разных классов, обычные визуальные делфийские компоненты, т.е. наследники TControl, можно ли как-то приводить TControl к ним, но где это надо делать — в реализации методов коллекции или уже при реализации самой программы, испрользуя все-таки элементы коллекции как объекты NControl?
M>Заранее огромное спасибо.

Х-м-м. А может, тебе лучше юзать TList? IMHO геморроя намного меньше будет. В TList элементы представлены простыми указателями. Приводи к какому угодно типу и вперед! И дописывать реализацию TCollectionItem'ов не придётся.
--
К вашим услугам,
Re[2]: элементы различных классов в одной коллекции
От: Аноним  
Дата: 20.03.02 16:04
Оценка:
Здравствуйте Spaider, я бы с удовольствием юзать Тлист,
но это задание на лабу, написано сделать только через NCollextion :((
Re[3]: элементы различных классов в одной коллекции
От: Spaider Верблюд  
Дата: 20.03.02 16:21
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Spaider, я бы с удовольствием юзать Тлист,

А>но это задание на лабу, написано сделать только через NCollextion (

А не мог бы ты кинуть задание в более конкретной форме?
Вообще-то, "стандартный" путь создания своих коллекций состоит в создании потомка от TCollection, который содержит набор потомков TCollectionItem'а. Чем он тебя не устраивает?
--
К вашим услугам,
Re[4]: элементы различных классов в одной коллекции
От: Аноним  
Дата: 20.03.02 16:48
Оценка:
Здравствуйте Spaider

Конечно я могла бы кинуть задание как оно было поставленно:
Создать наследника TComponent, имеющего свойство TCollection
и элементы коллекции — другие компоненты на форме (TControl и выше)

Я знаю как вживить в компонент коллекцию, я только не понимаю, если я сделаю коллекцию
TControl'ов как мне их приводить потом к NButton, TEdit,Tlabel и тд? Разве что через As
но я не уверенна :( И еще непонятно как отображать эти компонеты на форме, их же обычным методом Paint не выведешь....
Re[5]: элементы различных классов в одной коллекции
От: muh  
Дата: 20.03.02 18:55
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Spaider



А>Я знаю как вживить в компонент коллекцию, я только не понимаю, если я сделаю коллекцию

А>TControl'ов как мне их приводить потом к NButton, TEdit,Tlabel и тд? Разве что через As
А>но я не уверенна И еще непонятно как отображать эти компонеты на форме, их же обычным методом Paint не выведешь....

Эхх... А РТТИ зачем ? Валенки сушить ? Ж Кроме того, можно создать интерфейс и наследовать от него и по выбору TAggObject/TInterfaced
МВС
Люди слышат только те вопросы, на которые они в состоянии найти ответ. (с)
Re[5]: элементы различных классов в одной коллекции
От: vav Россия  
Дата: 21.03.02 05:36
Оценка: -1
Здравствуйте Аноним, Вы писали:

А>Здравствуйте 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]: элементы различных классов в одной коллекции
От: Spaider Верблюд  
Дата: 21.03.02 06:01
Оценка:
Здравствуйте 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]: элементы различных классов в одной коллекции
От: vav Россия  
Дата: 22.03.02 04:31
Оценка:
S>Только всё равно осатается некоторая двусмысленность... Начнем с того, что надо хранить в коллекции? Уже созданные экземпляры объектов?

естественно, а какие варианты?

S>Как тогда быть с инициализацией/изменением их свойств? Poperty Editor прикруривать?


Так задание было просто хранить их в коллекции. Ни каких действий, кроме как показать и определить класс объекта не предлагалось.


S>Да, еще деталька, фактически, при установке

S>
S>TSomeControl.Parent:=MyLovelyForm; // - это как, прям классу?
S>

S>компонент становится частью массива Controls этой формы. А следовательно, сам знает как и, главное, где себя отображать.

зато если сказать ему
SomeControl.Parent:=Nil;

то он уже ничего знать не будет
Re[8]: элементы различных классов в одной коллекции
От: Spaider Верблюд  
Дата: 22.03.02 07:54
Оценка:
Здравствуйте vav, Вы писали:

S>>Да, еще деталька, фактически, при установке

S>>
S>>TSomeControl.Parent:=MyLovelyForm; // - это как, прям классу?
S>>

S>>компонент становится частью массива Controls этой формы. А следовательно, сам знает как и, главное, где себя отображать.

Ну, описочка вышла т.е., скорее, дописочка....
Конечно же к экземпляру, а не классу.
--
К вашим услугам,
Re: элементы различных классов в одной коллекции
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.03.02 14:36
Оценка:
Здравствуйте 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)
и две строки — в конструкторе

 FCollection:= TCollection.Create(TControlContainerItem);


и в деструкторе

 FCollection.Free;
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.