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

Вниз

Упрощение процедур   Найти похожие ветки 

 
allrussia   (2010-03-05 03:47) [0]

Не подскажете как можно упростить следующее:

procedure TForm1.CheckBox19Click(Sender: TObject);
begin
 if CheckBox19.Checked then
 begin
   SpinEdit9.Enabled:=true;
   SpinEdit9.SetFocus;
 end else
 SpinEdit9.Enabled:=false;
end;


в программе сотни таких блоков хочется одну единственную процедуру и одно единственное событие onclick для всех checkbox.

т.е. мне нужно что то типа

procedure CheckBoxClick;
var i,j: integer;
begin
 i:=ValidateCheckBox;//узнаем номер чекбокса по которому совершен клик
 case i of
 19: j:=45;
 20: j:=23  // узнаем какой спин-эдит соответствует чекбоксу
 ...
 end;  
 if CheckBox[i].Checked then
 begin
 
   SpinEdit[j].Enabled:=true;
   SpinEdit[j].SetFocus;
 end else
 SpinEdit[j].Enabled:=false;
end;


и все - выделить все чекбоксы разом и назначить эту процеруду им всем

т.е.

1. Как определить номер нажатого чекбокса по событию OnClick
2. Как работать с присвоением индекса контролу SpinEdit[j]?


 
sniknik ©   (2010-03-05 07:55) [1]

> т.е. мне нужно что то типа
если только типа, то не привязывайся к "номеру", или имени, "вяжись" на Sender это есть сам объект CheckBox-а (в основном, если не ручной вызов с "кривым" сендером).
а адрес SpinEdit-а можно ему в таг разово прописать, при создании... и отпадет необходимость в разных массивах/поисках/определениях номеров/индексов  и т.д.  

p.s. сотни блоков это как-то через чур, может объединить в один объект? либо на крайняк фрейм. тогда и таги прописывать не надо будет, смотришь парента (подложку обоих) и от него смотришь SpinEdit-а.


 
KilkennyCat ©   (2010-03-05 10:17) [2]

добавлю еще немного оптимизации:


> if CheckBox19.Checked then
>  begin
>    SpinEdit9.Enabled:=true;
>    SpinEdit9.SetFocus;
>  end else
>  SpinEdit9.Enabled:=false;



if CheckBox19.Checked then SpinEdit9.SetFocus;
SpinEdit9.Enabled:= CheckBox19.Checked;


 
KilkennyCat ©   (2010-03-05 10:19) [3]

точнее
SpinEdit9.Enabled:= CheckBox19.Checked;
if CheckBox19.Checked then SpinEdit9.SetFocus;


 
Игорь Шевченко ©   (2010-03-05 12:12) [4]

сделать фрейм и не мучиться


 
allrussia   (2010-03-05 14:43) [5]

Написал такую процедуру, присвоив всем чекбоксам и спинэдитам соответствующее значение Tag.


procedure CheckBoxClick (Sender: TObject);
 var i,k,a: integer;
begin
 with Sender as TCheckBox do k:= Tag;
 for a := 0 to ComponentCount - 1 do
 begin
   if Components[a] is TSpinEdit then
   begin
     if TSpinEdit(Components[a]).Tag = k then
     begin
       for i := 0 to ComponentCount - 1 do
       begin
         if TCheckBox(Components[i]).Tag = k then
         begin
           if TCheckBox(Components[i]).Checked = True then
           begin
             TSpinEdit(Components[a]).Enabled:=true;
             TSpinEdit(Components[a]).SetFocus;
           end else TSpinEdit(Components[a]).Enabled:=false;
      if k > 1 then Exit;
        end;
        end;
     end;
    end;
 end;
end;


Вопрос - почему, элемент с Tag=1  проверяется дважды?
Соответственно если кликать на чекбокс с tag=1 проедура работает некорректно, оставляя свойство enabled спинэдиту при выходе из чекбокса.
Приходится писать
if k > 1 then Exit. Мне кажется это неправильно.


 
allrussia   (2010-03-05 15:28) [6]

Сам нашел решение:


with Sender as TCheckBox do k:= Tag;

 for a := 0 to ComponentCount - 1 do
 begin
   if Components[a] is TCheckBox then
   begin
     if TCheckBox(Components[a]).Tag = k then
     begin
       for i := 0 to ComponentCount - 1 do
       begin
         if Components[i] is TSpinEdit then
         begin
           if TSpinEdit(Components[i]).Tag = k then
           begin
             TSpinEdit(Components[i]).Enabled:= TCheckBox(Components[a]).Checked;
             if TCheckBox(Components[a]).Checked then TSpinEdit(Components[i]).SetFocus;
             Exit;
           end;
         end;
       end;
     end;
   end;
 end;


 
Игорь Шевченко ©   (2010-03-05 16:01) [7]

allrussia   (05.03.10 15:28) [6]

Фрейм сделай


 
sniknik ©   (2010-03-05 17:16) [8]

> Сам нашел решение:
называется упростил... ;(


 
Плохиш ©   (2010-03-05 17:38) [9]


> allrussia   (05.03.10 15:28) [6]


procedure CheckBoxClick (Sender: TObject);
var
 idx, cnt: integer;
 speTmp: TSpeenEdit;
 cbTmp: TCheckBox;
begin
if Sender is TCheckBox then idx := TComponent(Sender).Tag;
speTmp := nil; cbTmp := nil;
for cnt := 0 to ComponentCount - 1 do
begin
  if Components[cnt].Tag = idx  then
  begin
     if Components[cnt] is TSpinEdit then speTmp := Components[cnt]
     else if Components[cnt] is TCheckBox then cbTmp := Components[cnt];
  end;
end;
if (speTmp <> nil) and (cbTmp <> nil) then
begin
   speTmp.Enabled := cbTmp.Checked;
   if speTmp.Enabled then speTmp.SetFocus;
end;


 
Плохиш ©   (2010-03-05 17:40) [10]

Блин, CheckBox вообще искать не надо, он передаётся. Во люди велосипеды городят...


 
Игорь Шевченко ©   (2010-03-05 17:47) [11]

Плохиш ©   (05.03.10 17:38) [9]

Страшно жить становится. Меня напрягает расставлять теги - профессиональный склероз, обязательно или забуду или перепутаю


 
sniknik ©   (2010-03-05 18:56) [12]

> Во люди велосипеды городят...
и не говори

procedure TForm1.FormCreate(Sender: TObject);
begin
 CheckBox1.Tag:= Integer(SpinEdit1);
 CheckBox2.Tag:= Integer(SpinEdit2);
end;

procedure TForm1.CheckBoxClick(Sender: TObject);
begin
with TCheckBox(Sender) do
  with TSpinEdit(Tag) do begin
    Enabled:= Checked;
    if Checked then SetFocus;
  end;
end;


а с объединением в обьект/фрейм было бы еще и проще и правильней.


 
Плохиш ©   (2010-03-06 00:26) [13]


> sniknik ©   (05.03.10 18:56) [12]
>
> > Во люди велосипеды городят...
> и не говори
>
> procedure TForm1.FormCreate(Sender: TObject);
> begin
>  CheckBox1.Tag:= Integer(SpinEdit1);
>  CheckBox2.Tag:= Integer(SpinEdit2);
> end;
>

Не я до такого не дохожу, ибо лень...


 
sniknik ©   (2010-03-06 02:09) [14]

> Не я до такого не дохожу, ибо лень...
поклонник циклов? написал бы пару присваиваний так -
procedure TForm1.FormCreate(Sender: TObject);
var
 i: integer;
begin
 for i:= 1 to 2 do
   FindComponent("CheckBox"+IntToStr(i)).Tag:= Integer(FindComponent("SpinEdit"+IntToStr(i)));
end;


а в "хитросплетениях" кода из [9] не лень разбираться?


 
sniknik ©   (2010-03-06 02:16) [15]

вообще, чем не очевиднее код, тем легче допустить в нем ошибку, особенно паршиво логическую... с которой вроде все работает, но что то чуть сменил и перестало, и не поймешь где искать.
лучше уж AV на компиляции.

в общем, я бы предпочел даже 150 явных присваиваний, одной процедуре аналогичной [9].


 
Германн ©   (2010-03-06 02:18) [16]


> а в "хитросплетениях" кода из [9] не лень разбираться?
>

В "бреде" всегда трудно разбираться, Коля.
А бред - это сабж.


 
allrussia   (2010-03-06 02:54) [17]

всем спасибо за ответы
я прояснил для себя многое и узнал новое благодаря sniknik


 
Германн ©   (2010-03-06 03:00) [18]


> и узнал новое благодаря sniknik

Не ты первый. :)


 
allrussia   (2010-03-06 03:46) [19]

одно осталось неясным?

with TCheckBox(Sender) do
 with TSpinEdit(Tag) do begin
   Enabled:= Checked;
   if Checked then SetFocus;
 end;


Если в этом коде TSpinEdit заменить например на TButton или на TEdit, то код тоже работает! Корректно ли это???

Объясните, плиз...


 
sniknik ©   (2010-03-06 10:13) [20]

Tag появляется у TControl, SetFocus у TWinControl т.что для всех их наследников можно заменить на  

with TControl(Sender) do
 with TWinControl(Tag) do begin
   Enabled:= Checked;
   if Checked then SetFocus;
 end;


если бы конечно у TControl было свойство Checked...

почему полное игнорирование советов о фреймах? бы ними бы даже начальное присваивание стало лишним. связь на этапе кидания на форму... (про свой компонент ладно уж молчу, видимо слишком сложно... /неудобно? засорять палитру самоделками)


 
allrussia   (2010-03-06 11:28) [21]

sniknik

почему полное игнорирование советов о фреймах?

я просто не знаю, что это.
почитал faq - не понял как это может помочь в моем случае.

в общем, пока не разобрался


 
Плохиш ©   (2010-03-06 11:59) [22]


> sniknik ©   (06.03.10 02:09) [14]
>
> > Не я до такого не дохожу, ибо лень...
> поклонник циклов? написал бы пару присваиваний так

:-)
В [9] я просто код из [6] переписал, но не обратил сразу внимание, что всё искать и не нужно...

PS. А в озвученной задаче достаточно 1 checkbox, 1 speenedit и 1 string-/drawgrid ;-)


 
sniknik ©   (2010-03-06 12:11) [23]

> как это может помочь в моем случае.
создаешь фрейм, кладешь на него свою пару компонент, пишешь там нужный код (прямо по именам). ну и все, дальше где нужна связка там кладешь на форму фрейм.



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

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

Наверх




Память: 0.53 MB
Время: 0.051 c
2-1270973363
@!!ex
2010-04-11 12:09
2010.08.27
Одновременная компиляции проекта в два exe.


15-1266945132
Ega23
2010-02-23 20:12
2010.08.27
С прздником, мужики!


2-1267099188
kaizer131
2010-02-25 14:59
2010.08.27
Реализация стеков и очередей


8-1204980627
DeBUGger13
2008-03-08 15:50
2010.08.27
Теги OGG и WMA.


15-1269457611
Petr V. Abramov
2010-03-24 22:06
2010.08.27
Белка и Стрелка 3D