|
Вопрос # 3 159/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Затруднился выбрать раздел куда написать, решился сюда.
Пишу Эквалайзер, 16 ти полосный. Код для активации его не большой, строчек 10. Управляется эквалайзер TrackBar'ми. 16 штук на форме, которые выполняют все идентичный код, с разницей в 1 цифру. Я сторонник оптимизированного и красивого кода... можно как то это оптимизировать ? а то получается вот так (код ниже), а если написать код только для TrackBar1, код которого будет узнавать каким TrackBar'ом было обращение к коду, и в зависимости от номера TrackBar'а менять там меняемую цифру... не очень понятно - гляньте код, все поймете...
За раннее спасибо за ответы :) Если будут...
Приложение: Переключить в обычный режим-
-
-
- procedure TMain.ScrollBar1Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[1], @p);
- p.fgain := 15-ScrollBar1.position;
- BASS_FXSetParameters(fx[1], @p);
- end;
-
- procedure TMain.ScrollBar2Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[2], @p);
- p.fgain := 15-ScrollBar2.position;
- BASS_FXSetParameters(fx[2], @p);
- end;
-
- procedure TMain.ScrollBar3Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[3], @p);
- p.fgain := 15-ScrollBar3.position;
- BASS_FXSetParameters(fx[3], @p);
- end;
-
- procedure TMain.ScrollBar4Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[4], @p);
- p.fgain := 15-ScrollBar4.position;
- BASS_FXSetParameters(fx[4], @p);
- end;
-
- procedure TMain.ScrollBar5Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[5], @p);
- p.fgain := 15-ScrollBar5.position;
- BASS_FXSetParameters(fx[5], @p);
- end;
-
- procedure TMain.ScrollBar6Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[6], @p);
- p.fgain := 15-ScrollBar6.position;
- BASS_FXSetParameters(fx[6], @p);
- end;
-
- procedure TMain.ScrollBar7Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[7], @p);
- p.fgain := 15-ScrollBar7.position;
- BASS_FXSetParameters(fx[7], @p);
- end;
-
- procedure TMain.ScrollBar8Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[8], @p);
- p.fgain := 15-ScrollBar8.position;
- BASS_FXSetParameters(fx[8], @p);
- end;
-
- procedure TMain.ScrollBar9Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[9], @p);
- p.fgain := 15-ScrollBar9.position;
- BASS_FXSetParameters(fx[9], @p);
- end;
-
- procedure TMain.ScrollBar10Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[10], @p);
- p.fgain := 15-ScrollBar10.position;
- BASS_FXSetParameters(fx[10], @p);
- end;
-
- procedure TMain.ScrollBar11Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[11], @p);
- p.fgain := 15-ScrollBar11.position;
- BASS_FXSetParameters(fx[11], @p);
- end;
-
- procedure TMain.ScrollBar12Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[12], @p);
- p.fgain := 15-ScrollBar12.position;
- BASS_FXSetParameters(fx[12], @p);
- end;
-
- procedure TMain.ScrollBar13Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[13], @p);
- p.fgain := 15-ScrollBar13.position;
- BASS_FXSetParameters(fx[13], @p);
- end;
-
- procedure TMain.ScrollBar14Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[14], @p);
- p.fgain := 15-ScrollBar14.position;
- BASS_FXSetParameters(fx[14], @p);
- end;
-
- procedure TMain.ScrollBar15Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[15], @p);
- p.fgain := 15-ScrollBar15.position;
- BASS_FXSetParameters(fx[15], @p);
- end;
-
- procedure TMain.ScrollBar16Change(Sender: TObject);
- begin
- BASS_FXGetParameters(fx[16], @p);
- p.fgain := 15-ScrollBar16.position;
- BASS_FXSetParameters(fx[16], @p);
- end;
-
-
-
-
- procedure TMain.ScrollBar1Change(Sender: TObject);
-
- begin
- BASS_FXGetParameters(fx[i], @p);
- p.fgain := 15-ScrollBari.position;
- BASS_FXSetParameters(fx[i], @p);
- end;
 |
Вопрос задал: BloodVIRUS (статус: Посетитель)
Вопрос отправлен: 6 сентября 2009, 20:43
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: min@y™
Жуть какая!
Для всех скролллбаров нужен всего один обработчик события. Заметь, удобно оперировать свойством Tag. Очень удобно. В обработчик передаётся параметр Sender: TObject, который всегда можно привести к нужному типу. пишешшь типа вот такую конструкцию:
case TComponent(Sender).Tag of
0: ; // Делаем одно
1: ; // Делаем другое и т.д.
// другие реакции
end; // case
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 6 сентября 2009, 22:17
|
Ответ #2. Отвечает эксперт: Вадим К
Здравствуйте, BloodVIRUS!
Выше предложено решение, но явно написанное на бум.
Да, следует использовать свойство Tag, но как... присмотримся к всем обработчикам. видно, что они отличаются только в одном коэффициенте. а во всем остальном идентичны.
Поэтому делаем так. Каждому трекбару в свойство tag записываем этот коефициент. для первого трекбара пишем такой обработчик
procedure TMain.ScrollBar1Change(Sender: TObject);
var i:integer;
begin
i := TScrollBar(Sender).Tag;
if (i < 0) or (i > 15) then exit;//защитный механизм!
BASS_FXGetParameters(fx[i], @p);
p.fgain := 15-TScrollBar(Sender).position;
BASS_FXSetParameters(fx[i], @p);
end;
Теперь надо только "размножить". выделяем мышкой все остальные трекбары (или скроллбары, не важно что там) и идем в инспектор объектов, вкладка Events и находим там обработчик OnChange. И не кликаем дважды, как обычно, а один раз. Справа появляется кнопка с треугольником - жмем. и в списке процедур выбираем вышедобавленную ScrollBar1Change. И всё...
Почему так происходит? во первых делфи позволяет один и тот же обработчик привязывать к разным компонентам. сопостовление не идет по имени, как могло показаться, а по тому, что записано в инспекторе объектов. Главное, что бы сигнатура совпадала (количество, тип и порядок параметров).
Во вторых, в процедуру передается параметр sender, который содержит в себе ссылку на объект, который стал причиной вызова обработчика. Мы лишь преобразовываем его к нужному нам типу.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 6 сентября 2009, 22:48
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 6 сентября 2009, 23:48; участников в обсуждении: 1.
|
BloodVIRUS (статус: Посетитель), 6 сентября 2009, 23:48 [#1]:
Во точно ! Спасибо вам огромное ! Я Это все знал(Теорию) но не знал как на практике это использовать
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|