Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

GroupBox и компоненты [D7, XP]


cruiser ©   (2008-09-18 19:08:00) 

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


cruiser   (2008-09-21 23:18:00) [1]

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


{RASkov}   (2008-09-21 23:13:00) [2]

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


{RASkov}   (2008-09-21 23:09:00) [3]

Вот примерно так:
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 22:31:00) [4]

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

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


cruiser   (2008-09-21 22:28:00) [5]


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

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


{RASkov}   (2008-09-21 21:57:00) [6]

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

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

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

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

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

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


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

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


cruiser   (2008-09-18 20:55:00) [8]

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


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

> 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:19:00) [10]

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


{RASkov}   (2008-09-18 20:18:00) [11]

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

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


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо