Форум: "Основная";
Текущий архив: 2017.04.02;
Скачать: [xml.tar.bz2];
ВнизОбход компонентов на форме... Найти похожие ветки
← →
Чайник © (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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.001 c