![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменения свойства Enabled у разных компонентов одним махом? [D7, WinXP]
Mazer © (2004-11-25 23:33:00)Приветствую, уважаемые!
вопрос у меня такой:
есть скажем кнопочки, пункты меню, чекбоксы всякие...
и вот нужно бы поменять скажем свойство Enabled у нескольких из них на false, а потом обратно...
писать по десятку строк не хочется...
можно конечно использовать FindComponent в цикле, я так и делаю иногда, когда компонентов много и они одного типа...
а что тут посоветуете?
есть ли простое, элегантное решение?
Mazer (2004-11-26 00:29:00) [1]Игорь Шевченко
спасибо! попробую!!!
АП (2004-11-26 00:28:00) [2]мне здесь на похожий вопрос так ответили, если я не путаю
АП (09.10.04 23:13)
У меня на форме есть, к примеру 8 CheckBox и 8 Memo, как работать с ними как с масивом, или чем-то подобным, например я хочу их разом невидимыми сделать, или часть CheckBox отключить, например,4. Каждый разписать CheckBox1.enabled:=false... не хочется. В книжках пытался порыться, за 15 минут почти ни чего не нашол, Скорей всего это что-то просте, кто знает, ответте.
--------------------------------------------------------------------------------
Defunct © (09.10.04 23:16) [1]
Да это проблема..
хотите совет, чем больше думаете над красотой кода, тем выше вероятность, что программа либо не будет написана, либо будет уже никому не нужна.
--------------------------------------------------------------------------------
Defunct © (09.10.04 23:19) [2]
> за 15 минут почти ни чего не нашол
за 15 минут можно было написать все необходимые комбинации залочивания CheckBox'ов
Procedure Lock4;
Begin
CheckBox1.Enabled := False;
CheckBox2.Enabled := False;
CheckBox3.Enabled := False;
CheckBox4.Enabled := False;
End;
и т.д.
--------------------------------------------------------------------------------
АП (09.10.04 23:25) [3]
Для Memo я извернулся. как-то, методом тыка..., но всё равно, что-то не то. Хотелось бы узнать, какому элементу массва какая фигня соответствует
for i:= 5 to 4+kotv[k] do
begin
(controls[i] as TMemo).visible:=true;
with (controls[i] as TMemo) do begin
SelStart:=0;
SelLength:=200;
SelText:=ms[k,i-5];
end;
--------------------------------------------------------------------------------
GuAV © (09.10.04 23:27) [4]
как вариант...
procedure EnableControls(const C: array of TControl; Value: Boolean);
var I: Integer;
begin
for I:=Low(C) to High(C) do
C.Enabled:=Value;
end;
...
EnableControls(CheckBox2, CheckBox4);
--------------------------------------------------------------------------------
GuAV © (09.10.04 23:29) [5]
FindChildControl(CheckBox+IntToStr(I)) as TCheckBox
*********
if controls[i] is TCheckBox
with TCheckBox(controls[i]) do
if Name=CheckBox1
--------------------------------------------------------------------------------
olookin © (09.10.04 23:30) [6]
А не проще проверять через Controls наличие объекта заданного типа и делать с ним все?
Игорь Шевченко (2004-11-26 00:27:00) [3]
> есть ли простое, элегантное решение?
Не знаю, как насчет элегантности, но на скорую руку получилось такое решение:
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Edit1: TEdit;
CheckBox1: TCheckBox;
Button1: TButton;
File1: TMenuItem;
Exit1: TMenuItem;
Button2: TButton;
miTest: TMenuItem;
Button3: TButton;
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure ChangeEnabledState (const ComponentNames: array of string;
Value: Boolean);
end;
var
Form1: TForm1;
implementation
uses
TypInfo;
{$R *.dfm}
procedure TForm1.ChangeEnabledState(const ComponentNames: array of string;
Value: Boolean);
const
EnableNames: array[Boolean] of string = ('False', 'True');
var
AComponent: TComponent;
I: Integer;
begin
for I:=Low(ComponentNames) to High(ComponentNames) do begin
AComponent := FindComponent(ComponentNames[I]);
if Assigned(AComponent) and IsPublishedProp(AComponent, 'Enabled') then
SetEnumProp(AComponent, 'Enabled', EnableNames[Value]);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ChangeEnabledState(['CheckBox1','Button1', 'miTest'], false);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ChangeEnabledState(['CheckBox1','Button1', 'miTest'], true);
end;
Mazer (2004-11-26 00:27:00) [4]в принципе такими "ухищрениями" пользовался :)
но все равно, спасибо за советы!
OneFragLeft (2004-11-26 00:07:00) [5]Можно воспользоваться свойством Tag компонентов. В него записывать имя группы компонентов и потом перебирать все компоненты. Если значение поля Tag равно имени нужной группы, то Enabled делать false. Так должно быть удобно.
jack128 (2004-11-26 00:04:00) [6]Mazer (25.11.04 23:33)
писать по десятку строк не хочется...
Один раз написал процедуру и пользуйся. Ну или использовать ActionList..
Mazer (2004-11-26 00:01:00) [7]не позволяет, к сожалению...
OneFragLeft (2004-11-25 23:40:00) [8]Если позволяет интерфейс программы, то можно все компоненты кинуть на TPanelили другой контейнер. А у него уже Enabled делать false