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

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

Help! [D6]


Seldon ©   (2002-08-27 22:14:00) 

Такая проблема:
у меня есть панелька (TPanel), а на ней куча всяких копонентов. И есть CheckBox. Мне надо при установке флажка у всех копонетов на панельке установить Enabled в true, а при снятии флажка в false. Мне в лом писать для каждого компонента Enabled:=true (или false) и я написал такую вот штуку:

procedure SetControlsState(Enabled:Boolean);
var
a:Integer;
begin
for a:=0 to Form1.Panel1.ComponentCount-1 do
(Form1.Panel1.Components[a] as TControl).Enabled:=Enabled;
end;

Но этот код не работает. Form1.Panel1.ComponentCount всегда равно 0. Тогда я изменил код вот так:

procedure SetControlsState(Enabled:Boolean);
var
a:Integer;
begin
for a:=0 to Form1.ComponentCount-1 do
if (Form1.Components[a] as TControl).Owner=Form1.Panel1 then
(Form1.Components[a] as TControl).Enabled:=Enabled;
end;

Но этот код вообще вызывает исключение EInvalidCast. Как мне быть?


aus   (2002-08-28 00:44:00) [1]

Я вот так сделал, и все работает:
procedure TForm1.SetControlsState(Enabled:Boolean);
var
a:Integer;
begin
with Panel1 do
for a:=0 to ControlCount-1 do
Controls[a].Enabled:=Enabled;
end;


Seldon   (2002-08-27 22:38:00) [2]


> Ученик ©

И это тоже попробую. Спасибо!


Seldon   (2002-08-27 22:35:00) [3]


> MsGuns ©

Вы имеете ввиду сравнивать экранные координаты панели и каждого копонента, и если компонент находится внутри панели то изменять его сотояние? Действительно заборно. Но если не будет других предложений, я попробую. Спасибо!


Ученик   (2002-08-27 22:34:00) [4]

Пользуюсь этим:
type
TProtectedWinControl = class(TWinControl);

procedure EnableControls(Control : TWinControl; Enable : Boolean;
ChangeColor : Boolean = True);
const
Colors : array[Boolean] of TColor = (clBtnFace, clWindow);
var
i : Integer;
NewColor : TColor;
begin
if Control.Tag <> 99999 then begin
Control.Enabled := Enable;
if ChangeColor and (Control is TCustomEdit) or (Control is TCustomComboBox) or
(Control is TCustomListBox) then begin
if Enable then
NewColor := clWindow
else if Control.Parent <> nil then
NewColor := TProtectedWinControl(Control.Parent).Color
else
NewColor := clBtnFace;
TProtectedWinControl(Control).Color := NewColor
end
end;
with Control do
for i := 0 to ControlCount - 1 do
if Controls[i] is TWinControl then
EnableControls(TWinControl(Controls[i]), Enable, ChangeColor)
else if Control.Tag <> 99999 then
Controls[i].Enabled := Enable
end;


MsGuns   (2002-08-27 22:27:00) [5]

Не, ну тогда вперед ! В вышеприведенном цикле опрашивать координаты компонента и сравнивать их с координатами панели. Заборно ? Зато красяво !


Seldon   (2002-08-27 22:20:00) [6]


> MsGuns ©

В этом случае копоненты отключатся. Но их вид не поеняется на отключенный.


MsGuns   (2002-08-27 22:17:00) [7]

А почему всей панели не дать Enabled := false ?


Наверх

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