Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.04.02;
Скачать: CL | DM;

Вниз

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

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

проблема - на форме набросано несколько десятков 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-а и как это сделать?
Или я вообще не то делаю?


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


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


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


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

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


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

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

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

if Owner.Controls[i] is TDbEdit then


 
Dimka Maslov ©   (2012-10-15 21:37) [4]

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


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


> 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;


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



Страницы: 1 вся ветка

Текущий архив: 2017.04.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.004 c
2-1438328592
Pavelnk
2015-07-31 10:43
2017.04.02
Перекинуть edit в буфер


15-1459700405
K-1000
2016-04-03 19:20
2017.04.02
Queue. Объясните, чего ему ещё надо?


2-1438182677
Pavelnk
2015-07-29 18:11
2017.04.02
Нажать Enter


2-1438148217
Alex_C
2015-07-29 08:36
2017.04.02
Как правильно "убить" зависший Thread


15-1459882239
Игорь Шевченко
2016-04-05 21:50
2017.04.02
Кто что посоветует по перехвату вызовов API ?