Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Оптимизация кода

21K
27 августа 2008 года
evil_rabbit
60 / / 27.08.2008
Здравствуйте. У меня возникла такая проблема:
Есть код:
procedure ButtonHandler(Dender:TObject);
begin
if Sender=Button1 then Action1;
if Sender=Button2 then Action2;
...
if Sender=ButtonN then ActionN;
end;
Как его можно оптимизировать через case?!
Помогите пожалуйста.
288
27 августа 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: evil_rabbit
Здравствуйте. У меня возникла такая проблема:
Есть код:
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 не относится. Поправьте, если я не прав.

303
27 августа 2008 года
makbeth
1.0K / / 25.11.2004
Самое простое, что можно посоветовать в данном случае - задать у кнопок свойство Tag числами по порядку. Тогда можно сделать так:
 
Код:
procedure ButtonHandler(Sender: TObject);
begin
    case (Sender as TButton).Tag of
        0: Action0;
        1: Action1;
        ...
        N: ActionN;
    end;
end;
3.7K
27 августа 2008 года
0nni
326 / / 24.06.2008
case может принимать строки и переменные так что выражение Integer(sender) тоже нк катит, варианты либо через tag либо так
 
Код:
f Sender=Button1 then Action1 else
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;
21K
27 августа 2008 года
evil_rabbit
60 / / 27.08.2008
Огромное спасибо, вы мне очень помогли. :)
14
27 августа 2008 года
Phodopus
3.3K / / 19.06.2008
Вообще надо при создании баттона ему экшн назначить! :)
303
27 августа 2008 года
makbeth
1.0K / / 25.11.2004
Да, блин, речь то скорее всего не об TAction, просто ActionN - какая либо процедура/функция, которую надо вызывать при нажатии соответствующей кнопки :)
21K
27 августа 2008 года
evil_rabbit
60 / / 27.08.2008
Именно, makbeth, просто я написал маленькую программку, для упрощения навигации у себя на диске, и чтобы не перегружать код процедурами (т.к. у меня много объектов) решил использовать подобную схему.
14
27 августа 2008 года
Phodopus
3.3K / / 19.06.2008
Ясно. Просто увидел мельком 0nni .Execute написал "и тут Остапа понесло" :)
Гы, если TAction использовать, код еще на одну процедуру сократится - отпадет потребность в ButtonHandler..
3.7K
27 августа 2008 года
0nni
326 / / 24.06.2008
Цитата: Phodopus
Ясно. Просто увидел мельком 0nni .Execute написал "и тут Остапа понесло" :)
Гы, если TAction использовать, код еще на одну процедуру сократится - отпадет потребность в ButtonHandler..


Да я вначале написал , а потом подумал :)

303
28 августа 2008 года
makbeth
1.0K / / 25.11.2004
Цитата: Phodopus
Ясно. Просто увидел мельком 0nni .Execute написал "и тут Остапа понесло" :)
Гы, если TAction использовать, код еще на одну процедуру сократится - отпадет потребность в ButtonHandler..


Зато появится потребность в ActionExecuteHandler :D

536
28 августа 2008 года
alex-kniaz
382 / / 07.08.2008
если в kylix под lunix переносить не хочется, то можно так:
 
Код:
select case TButton(Sender).Handle
case Button1.handle:Action1;
case Button2.handle:Action2;
case Button3.handle:Action3;
...
end select
14
28 августа 2008 года
Phodopus
3.3K / / 19.06.2008
Цитата: makbeth
Зато появится потребность в ActionExecuteHandler :D



Ну так Action1Execute() .. ActionNExecute() и заменят собой Action1() .. ActionN() а вызываться по нажатию кнопы они будут внутренним механизмом дельфей

303
28 августа 2008 года
makbeth
1.0K / / 25.11.2004
Цитата: Phodopus
Ну так Action1Execute() .. ActionNExecute() и заменят собой Action1() .. ActionN() а вызываться по нажатию кнопы они будут внутренним механизмом дельфей


Ну дык, по логике и Button1Click() .. ButtonNClick() также могут заменить Action1 .. ActionN ;)

PS: Ну все, пофлеймили, и хватит. Пусть автор сам решает :)

21K
30 августа 2008 года
evil_rabbit
60 / / 27.08.2008
Огромное спасибо всем, кто принял участие в решении данной проблемы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог