Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1438148217
Alex_C
2015-07-29 08:36
2017.04.02
Как правильно "убить" зависший Thread


2-1437652682
Ринсвинд
2015-07-23 14:58
2017.04.02
Запросы не поделили Buffer I/O


3-1313067737
amamed_3071
2011-08-11 17:02
2017.04.02
Upgate SQL 2005 Expression to SQL 2005 Enterprice


4-1281349091
PavDimka
2010-08-09 14:18
2017.04.02
Глюк с QueryPerformanceFrequency


2-1438149724
Abcdef123
2015-07-29 09:02
2017.04.02
Компиляция кода D2007 в XE8.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский