Главная страница
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.02 c
1-26937
Lamer86
2002-08-27 11:59
2002.09.09
Как запустить файл, а потом дождаться его завершения


7-27252
woland
2002-06-28 15:58
2002.09.09
Изменения время и даты создания файла.


1-26974
iq0
2002-08-29 14:21
2002.09.09
посмотр презентаций PowerPoint, или установка PowerPoint Viewer


14-27180
AlexAlex
2002-08-09 11:08
2002.09.09
Перевод разработок с Windows NT на Linux


1-27053
Denvor
2002-08-27 19:15
2002.09.09
Может ли TIMAGE спокойно обновляться без рывков?