Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обход компонентов на форме...


Чайник ©   (2012-10-15 17:27:00) 

проблема - на форме набросано несколько десятков TDBEdit-ов.
Требуется их всех скопом переводить то в ReadOnly, то обратно.
Сделал так:


procedure ChangeReadOnly(Owner : TWinControl; Value: Boolean);
var I : Integer;
begin
  for I := 0 to Owner.ControlCount - 1 do begin
      if UpperCase(Owner.Controls[i].ClassName)='TDBEDIT' then
         (Owner.Controls[i] as TDBEdit).ReadOnly := Value
  end;
end;


Но! Они сгруппированы по всяким вкладкам типа TabSheet, TgroupBox и пр.  Соответственно Owner-ы у всех разные, соответственно приходится вызывать процедуру для каждого TabSheet.
Попробовал закрутить рекурсию:


procedure ChangeReadOnly(Owner : TWinControl; Value: Boolean);
var I : Integer;
begin
  for I := 0 to Owner.ControlCount - 1 do begin
      if (Owner.Controls[i] as TWinControl).ControlCount>0 then ChangeReadOnly((Owner.Controls[i] as TWinControl), Value);
      if UpperCase(Owner.Controls[i].ClassName)='TDBEDIT' then
         (Owner.Controls[i] as TDBEdit).ReadOnly := Value
  end;
end;

Но! Среди прочих попадаются всякие Label-ы, которые не от TWinControl, свойства ControlCount не имеют, и программа, как и полагается, вываливается с сообщением "invalid class type cast".
Вопрос: можно ли узнать, является ли контрол производным от TWinControl-а и как это сделать?
Или я вообще не то делаю?


Чайник   (2012-10-16 15:29:00) [1]


> Dimka Maslov ©   (15.10.12 21:37) [4]
> Есть свойство Controls, а есть Components. Если перебирать
> через Components, все компоненты, кинутые на форму будут
> сгруппированы там, независимо от того, какой Control является
> его Родителем (Parent). Сама же форма будет являться для
> них Владельцем (Owner).


Спасибо!
Вот теперь все стало на свои места:

procedure ChangeReadOnly(Owner : TWinControl; Value: Boolean);
var I : Integer;
begin
  for I := 0 to Owner.ComponentCount - 1 do
      if Owner.Components[i] is TDbEdit then
         (Owner.Components[i] as TDBEdit).ReadOnly := Value
end;


...я теперь вдвое больше щастливей стану! (с)Кот Матроскин


Dimka Maslov   (2012-10-15 21:37:00) [2]

Есть свойство Controls, а есть Components. Если перебирать через Components, все компоненты, кинутые на форму будут сгруппированы там, независимо от того, какой Control является его Родителем (Parent). Сама же форма будет являться для них Владельцем (Owner).


Dmitriy   (2012-10-15 17:55:00) [3]

:)
как понимаешь,
if UpperCase(Owner.Controls[i].ClassName)='TDBEDIT' then

можно тоже заменить на

if Owner.Controls[i] is TDbEdit then


Чайник   (2012-10-15 17:53:00) [4]

Оооо! Вот оно щастя!
Спасибо!


Dmitriy   (2012-10-15 17:44:00) [5]


> Вопрос: можно ли узнать, является ли контрол производным
> от TWinControl-а и как это сделать?


if Сontrol is TWinControl then OutputDebugString('Щасте');


Наверх

Титульная страница Поиск, карта сайта Написать письмо