Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 159

Раздел: Delphi » Прочее
/ вопрос открыт /

Приветствую, уважаемые эксперты!
Затруднился выбрать раздел куда написать, решился сюда.

Пишу Эквалайзер, 16 ти полосный. Код для активации его не большой, строчек 10. Управляется эквалайзер TrackBar'ми. 16 штук на форме, которые выполняют все идентичный код, с разницей в 1 цифру. Я сторонник оптимизированного и красивого кода... можно как то это оптимизировать ? а то получается вот так (код ниже), а если написать код только для TrackBar1, код которого будет узнавать каким TrackBar'ом было обращение к коду, и в зависимости от номера TrackBar'а менять там меняемую цифру... не очень понятно - гляньте код, все поймете...

За раннее спасибо за ответы :) Если будут...

Приложение:
  1.  
  2.  
  3.  
  4. procedure TMain.ScrollBar1Change(Sender: TObject);
  5. begin
  6. BASS_FXGetParameters(fx[1], @p);
  7. p.fgain := 15-ScrollBar1.position;
  8. BASS_FXSetParameters(fx[1], @p);
  9. end;
  10.  
  11. procedure TMain.ScrollBar2Change(Sender: TObject);
  12. begin
  13. BASS_FXGetParameters(fx[2], @p);
  14. p.fgain := 15-ScrollBar2.position;
  15. BASS_FXSetParameters(fx[2], @p);
  16. end;
  17.  
  18. procedure TMain.ScrollBar3Change(Sender: TObject);
  19. begin
  20. BASS_FXGetParameters(fx[3], @p);
  21. p.fgain := 15-ScrollBar3.position;
  22. BASS_FXSetParameters(fx[3], @p);
  23. end;
  24.  
  25. procedure TMain.ScrollBar4Change(Sender: TObject);
  26. begin
  27. BASS_FXGetParameters(fx[4], @p);
  28. p.fgain := 15-ScrollBar4.position;
  29. BASS_FXSetParameters(fx[4], @p);
  30. end;
  31.  
  32. procedure TMain.ScrollBar5Change(Sender: TObject);
  33. begin
  34. BASS_FXGetParameters(fx[5], @p);
  35. p.fgain := 15-ScrollBar5.position;
  36. BASS_FXSetParameters(fx[5], @p);
  37. end;
  38.  
  39. procedure TMain.ScrollBar6Change(Sender: TObject);
  40. begin
  41. BASS_FXGetParameters(fx[6], @p);
  42. p.fgain := 15-ScrollBar6.position;
  43. BASS_FXSetParameters(fx[6], @p);
  44. end;
  45.  
  46. procedure TMain.ScrollBar7Change(Sender: TObject);
  47. begin
  48. BASS_FXGetParameters(fx[7], @p);
  49. p.fgain := 15-ScrollBar7.position;
  50. BASS_FXSetParameters(fx[7], @p);
  51. end;
  52.  
  53. procedure TMain.ScrollBar8Change(Sender: TObject);
  54. begin
  55. BASS_FXGetParameters(fx[8], @p);
  56. p.fgain := 15-ScrollBar8.position;
  57. BASS_FXSetParameters(fx[8], @p);
  58. end;
  59.  
  60. procedure TMain.ScrollBar9Change(Sender: TObject);
  61. begin
  62. BASS_FXGetParameters(fx[9], @p);
  63. p.fgain := 15-ScrollBar9.position;
  64. BASS_FXSetParameters(fx[9], @p);
  65. end;
  66.  
  67. procedure TMain.ScrollBar10Change(Sender: TObject);
  68. begin
  69. BASS_FXGetParameters(fx[10], @p);
  70. p.fgain := 15-ScrollBar10.position;
  71. BASS_FXSetParameters(fx[10], @p);
  72. end;
  73.  
  74. procedure TMain.ScrollBar11Change(Sender: TObject);
  75. begin
  76. BASS_FXGetParameters(fx[11], @p);
  77. p.fgain := 15-ScrollBar11.position;
  78. BASS_FXSetParameters(fx[11], @p);
  79. end;
  80.  
  81. procedure TMain.ScrollBar12Change(Sender: TObject);
  82. begin
  83. BASS_FXGetParameters(fx[12], @p);
  84. p.fgain := 15-ScrollBar12.position;
  85. BASS_FXSetParameters(fx[12], @p);
  86. end;
  87.  
  88. procedure TMain.ScrollBar13Change(Sender: TObject);
  89. begin
  90. BASS_FXGetParameters(fx[13], @p);
  91. p.fgain := 15-ScrollBar13.position;
  92. BASS_FXSetParameters(fx[13], @p);
  93. end;
  94.  
  95. procedure TMain.ScrollBar14Change(Sender: TObject);
  96. begin
  97. BASS_FXGetParameters(fx[14], @p);
  98. p.fgain := 15-ScrollBar14.position;
  99. BASS_FXSetParameters(fx[14], @p);
  100. end;
  101.  
  102. procedure TMain.ScrollBar15Change(Sender: TObject);
  103. begin
  104. BASS_FXGetParameters(fx[15], @p);
  105. p.fgain := 15-ScrollBar15.position;
  106. BASS_FXSetParameters(fx[15], @p);
  107. end;
  108.  
  109. procedure TMain.ScrollBar16Change(Sender: TObject);
  110. begin
  111. BASS_FXGetParameters(fx[16], @p);
  112. p.fgain := 15-ScrollBar16.position;
  113. BASS_FXSetParameters(fx[16], @p);
  114. end;
  115.  
  116.  
  117.  
  118.  
  119. procedure TMain.ScrollBar1Change(Sender: TObject);
  120.  
  121. begin
  122. BASS_FXGetParameters(fx[i], @p);
  123. p.fgain := 15-ScrollBari.position;
  124. BASS_FXSetParameters(fx[i], @p);
  125. end;


BloodVIRUS Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

BloodVIRUS (статус: Посетитель), 6 сентября 2009, 23:48 [#1]:

Во точно ! Спасибо вам огромное ! Я Это все знал(Теорию) но не знал как на практике это использовать :)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:52
Выполнено за 0.03 сек.