Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.058 c
2-1266751523
Fr
2010-02-21 14:25
2010.08.27
TRichEdit, вставка текста


15-1266830326
Денис_
2010-02-22 12:18
2010.08.27
Подскажите книгу


15-1266960610
Юрий
2010-02-24 00:30
2010.08.27
С днем рождения ! 24 февраля 2010 среда


4-1234959125
kniazi
2009-02-18 15:12
2010.08.27
Языковые файлы


4-1232578760
istok2
2009-01-22 01:59
2010.08.27
windows deffender и WriteProcessMemory





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский