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

Вниз

GroupBox и компоненты   Найти похожие ветки 

 
cruiser ©   (2008-09-18 19:08) [0]

Здравствуйте. Есть вопрос по сабжу.
На компоненте GroupBox есть несколько радиобатонов и чекбоксов. Как сделать что бы по нажатию например некой кнопки стали бы неактивными компоненты на GropBox? Сейчас ипользую функцию groupbox.enabled:=false, но это не то, т.к. компоненты не "затеняются", а просто к ним нет доступа. Надо бы именно "затенять". Спасибо.


 
Правильный$Вася   (2008-09-18 19:56) [1]

пройтись в цикле по компонентам формы и посмотреть у них Parent=групбокс
при нужном - затенить


 
{RASkov} ©   (2008-09-18 20:18) [2]

> пройтись в цикле по компонентам формы и посмотреть у них
> Parent=групбокс

Да прямо по контролам этого гроупбокса и пройтись циклом....


 
скгшыук   (2008-09-18 20:18) [3]

а как пройтись по компонентам всей формы? можно подробнее?


 
cruiser ©   (2008-09-18 20:19) [4]

сорри. как сделать это?


 
Юрий Зотов ©   (2008-09-18 20:40) [5]

> cruiser ©   (18.09.08 20:19) [4]

for i := 0 to GropBox.ControlCount - 1 do
 GropBox.Controls[i].Enabled := False; // или True


 
cruiser ©   (2008-09-18 20:55) [6]

спасибо. попробую так.


 
cruiser ©   (2008-09-21 21:42) [7]

Здравствуйте! В продолжение темы. Ваш совет помог, но я столкнулся с проблемой.  Так как у меня на групбоксах все компоненты это чекбоксы, то как мне сделать, что бы при групбокс enable:=false все чекбоксы находящиеся на этом групбоксе сбрасывали свои чеки в false? И возможно ли это сделать без утомительного перечисления в процедуре каждока чекбокса отдельно?


 
{RASkov} ©   (2008-09-21 21:57) [8]

> [7] cruiser ©   (21.09.08 21:42)
> все чекбоксы находящиеся на этом групбоксе сбрасывали свои
> чеки в false?

См [5] и немного подумай)

> И возможно ли это сделать без утомительного перечисления
> в процедуре каждока чекбокса отдельно?

Сам-то как думаешь? Не смешно теперь? :)
И чем же тебя так утомляет сиё деяние?)
А вот:

> как мне сделать, что бы при групбокс enable:=false

Это нужно перекрыть метод SetEnabled, т.е. новый контрол нужно породить от TGroupBox.... Это не сложно :)


 
cruiser ©   (2008-09-21 22:28) [9]


> > [7] cruiser ©   (21.09.08 21:42)
> > все чекбоксы находящиеся на этом групбоксе сбрасывали
> свои
> > чеки в false?
>
> См [5] и немного подумай)

Думал и не раз :) Но ничего так и не смог сделать. Даже элементарно  пытался по нажатию на кнопку на форме в групбоксе чекать чекбоксы - ничего не выходит. Не могу понять как до них добраться, кроме того что бы все перечислять отдельно (в программе в нескольких группбоксах по 20-30 чеков) . Даже в цикл for to никак не могу запихать чекбоксы что бы их зачекать .


 
{RASkov} ©   (2008-09-21 22:31) [10]

> [9] cruiser ©   (21.09.08 22:28)

Сейчас пример "накидаю" :)


 
{RASkov} ©   (2008-09-21 23:09) [11]

Вот примерно так:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
 TGroupCheckBox = class(TGroupBox)
 protected
   procedure SetEnabled(Value: Boolean); override;
 public
   procedure SetEnabledChecks(const Val: Boolean);
 end;

 TForm1 = class(TForm)
   CheckBox1: TCheckBox;
   procedure CheckBox1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   Gcb: TGroupCheckBox;
   { Private declarations }
 public
   { Public declarations }
 end;

var Form1: TForm1;

implementation
{$R *.dfm}

{ TCheckBox }
procedure TGroupCheckBox.SetEnabledChecks(const Val: Boolean);
var N: Integer;
begin
 for N:=0 to ControlCount-1 do
   if Controls[N] is TCheckBox then TCheckBox(Controls[N]).Enabled:=Val;
end;

procedure TGroupCheckBox.SetEnabled(Value: Boolean);
var N: Integer;
begin
 inherited;
 SetEnabledChecks(Value);
 if not Value then begin
  for N:=0 to ControlCount-1 do
   if Controls[N] is TCheckBox then begin
    Controls[N].Tag:=ORD(TCheckBox(Controls[N]).Checked);
    TCheckBox(Controls[N]).Checked:=False;
   end;
 end else
  for N:=0 to ControlCount-1 do
   if Controls[N] is TCheckBox then
    TCheckBox(Controls[N]).Checked:=Boolean(Controls[N].Tag);
end;

//---------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var N: Integer;
begin
 Gcb:=TGroupCheckBox.Create(Self);
 CheckBox1.Checked:=True;
 with Gcb do begin
  Parent:=Self;
  Left:=50;
  Top:=50;
  Width:=120;
  Height:=170;
 end;
 for N:= 0 to 9 do
  with TCheckBox.Create(Gcb) do begin
   Parent:=Gcb;
   Left:=10;
   Top:=15*N+10;
   Caption:="Check № "+IntToStr(N);
  end;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 Gcb.Enabled:=CheckBox1.Checked;
end;

end.


 
{RASkov} ©   (2008-09-21 23:13) [12]

Может TCheckListBox лучше подойдет вместо "извращения" выше? :)


 
cruiser ©   (2008-09-21 23:18) [13]

Спасибо огромное! На счет CheckListBox - уже рассматривал этот компонент, но  не подходит по соображениям вида интерфейса программы. Спасибо еще раз большое!!!



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

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

Наверх




Память: 0.5 MB
Время: 0.017 c
2-1222098648
Igor
2008-09-22 19:50
2008.11.02
База данных MySQL в Интернете


15-1220966449
{RASkov}
2008-09-09 17:20
2008.11.02
Excel


15-1220936886
Slider007
2008-09-09 09:08
2008.11.02
С днем рождения ! 9 сентября 2008 вторник


2-1222088665
Фоофа
2008-09-22 17:04
2008.11.02
Определение включенности интернета


2-1222254838
@!!ex
2008-09-24 15:13
2008.11.02
Не получается правильно поставить Hook на нажатие клавиши...