Вопрос № 182618: Добрый день, уважаемые эксперты! Буде добры и подскажите мне как работать с TComponentList... я так понимаю - это массив указателей на компонентs. Как узнать имя компонента находящегося в данном массиве (к примеру Button1), как узнать есть ли компоне...
Вопрос № 182618:
Добрый день, уважаемые эксперты! Буде добры и подскажите мне как работать с TComponentList... я так понимаю - это массив указателей на компонентs. Как узнать имя компонента находящегося в данном массиве (к примеру Button1), как узнать есть ли компонент в массиве а если есть то узнать его индекс.. Заранее благодарю..
//находим индекс компонента Button3 в списке List и используя полученный индекс выводим свойства компонента Comp3:=List.Items[List.IndexOf(Button3)] as TComponent;
ShowMessage ('Button3: ' +Format ( '%s (%s): %s (%s)', [Comp3.Name, Comp3.ClassName, Comp3.Owner.Name, Comp3.Owner.ClassName]));
Безусловно, доступ к компонентам в списке (по индексу) можно организовать с помощью цикла и обращаться можно ко всем доступным свойствам полученного компонента.
Успехов!
Ответ отправил: 6a3uJI (8-й класс)
Ответ отправлен: 25.03.2011, 10:22
Номер ответа: 266394 Беларусь, Могилёвская обл. ICQ # 428577974
Оценка ответа: 5 Комментарий к оценке: тот пример который вы мне приводите я уже видел.. http://www.kansoftware.ru/?tid=1763 . меня в данном вопросе интересует следующее: обязательно ли передавать Comp1 := List.Items[0] as TComponent; а потом уже работать с Comp1? или можно делать так (List.Items[0] as TComponent).Name - можно ли таким образом узнать имя компонента?
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 266394
на номер 1151 (Россия) |
Еще номера »
Отвечает sir Henry (Старший модератор) :
Здравствуйте, Посетитель - 367345!
Действительно, TComponentList является списком, аналогом динамического массива, в котором могут хранится объекты класса TComponent или наследники этого класса. Для примера, все визуальные компоненты (типа TButton, TCheckBox и т. п.) являются наследниками TСomponent. В каких случаях можно использовать этот компонент? Представим такую ситуацию: Вы создали некую форму с кнопками (TButton), причём количество кнопок у Вас зависит от неких внешних факторов и может
от случая к случаю быть разным. Как поступить? Если мы знаем, какое количество кнопок у нас должно быть максимум, то можно в процессе разработки формы поместить весь этот максимум кнопок на форму и лишние просто делать невидимыми. А если мы этот максимум не знаем? Тогда придётся заводить динамический массив и в процессе работы программы переопределять его размер и в ячейки массива заносить кнопки. Неудобно? Вне всякого сомнения. Много лишних действий. Компонент TCompo
nentList как раз от таких лишних действий нас избавляет, предоставляя удобные формы добавления, удаления и просмотра компонентов. Добавление компонентов осуществляется с помощью метода Add():
Код:
Var cl: TComponentList; ...
Begin ... For i:=0 To КоличествоКомпонентов-1 Do Begin cl.Add(TButton.Create(Form1)); cl[cl.Count-1].Owner:=Form1; TButton(cl[cl.Count-1]).Top:=...; TButton(cl[cl.Count-1].Left):=...; ... End; End;
Как можно обращиться к определённому компоненту? Точно так же, как к элементу массива - по его индексу. TButton(cl[ИндексКомпонента]).Свойст
во:=...; При этом упрощается поиск значения в одном из компонентов:
Код:
For i:=0 To cl.Count-1 Do If Pos('ИскомоеЗначение', TButton(cl[i]).Caption)>0 Then //Компонент, содержащий искомое
значение, найден Else //Компонент не найден;
Как удалить компонент из списка? С помощью метода Remove():
Код:
cl.Remove(cl[i]);
<
br />где i - это индекс компонента найденый, например, с помощью предыдущего метода. При этом, если свойство ComponentList.OwnsObjects = True, то компонент удаляется не только из списка, но и из памяти и больше не существует. Кроме Remove(), усть ещё и метод Extract():
Код:
cl.Extract(cl[i]);
При этом компонент просто удаляется из списка, но остаётся в памяти. Учтите, если компонент создавался с помощью метода из примера 1 и не имеет собственного имени, то доступ к нему теряется и он просто занимает память, но делать с ним ничего уже нельзя. Поэтому будьте внимательны. Кроме обращения к конкретному компоненту по его индексу, можно непосредственно взять пер
вый или последний компонент списка с помощью методов First или Last. Если у каждого компонента в списке есть собственное имя, то его
индекс можно узнать с помощью метода IndexOf(ИмяКомпонента). Удаляется список из памяти с помощью стандартного метода Free(). При этом, если свойство ComponentList.OwnsObjects = True, то из памяти также удаляются и все содержащиеся в списке компоненты.
----- Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Ответ отправил: sir Henry (Старший модератор)
Ответ отправлен: 25.03.2011, 10:56
Номер ответа: 266396 Россия, Красноярск
Оценка ответа: 5 Комментарий к оценке: благодарю Вас, sir Henry, за исчерпывающий ответ... Вы как всегда как всегда достаточно полно излагаете суть проблемы.. (и у меня закрадываются смутные сомнения что вы работаете преподавателем -D). но меня ещё интересует вот что: чем отличается TButton(cl[i]) от (cl[i] as TButton)? И ещё из первого ответа: если я сделаю так Comp1 := List.Items[0] as TComponent
то я получается работаю непосредственно с компонентом который находиться в List.Items[0] и с его свойствами и методами через Comp1? или мне все таки придется заново перезаписывать в List.Items[0] компонент Comp1?
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 266396
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.