Форум: "Основная";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c