![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить, есть ли в компоненте свойство Caption ?
Layner © (2006-10-13 09:14:00)Здравствуйте! Делаю цикл по всем элементам формы. Хотелось бы отобрать те компоненты, у которых есть св-во Caption, Hint, Text... Подскажите, как это сделать легко и красиво? У меня есть вариант
var
s: string;
for j:=0 to ComponentCount-1 do
begin
if Components[j] is TMenuItem then s := s+ TMenuItem(Components[j]).Caption+#10#13;
if Components[j] is TLabel then s := s+ TLabel(Components[j]).Caption+#10#13;
.......
Но компонентов много, всех перебирать не есть хорошо :(
evvcom (2006-11-10 08:58:00) [1]> [12] Орион © (10.11.06 00:17)
Что касаемо Align, то приводить можно к TControl, там он уже в паблик. А в общем случае (для других свойств) ты скорее всего и не найдешь родителя, удовлетворяющего [12]: во всех предках в protected, и только в твоем и других ему подобных уже в published.
> [11] Ketmar © (09.11.06 15:25)
В чем гадость ты видишь? Мы не в начинающих, потому можно и более глубокие вещи объяснять.
Единственно, что еще все-таки кроме IsPublishedProp все-таки есть смысл добавить проверку
if Components[I] is TControl // или другой нужный
частично согласен
Орион (2006-11-10 00:17:00) [2]> [8] evvcom © (09.11.06 14:54)
я имел в виду первого родителя у которого это свойтсво в секции published.
:-P :)
Ketmar (2006-11-09 15:25:00) [3]>[10] evvcom(c) 9-Nov-2006, 15:10
ты зачем гадости советуешь?!
evvcom (2006-11-09 15:10:00) [4]> [9] Layner © (09.11.06 14:58)
А много и не надо. Кстати в
> [6] @!!!ex (09.11.06 13:56)
> if (Components[I] as <Какой нить контрол имеющий свойство
> Align>).Align = [alBottom, alTop, alLeft, alRight] then
2 ошибки. Про синтаксическую = [...] я сначала не хотел говорить, компилятор бы сам указал. А вот про логическую
(Components[I] as <Какой нить контрол имеющий свойство Align>) промолчать не могу. Только в случае "контрол is этот какой-нибудь" ты не получишь ошибку в рантайм, потому надо:
if <Какой нить контрол имеющий свойство Align>(Components[I]).Align in [alBottom, alTop, alLeft, alRight] then
Layner (2006-11-09 14:58:00) [5]
@!!!ex (09.11.06 13:56)
Оно понятно, <Какой нить контрол имеющий свойство Align>- их может быть много, и TMemo, TGrid, TPanel... всех перечислять тоже не хочется..
evvcom (2006-11-09 14:54:00) [6]> [7] Орион © (09.11.06 14:08)
> лучше не какой-нить, а первый родитель имеющий это свойтсво :)
у этого родителя оно наверняка в protected :)
Орион (2006-11-09 14:08:00) [7]> <Какой нить контрол имеющий свойство Align>
лучше не какой-нить, а первый родитель имеющий это свойтсво :)
@!!!ex (2006-11-09 13:56:00) [8]Ну теоретически по аналогии.
Хотя за слова не отвечаю. Компоненты - зло.
if (IsPublishedProp(Components[I], 'Align') then
if (Components[I] as <Какой нить контрол имеющий свойство Align>).Align = [alBottom, alTop, alLeft, alRight] then
...
Layner (2006-11-09 13:44:00) [9]Игорь, спасибо,
ещё вопрос возник, по похожей тематике, как найти все элементы у которые есть свойство Align, и где это свойство = [alBottom, alTop, alLeft, alRight]?
Игорь Шевченко (2006-10-13 10:33:00) [10]
> Хотелось бы отобрать те компоненты, у которых есть св-во
> Caption, Hint, Text... Подскажите, как это сделать легко
> и красиво?
uses
TypInfo;
if (IsPublishedProp(Components[I], 'Caption') then
s := s + GetStrProp(Components[I], 'Caption')+#13#10;
Layner (2006-10-13 09:31:00) [11]GetObjectProp, нашел :)
Layner (2006-10-13 09:26:00) [12]Нет, смотрятся только стандартные компоненты со свойствами Caption, Hint, Text... Никакие VisibleText не требуется..
Zeqfreed (2006-10-13 09:22:00) [13]А если я назову св-во VisibleText, то мой компонент уже не будет обработан твоим алгоритмом? Смотри в сторону RTTI.