Форум: "Начинающим";
Текущий архив: 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.064 c