Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Plasound & image.show


Автор: SlaUr 10.10.2003, 07:13
Проблема такая:

Image1.Show
PlaySound('click1',h11,SND_Pesourse) //Проигрываем звук из ресурса
Image1.Hide


Картинка не появляется , Если убрать Image1.Hide Картинка появляется после проигрывания звука . Как это побороть?
Нужно Показывать картинку пока проигрывается звук.

Заранее спасибо.

Автор: Cashey 10.10.2003, 11:01
Только через внешнюю активацию, вот пример через таймер:
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
image1.Show;
timer1.Enabled := true;
timer1.Interval := 200;
form1.mediaplayer1.Play;
Image1.Hide;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.Show;
end;

Причем конструкция должна быть именно такая. Почему? Не вникал, видать он блокирует св-во Visible.

Автор: p0s0l 10.10.2003, 11:41
Cделай так:

Image1.Show
Image1.Refresh; // или Update
PlaySound('click1',h11,SND_Pesourse) //Проигрываем звук из ресурса
Image1.Hide

Автор: Cashey 10.10.2003, 12:05
p0s0l это было первое, что я попробовал, он тогда мегает, картинкой, на секунду и исчезает.
PS кстати, прикольно он (image) не виден, но Visible = true, смотри:
Код
begin
image1.Show;
if image1.Visible then
form1.mediaplayer1.Play;
Image1.Hide;
end;

но музыка играет.

Автор: <Spawn> 10.10.2003, 12:20
попробуй так:
Код
Image1.Show;
Application.ProcessMessages;
PlaySound('click1',h11,SND_Pesourse); //Проигрываем звук из ресурса
Image1.Hide;

Автор: Cashey 10.10.2003, 14:20
<Spawn> неужели так трудно проверить перед тем как обнародовать?

Автор: p0s0l 10.10.2003, 14:30
Странно, Cashey, что у меня с Refresh'oм или Update'ом почему-то без миганий...
Кстати, ты вместо PlaySound используешь медиаплаер...
PlaySound - синхронный, а MediaPlayer ? Никогда им не пользовался...
Щас попробую. Если он асинхронный, то тогда понятное дело, картинка мигнет на долю секунды и обратно исчезнет...

Автор: p0s0l 10.10.2003, 15:16
Ну да, так и есть - MediaPlayer асинхронный. Из-за этого у тебя картинка и исчезает сразу,Cashey...
А способ <Spawn>'а тоже рабочий. Так что, Cashey, будь внимательнее в следующий раз.
Если бы в PlaySound стоял флаг SND_ASYNC, тогда бы можно было вместо PlaySound'а использовать MediaPlayer. Или же надо дожидаться, пока проиграется звук на MediaPlayer'е, а потом уже делать Hide...

Автор: Cashey 13.10.2003, 09:21
А что за PlaySound такой? Я хелп посмотрел, но там даже не сказано в каком он модуле сидит.

Автор: Cashey 13.10.2003, 13:13
Так ладно разобрался она из модуля mmsystem. И при флаге SND_ASYNC мигает так же как MediaPlayer (и работает только через внешний рефреш), а при флаге SND_SYNC работают все три способа (согласен был не прав), но прервать выполнение звука не удается, конструкцию
Код
PlaySound(0,0, SND_PURGE);
просто не удается вызвать, так что если требуется проиграть длинную мелодию то.....

Автор: p0s0l 13.10.2003, 13:56
Длинная - недлинная, какая разница. SlaUr'у нужно проиграть ПОЛНОСТЬЮ звук, а потом уже скрыть картинку.
Цитата
PlaySound(0,0, SND_PURGE);
просто не удается вызвать, так что если требуется проиграть длинную мелодию то.....

А зачем ему останавливать звук ?
Если нужно останавливать звук, то тогда надо ставить SND_ASYNC.

А если звук длинный и неохото, чтобы из-за этого работа проги останавливалась, то можно сделать что-то типа:
Код
function MyPlay (Parameter : Pointer) : integer;
begin
 Form1.Image1.Show;
 Form1.Image1.Update; // Хотя это уже необязательно
 PlaySound('click1',h11,SND_Pesourse) //Проигрываем звук из ресурса
 Form1.Image1.Hide;
 Result := 0;
end;

А вызывать проигрывание будет так:
Код

var TID : Cardinal;
...
 BeginThread (nil, 0, @MyPlay, nil, 0, TID);


Автор: Cashey 13.10.2003, 16:13
Возможно я не правильно понял задачу, но так как ее понял я, следует, что требуется показать какой-то image (например, фото исполнителя), во время проигрывания звука (например, mp3). Только где сказано, что звук должен проигрываться обязательно полностью?. Конечно, p0s0l прав, можно поставить это дело на поток, я сам так хотел зделать, но мне показалось, что вызвать через таймер более рационально с точки зрения производительности. IMHO лучше стараться избегать потоков, там где это возможно. Но повторяю - это мое мнение и оно не обязательно справедливо.

Автор: SlaUr 14.10.2003, 09:03
Spawn:

Image1.Show;
Application.ProcessMessages;
PlaySound('click1',h11,SND_Pesourse); //Проигрываем звук из ресурса
Image1.Hide;


Спасибо,это то что нужно


p.s. А как работает Application.ProcessMessages (может еще можно где-нибудь использовать)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)