У меня возник такой вопрос (по причине того, что с событиями никогда не работал), как мне создать событие под следующее описание:
1) Из списка (а именно из DataGriView, по событию CellClick) выбирается музыкальный файл. В списке множество музыкальных файлов. На основе выбранного музыкального файла строится список музыкальных файлов, которые находятся ниже выбранного, строится список до тех пор, пока не достигнут конец списка;
После этой операции у нас есть список музыкальных файлов, обозначим его remainTracksList, которые стоят в очереди на проигрывание.
2) После того, как выбранный музыкальный файл проиграется до конца, нам нужно проиграть из remainTracksList следующий файл и так до конца этого списка.
Событие должно оповещать, что текущий трэк завершил проигрывание и ставить на проигрыш следующий трэк из remainTracksList.
Ну так чтобы мы нажали в таблице на один из трэков, слушаем до тех пор пока не проиграется последний трэк из remainTracksList.
Собственно осталось реализовать только событие, остальное сделал.
Код:
private static List<string> remainTracksList = new List<string>();
// выборка песни из таблицыprivate void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
// если мы нажали на какой-либо трэк из таблицы во время проигрывания, или когда мы остановили проигрывание
// либо когда проигрывание трэков завершено, то есть остановлено
// мы отправляем команду на закрытие проигрывания "close MediaFile";if ((Player.GetPlayer().IsPlaying()) ||
(Player.GetPlayer().IsPaused()) ||
(Player.GetPlayer().IsStopped()))
{
Player.GetPlayer().Close();
}
this.currentPlayingTrack = this.dataGridView1[this.dataGridView1.Columns["FilePath"].Index,
e.RowIndex].Value.ToString();
this.AddRemainTracks(e.RowIndex);
this.NextTrack();
}
// проигрываем следующий трэкprivate void NextTrack()
{
if (trackList.Count != 0)
{
Player.GetPlayer().Play(remainTracksList.First());
remainTracksListt.Remove(remainTracksListt.First());
}
}
// добавляем трэки в remainTracksList ниже текущего проигрываемого трэкаprivate void AddRemainTracks(int currentTrackIndex)
{
remainTracksList.Clear(); // очищаем список while (!(this.dataGridView1.RowCount == currentTrackIndex))
{
remainTracksList.Add(this.dataGridView1[this.dataGridView1.Columns["FilePath"].Index,
currentTrackIndex++].Value.ToString());
}
}
Не знаю, правда это или нет, но у меня есть догадка, что нет необходимости создавать событие, а просто передать в следующую функцию (mciSendString) список на проигрышь файлов, но это только догадка.
Функция на основе которой написан класс Player:
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);
Для более ясности могу привести код класса Player.
public delegate void TracPlayingIsStop(object sender, TracPlayingIsStopEventArgs e);
public event TracPlayingIsStop TrackPlayingIsStopEvent;
protected virtual void RaiseTrackPlayingIsStopEvent()
{
// не знаю что тут кодить
}
public class TracPlayingIsStopEventArgs : EventArgs
{
// тут тоже
}
Здравствуйте, xobotik, Вы писали:
X>2) После того, как выбранный музыкальный файл проиграется до конца, нам нужно проиграть из remainTracksList следующий файл и так до конца этого списка.
А у класса Player есть такое событие?
X>Событие должно оповещать, что текущий трэк завершил проигрывание и ставить на проигрыш следующий трэк из remainTracksList.
Ставить на проигрыш должен обработчик события.
X>Ну так чтобы мы нажали в таблице на один из трэков, слушаем до тех пор пока не проиграется последний трэк из remainTracksList.
X>Собственно осталось реализовать только событие, остальное сделал.
А в чём, собственно, затруднение?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, xobotik, Вы писали:
X>>2) После того, как выбранный музыкальный файл проиграется до конца, нам нужно проиграть из remainTracksList следующий файл и так до конца этого списка. S>А у класса Player есть такое событие?
Ну там не событие, а функция возвращающая текущий статус проигрывания
X>>Событие должно оповещать, что текущий трэк завершил проигрывание и ставить на проигрыш следующий трэк из remainTracksList. S>Ставить на проигрыш должен обработчик события.
Ну да, заговорился!
X>>Ну так чтобы мы нажали в таблице на один из трэков, слушаем до тех пор пока не проиграется последний трэк из remainTracksList.
X>>Собственно осталось реализовать только событие, остальное сделал. S>А в чём, собственно, затруднение?
Ни разу с событиями не работал, по этому не могу понять как их разрабатывать!
X>Ну там не событие, а функция возвращающая текущий статус проигрывания
Функция не поможет — её кто-то должен вызвать. Нужно именно событие — которое само вызовет обработчик, когда произойдёт.
X>>>Собственно осталось реализовать только событие, остальное сделал. S>>А в чём, собственно, затруднение?
X>Ни разу с событиями не работал, по этому не могу понять как их разрабатывать!
Ну как же не работал — вон обработчик события OnCellClick же приведён.
Статью вот эту
Здравствуйте, Sinclair, Вы писали:
S>Функция не поможет — её кто-то должен вызвать. Нужно именно событие — которое само вызовет обработчик, когда произойдёт.
Это да, если событие OnCellClick срабатывает один раз.
S>Ну как же не работал — вон обработчик события OnCellClick же приведён.
Я имел ввиду свои делать=) Просто никогда в этом потребности особой не возникало.
S>Статью вот эту