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

Вниз

Изменения свойства Enabled у разных компонентов одним махом?   Найти похожие ветки 

 
Mazer   (2004-11-25 23:33) [0]

Приветствую, уважаемые!

вопрос у меня такой:
есть скажем кнопочки, пункты меню, чекбоксы всякие...
и вот нужно бы поменять скажем свойство Enabled у нескольких из них на false, а потом обратно...
писать по десятку строк не хочется...

можно конечно использовать FindComponent в цикле, я так и делаю иногда, когда компонентов много и они одного типа...

а что тут посоветуете?
есть ли простое, элегантное решение?


 
OneFragLeft ©   (2004-11-25 23:40) [1]

Если позволяет интерфейс программы, то можно все компоненты кинуть на TPanelили другой контейнер. А у него уже Enabled делать false


 
Mazer   (2004-11-26 00:01) [2]

не позволяет, к сожалению...


 
jack128 ©   (2004-11-26 00:04) [3]

Mazer   (25.11.04 23:33)
писать по десятку строк не хочется...

Один раз написал процедуру и пользуйся. Ну или использовать ActionList..


 
OneFragLeft ©   (2004-11-26 00:07) [4]

Можно воспользоваться свойством Tag компонентов. В него записывать имя группы компонентов и потом перебирать все компоненты. Если значение поля Tag равно имени нужной группы, то Enabled делать false. Так должно быть удобно.


 
Игорь Шевченко ©   (2004-11-26 00:27) [5]


> есть ли простое, элегантное решение?


Не знаю, как насчет элегантности, но на скорую руку получилось такое решение:

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) [6]

в принципе такими "ухищрениями" пользовался :)

но все равно, спасибо за советы!


 
АП   (2004-11-26 00:28) [7]

мне здесь на похожий вопрос так ответили, если я не путаю

АП   (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 наличие объекта заданного типа и делать с ним все?


 
Mazer   (2004-11-26 00:29) [8]

Игорь Шевченко
спасибо! попробую!!!



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

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

Наверх




Память: 0.49 MB
Время: 0.033 c
1-1101803179
DimonNew
2004-11-30 11:26
2004.12.12
Программа в виде мастера


14-1100984088
DeMoN-777
2004-11-20 23:54
2004.12.12
У кого дома более 1-ого работающего ПК


3-1100091715
denis24
2004-11-10 16:01
2004.12.12
insert into....select


4-1098727684
Anti
2004-10-25 22:08
2004.12.12
Работа со службами


3-1100280907
SergP
2004-11-12 20:35
2004.12.12
Как работать с ADO в режиме ltBatchOptimistic?