События, делегаты - использование
От: xobotik Россия  
Дата: 13.06.10 03:14
Оценка:
Доброе утро!

У меня возник такой вопрос (по причине того, что с событиями никогда не работал), как мне создать событие под следующее описание:

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.

Заранее спасибо!
С уважением!
события делегаты музыкальные файлы winmm.dll
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.