![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Упрощение процедур [D7, 2000, XP, 2003]
allrussia © (2010-03-05 03:47:00)Не подскажете как можно упростить следующее:
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-06 12:11:00) [1]> как это может помочь в моем случае.
создаешь фрейм, кладешь на него свою пару компонент, пишешь там нужный код (прямо по именам). ну и все, дальше где нужна связка там кладешь на форму фрейм.
Плохиш (2010-03-06 11:59:00) [2]
> sniknik © (06.03.10 02:09) [14]
>
> > Не я до такого не дохожу, ибо лень...
> поклонник циклов? написал бы пару присваиваний так
:-)
В [9] я просто код из [6] переписал, но не обратил сразу внимание, что всё искать и не нужно...
PS. А в озвученной задаче достаточно 1 checkbox, 1 speenedit и 1 string-/drawgrid ;-)
allrussia (2010-03-06 11:28:00) [3]sniknik
почему полное игнорирование советов о фреймах?
я просто не знаю, что это.
почитал faq - не понял как это может помочь в моем случае.
в общем, пока не разобрался
sniknik (2010-03-06 10:13:00) [4]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 03:46:00) [5]одно осталось неясным?
with TCheckBox(Sender) do
with TSpinEdit(Tag) do begin
Enabled:= Checked;
if Checked then SetFocus;
end;
Если в этом коде TSpinEditзаменить например на TButtonили на TEdit, то код тоже работает! Корректно ли это???
Объясните, плиз...
Германн (2010-03-06 03:00:00) [6]
> и узнал новое благодаря sniknik
Не ты первый. :)
allrussia (2010-03-06 02:54:00) [7]всем спасибо за ответы
я прояснил для себя многое и узнал новое благодаря sniknik
Германн (2010-03-06 02:18:00) [8]
> а в "хитросплетениях" кода из [9] не лень разбираться?
>
В "бреде" всегда трудно разбираться, Коля.
А бред - это сабж.
sniknik (2010-03-06 02:16:00) [9]вообще, чем не очевиднее код, тем легче допустить в нем ошибку, особенно паршиво логическую... с которой вроде все работает, но что то чуть сменил и перестало, и не поймешь где искать.
лучше уж AV на компиляции.
в общем, я бы предпочел даже 150 явных присваиваний, одной процедуре аналогичной [9].
sniknik (2010-03-06 02:09:00) [10]> Не я до такого не дохожу, ибо лень...
поклонник циклов? написал бы пару присваиваний так -
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] не лень разбираться?
Плохиш (2010-03-06 00:26:00) [11]
> 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-05 18:56:00) [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-05 17:47:00) [13]Плохиш © (05.03.10 17:38) [9]
Страшно жить становится. Меня напрягает расставлять теги - профессиональный склероз, обязательно или забуду или перепутаю
Плохиш (2010-03-05 17:40:00) [14]Блин, CheckBox вообще искать не надо, он передаётся. Во люди велосипеды городят...
Плохиш (2010-03-05 17:38:00) [15]
> 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;
sniknik (2010-03-05 17:16:00) [16]> Сам нашел решение:
называется упростил... ;(
Игорь Шевченко (2010-03-05 16:01:00) [17]allrussia (05.03.10 15:28) [6]
Фрейм сделай
allrussia (2010-03-05 15:28:00) [18]Сам нашел решение:
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;
allrussia (2010-03-05 14:43:00) [19]Написал такую процедуру, присвоив всем чекбоксам и спинэдитам соответствующее значение 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. Мне кажется это неправильно.
Игорь Шевченко (2010-03-05 12:12:00) [20]сделать фрейм и не мучиться