procedure ButtonHandler(Sender: TObject);
begin
case (Sender as TButton).Tag of
0: Action0;
1: Action1;
...
N: ActionN;
end;
end;
Оптимизация кода
Есть код:
procedure ButtonHandler(Dender:TObject);
begin
if Sender=Button1 then Action1;
if Sender=Button2 then Action2;
...
if Sender=ButtonN then ActionN;
end;
Как его можно оптимизировать через case?!
Помогите пожалуйста.
Цитата: evil_rabbit
Здравствуйте. У меня возникла такая проблема:
Есть код:
procedure ButtonHandler(Dender:TObject);
begin
if Sender=Button1 then Action1;
if Sender=Button2 then Action2;
...
if Sender=ButtonN then ActionN;
end;
Как его можно оптимизировать через case?!
Помогите пожалуйста.
Есть код:
procedure ButtonHandler(Dender:TObject);
begin
if Sender=Button1 then Action1;
if Sender=Button2 then Action2;
...
if Sender=ButtonN then ActionN;
end;
Как его можно оптимизировать через case?!
Помогите пожалуйста.
Если я не ошибаюсь, в Delphi оператор case принимает только ordinal значения, к коим TObject не относится. Поправьте, если я не прав.
Код:
Код:
f Sender=Button1 then Action1 else
if Sender=Button2 then Action2 else
...
if Sender=ButtonN then ActionN;
if Sender=Button2 then Action2 else
...
if Sender=ButtonN then ActionN;
либо (не слишком оптимизированно но быстро в написании)
Код:
var nStr : string;
act : TAction;
begin
nStr := TComponent(Sender).Name;//Получаем имя кнопки
Delete(nStr, 1, 6);//в случае если у тебя Button### - удаляем первые 6 символов
act := TAction(FindComponent('Action' + nStr));//находим компонет Action###
if act <> nil then act.Execute; //Если Act существует то выполняем его
end;
act : TAction;
begin
nStr := TComponent(Sender).Name;//Получаем имя кнопки
Delete(nStr, 1, 6);//в случае если у тебя Button### - удаляем первые 6 символов
act := TAction(FindComponent('Action' + nStr));//находим компонет Action###
if act <> nil then act.Execute; //Если Act существует то выполняем его
end;
Огромное спасибо, вы мне очень помогли. :)
Вообще надо при создании баттона ему экшн назначить! :)
Да, блин, речь то скорее всего не об TAction, просто ActionN - какая либо процедура/функция, которую надо вызывать при нажатии соответствующей кнопки :)
Именно, makbeth, просто я написал маленькую программку, для упрощения навигации у себя на диске, и чтобы не перегружать код процедурами (т.к. у меня много объектов) решил использовать подобную схему.
Гы, если TAction использовать, код еще на одну процедуру сократится - отпадет потребность в ButtonHandler..
Цитата: Phodopus
Ясно. Просто увидел мельком 0nni .Execute написал "и тут Остапа понесло" :)
Гы, если TAction использовать, код еще на одну процедуру сократится - отпадет потребность в ButtonHandler..
Гы, если TAction использовать, код еще на одну процедуру сократится - отпадет потребность в ButtonHandler..
Да я вначале написал , а потом подумал :)
Цитата: Phodopus
Ясно. Просто увидел мельком 0nni .Execute написал "и тут Остапа понесло" :)
Гы, если TAction использовать, код еще на одну процедуру сократится - отпадет потребность в ButtonHandler..
Гы, если TAction использовать, код еще на одну процедуру сократится - отпадет потребность в ButtonHandler..
Зато появится потребность в ActionExecuteHandler :D
Код:
select case TButton(Sender).Handle
case Button1.handle:Action1;
case Button2.handle:Action2;
case Button3.handle:Action3;
...
end select
case Button1.handle:Action1;
case Button2.handle:Action2;
case Button3.handle:Action3;
...
end select
Цитата: makbeth
Зато появится потребность в ActionExecuteHandler :D
Ну так Action1Execute() .. ActionNExecute() и заменят собой Action1() .. ActionN() а вызываться по нажатию кнопы они будут внутренним механизмом дельфей
Цитата: Phodopus
Ну так Action1Execute() .. ActionNExecute() и заменят собой Action1() .. ActionN() а вызываться по нажатию кнопы они будут внутренним механизмом дельфей
Ну дык, по логике и Button1Click() .. ButtonNClick() также могут заменить Action1 .. ActionN ;)
PS: Ну все, пофлеймили, и хватит. Пусть автор сам решает :)
Огромное спасибо всем, кто принял участие в решении данной проблемы.