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

Вниз

Help!   Найти похожие ветки 

 
Seldon   (2002-08-27 22:14) [0]

Такая проблема:
у меня есть панелька (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. Как мне быть?


 
MsGuns ©   (2002-08-27 22:17) [1]

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


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


> MsGuns ©

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


 
MsGuns ©   (2002-08-27 22:27) [3]

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


 
Ученик ©   (2002-08-27 22:34) [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;


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


> MsGuns ©

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


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


> Ученик ©

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


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

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



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

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

Наверх




Память: 0.48 MB
Время: 0.015 c
1-26997
Miwa
2002-08-29 19:02
2002.09.09
Как узнать название компании?


14-27161
iNew
2002-08-13 15:53
2002.09.09
Подскажите где можно почитать о защите информации,


4-27274
Dmk
2002-07-19 00:00
2002.09.09
Области пересечения


1-27020
maxim2
2002-08-30 06:41
2002.09.09
Подскажите коды клавиш PageUp PageDown стрелка вверх и вниз


3-26918
Pingo
2002-08-19 18:15
2002.09.09
Upper и русские буквы