Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.01.08;
Скачать: [xml.tar.bz2];

Вниз

Как обработать приход нескольких одинаковых 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.004 c
1-1279098114
packpaul
2010-07-14 13:01
2012.01.08
Реализация null-методов класса в Delphi


3-1269608174
mefodiy
2010-03-26 15:56
2012.01.08
MySQL запрос


15-1316162516
И. Павел
2011-09-16 12:41
2012.01.08
Переезд в Санкт-Петербург


1-1279206108
я_только_учусь
2010-07-15 19:01
2012.01.08
Как создать процесс c hardware breakpoint?


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский