Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.08;
Скачать: CL | DM;

Вниз

Как обработать приход нескольких одинаковых TMessage как одно?   Найти похожие ветки 

 
D_2010   (2011-07-18 12:57) [0]

Отслеживаю:
procedure MixCtrlChange(var mess : TMessage); message MM_MIXM_CONTROL_CHANGE;

procedure TSetVol.MixCtrlChange(var mess : TMessage);
begin
 // обновляем TrackBar
end;

Однако оно вызывается многократно... Не хотелось бы обновлять позицию TrackBar-а 10-20 раз. Можно как-нибудь принять десяток сообщений за одно?


 
RWolf ©   (2011-07-18 13:02) [1]

procedure TSetVol.MixCtrlChange(var mess : TMessage);
begin
 RefreshFlag:=true;
end;

procedure TSetVol.Timer1Timer(ASource: TObject); //каждые 100 мс
begin
 if RefreshFlag then begin
   RefreshFlag:=false;
   // обновляем TrackBar
 end;
end;


 
Сергей М. ©   (2011-07-18 13:04) [2]


> нескольких одинаковых


Ой ли ? Так уж и одинаковых ли ?

Само название константы MM_MIXM_CONTROL_CHANGE говорит о том что сообщение посылается при изменении состояния микшерного контрола. Зачем , спрашивается, системе плодить кучу одинаковых подряд следующих сообщений, если состояние контрола не изменилось ?


 
D_2010   (2011-07-18 13:31) [3]

>>> RWolf ©   (18.07.11 13:02)
Интересный способ! Да, без Timer-а тут никак.

>>> Сергей М. ©   (18.07.11 13:04)
Да, абсолютно! Меняешь громкость - и сразу подряд 10-25 вызовов данной процедуры. Возможно, это связано с тем - что громкость меняется в диапазоне от 0 до 255, а мишкер разбит на шкалу до 100, вот и получается - меняешь громкость на "5", а MM_MIXM_CONTROL_CHANGE приходит 12 раз (хотя, на самом деле даже больше).


 
D_2010   (2011-07-18 13:33) [4]

> мишкер -- Микшер
опечатка )))


 
Inovet ©   (2011-07-18 13:35) [5]

> [2] Сергей М. ©   (18.07.11 13:04)

Атор вроде рисовать лишний раз не хочет.

Если новая позиция не равна старой, то обновляем. Но этот ТрекБар поди и сам не тупой? Его дело позиции отслеживать и рисовать, или что там у него делается.


 
Inovet ©   (2011-07-18 13:37) [6]

> [3] D_2010   (18.07.11 13:31)
> Да, абсолютно! Меняешь громкость - и сразу подряд 10-25
> вызовов данной процедуры

Значит 10-25 раз изменилась, в чём проблема?


 
SQLEXPRESS   (2011-07-18 13:38) [7]

procedure TSetVol.MixCtrlChange(var mess : TMessage);
begin
   if
  LastMessage.W = mess.WParam
  and  LastMessage.W = mess.LParam then
  // обновляем TrackBar;

  LastMessage.W := mess.WParam;
  LastMessage.W := mess.LParam;
 
end;


 
SQLEXPRESS   (2011-07-18 13:38) [8]


> and  LastMessage.L = mess.LParam then


 
D_2010   (2011-07-18 13:39) [9]

>>> Inovet ©   (18.07.11 13:35) [5]
>>> Если новая позиция не равна старой, то обновляем.

Для этого нужно вычислить (получить) позицию (значение текущей громкости). И смысл получается? - я стараюсь избежать 10-20-кратных расчётов, а Вы говорите каждый раз сравнивать!


 
SQLEXPRESS   (2011-07-18 13:43) [10]


> D_2010   (18.07.11 13:39) [9]

завести таймер дороже чем проверить два числа

не, не так

> procedure TSetVol.MixCtrlChange(var mess : TMessage);
> begin
>    if
>   LastMessage.W = mess.WParam
>   and  LastMessage.L = mess.LParam
then
>   // обновляем TrackBar
else begin
>   LastMessage.W := mess.WParam;
>   LastMessage.L := mess.LParam;
end;
>  
> end;

присвоить 2 числа


 
D_2010   (2011-07-18 13:44) [11]

procedure TSetVol.MixCtrlChange(var mess : TMessage);
begin
if LastMessage.W = mess.WParam
 and  LastMessage.L = mess.LParam
then begin
   // обновляем TrackBar;
 LastMessage.W := mess.WParam;
 LastMessage.L := mess.LParam;
end;
end;


А LastMessage.W и LastMessage.L - это что за переменные?
array[0..1] of Integer  - ?


 
Сергей М. ©   (2011-07-18 13:46) [12]


> Для этого нужно вычислить (получить) позицию (значение текущей
> громкости)


Ты сам себе протииворечишь.
Зачем получать текущее состояние контрола, если ты уверен что оно не изменилось ?)
А если все же изменилось (а оно действительно изменилось), то без чтения состояния контрола никак не обойтись.


> мишкер разбит на шкалу до 100


это с какой радости он "разбит", да еще и "на шкалу до 100"  ?
Где это написано в документации ? Покажи ...


 
SQLEXPRESS   (2011-07-18 13:47) [13]

тьфю, т.е. наоборот :)

короче, если пришло такое же сообщение, а оно такое будет если W и L параметры = предыдущему,  то ничего не делаем.
А иначе и делаем и запоминаем новые  W и L


 
Inovet ©   (2011-07-18 13:51) [14]

> [9] D_2010   (18.07.11 13:39)
> Для этого нужно вычислить (получить) позицию (значение текущей громкости).

Позиция на экране и значение громкости вообще-то могут быть по разному связаны:  линейно, логарифмически, косинус какой-нить.

И вообще

> [5] Inovet ©   (18.07.11 13:35)
> Но этот ТрекБар поди и сам не тупой? Его дело позиции отслеживать и рисовать


 
SQLEXPRESS   (2011-07-18 13:52) [15]

мне тоже не верится, что одинаковые могут слаться сообщения
но чего гадать, надо написать да посмотреть. Если параметры равны, то такое же. Больше нечему там отличаться.


> А LastMessage.W и LastMessage.L - это что за переменные?
> array[0..1] of Integer  - ?

Ну и так можно, но лучше просто типа TMessage;


 
Inovet ©   (2011-07-18 13:52) [16]

> [12] Сергей М. ©   (18.07.11 13:46)
> это с какой радости он "разбит", да еще и "на шкалу до 100"?
> Где это написано в документации ? Покажи ...

Так на экране же 0-100% - значит на 100.:)


 
Сергей М. ©   (2011-07-18 13:53) [17]


> а оно такое будет если W и L параметры = предыдущему,  то
> ничего не делаем


W- и L-параметры сообщения НЕ дают инф-ции о состоянии контрола - они только идентифицирую контрол.


 
Inovet ©   (2011-07-18 13:55) [18]

> [15] SQLEXPRESS   (18.07.11 13:52)
> мне тоже не верится, что одинаковые могут слаться сообщения

Да зачем бы они были одинаковые. Здвинули ползунок на одно деление уровень изменился на 12, вот и пришло 12, чтобы щелчков небыло. Имхо так, надо мануал смотреть, да.


 
SQLEXPRESS   (2011-07-18 13:56) [19]


> Сергей М. ©   (18.07.11 13:53) [17]

а, да.. точно,
> _CHANGE

же там..


 
Сергей М. ©   (2011-07-18 13:56) [20]


> Так на экране же 0-100% - значит на 100


Так на заборе .. написано, а там вестимо дрова лежат)

Эеран - это не микшер, а микшер - это не экран.
Мало ли всякоразных "экранов" понаплодили)


 
D_2010   (2011-07-18 14:20) [21]

>>> SQLEXPRESS   (18.07.11 13:56) [19]
>>> а, да.. точно,  > > _CHANGE  

Значит предложение не катит? (((

>>> уровень изменился на 12, вот и пришло 12
И смысл тогда менять 12 раз на 1 позицию, вместо того, чтобы сразу сдвинуть на 12?


 
Сергей М. ©   (2011-07-18 14:25) [22]


> смысл тогда менять 12 раз на 1 позицию, вместо того, чтобы
> сразу сдвинуть на 12?


Умные программы так и делают.
А не шибко умные  - они и есть нешибко умные, что с них взять ?


 
Inovet ©   (2011-07-18 14:28) [23]

> [21] D_2010   (18.07.11 14:20)
> И смысл тогда менять 12 раз на 1 позицию, вместо того, чтобы
> сразу сдвинуть на 12?

Ты сообщения в ветке читаешь или выбираешь только понятные слова?


 
D_2010   (2011-07-18 14:37) [24]

> Inovet ©   (18.07.11 13:37) [6]
> Значит 10-25 раз изменилась, в чём проблема?


> Сергей М. ©   (18.07.11 14:25) [22]
>>> смысл тогда менять 12 раз на 1 позицию, вместо того, чтобы
>>> сразу сдвинуть на 12?
>>> Умные программы так и делают.


Inovet, это ты как-то выборочно читаешь сообщения, либо гнёшь свою линию! Предлагаешь 25 раз проверять значение громкости, хотя, вот, даже Сергей согласен с тем, что эти 25 сообщений (TMessage) нужно отработать разом!


 
Сергей М. ©   (2011-07-18 14:43) [25]


> эти 25 сообщений (TMessage) нужно отработать разом


Как это "разом", если они последовательно  поступают и каждое из них отражает изменившийся контекст контрола ? Не выдумывай, ничего подобного я не говорил.

А программу, которая вместо того чтобы в ответ на действие пользователя один раз скомандовать микшерной подсистеме "измени значение такого-то контрола на +12" командует ей 12 раз подряд "измени значение такого-то контрола на +1" - ей место в топке.


 
Anatoly Podgoretsky ©   (2011-07-18 15:04) [26]

Да какая разница сколько раз обновляться то, ведь пока движешься к следующий позиции все уже перерисуется. Разве что надо показать бурную деятельность.


 
irzyxa ©   (2011-10-03 23:11) [27]

procedure TFmMain.MMVolumeChange(var AMsg: TMessage); //MM_MIXM_CONTROL_CHANGE
begin
 //DevicesListControls:array of TMixerControl - Элементы управления дорожки микшера

 //DevicesListControlsMute:array of TMixerControl - Элементы управления дорожки микшера
 //Если это не наш микшер(не тот которым мы управляем), то ничего не делаем
 if (AMsg.LParam <> DevicesListControls[GetCurrentDevice].dwControlID)and
    (AMsg.LParam <> DevicesListControlsMute[GetCurrentDevice].dwControlID) then
   Exit;
 //Обновляем TrackBar;
end;


 
Cobalt ©   (2011-10-04 10:05) [28]

Еще один партизан :-)
Причем прячется, похоже, от себя, т.к. не знает, чего ему надо - то ли демократии, то ли севрюжины с хреном...


 
Cu   (2011-10-04 12:33) [29]

procedure TSetVol.MixCtrlChange(var mess : TMessage); message MM_MIXM_CONTROL_CHANGE;
var
 Msg: tagMsg;
begin
 // Видаляємо зайві повідомлення з черги, щоб вони нас надалі не бентежили
 while PeekMessage(Msg, Handle, MM_MIXM_CONTROL_CHANGE, MM_MIXM_CONTROL_CHANGE, PM_REMOVE) do;
 // Робимо те, що збиралися...
end;


 
icWasya ©   (2011-10-04 15:09) [30]

А если так

var
 SavMsg: TMessage;

procedure TFmMain.MMVolumeChange(var AMsg: TMessage); //MM_MIXM_CONTROL_CHANGE
begin
 VolumeTimer.Enabled:=false;
 SavMsg:=AMsg;
 VolumeTimer.Enabled:=true;
end;

procedure TFmMain.VolumeTimerOnTimer(Sender:TObject)
begin
 VolumeTimer.Enabled:=false;
 //Обновляем TrackBar;
end;



Страницы: 1 вся ветка

Текущий архив: 2012.01.08;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.006 c
2-1317480831
Mishanja
2011-10-01 18:53
2012.01.08
Выделение строки в ListView


2-1317212234
Sergey2
2011-09-28 16:17
2012.01.08
значения по осям в TDBChart


15-1316525842
БарЛог
2011-09-20 17:37
2012.01.08
Резюме улыбнуло


2-1317631902
alexdn
2011-10-03 12:51
2012.01.08
Разложить строку посимвольно


2-1317219642
Gu
2011-09-28 18:20
2012.01.08
события