Форум: "Начинающим";
Текущий архив: 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.005 c