События, делегаты - использование
От: 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
Re: События, делегаты - использование
От: xobotik Россия  
Дата: 13.06.10 03:24
Оценка:
Здравствуйте, xobotik, Вы писали:

Наверно должно быть что-то в этом роде:
        public delegate void TracPlayingIsStop(object sender, TracPlayingIsStopEventArgs e);
        public event TracPlayingIsStop TrackPlayingIsStopEvent;
        protected virtual void RaiseTrackPlayingIsStopEvent()
        {
            // не знаю что тут кодить
        }
        public class TracPlayingIsStopEventArgs : EventArgs
        {
            // тут тоже
        }

Запутался в трех березах
С уважением!
Re: События, делегаты - использование
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.06.10 05:42
Оценка:
Здравствуйте, xobotik, Вы писали:

X>2) После того, как выбранный музыкальный файл проиграется до конца, нам нужно проиграть из remainTracksList следующий файл и так до конца этого списка.

А у класса Player есть такое событие?

X>Событие должно оповещать, что текущий трэк завершил проигрывание и ставить на проигрыш следующий трэк из remainTracksList.

Ставить на проигрыш должен обработчик события.

X>Ну так чтобы мы нажали в таблице на один из трэков, слушаем до тех пор пока не проиграется последний трэк из remainTracksList.


X>Собственно осталось реализовать только событие, остальное сделал.

А в чём, собственно, затруднение?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: События, делегаты - использование
От: xobotik Россия  
Дата: 16.06.10 18:08
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, xobotik, Вы писали:


X>>2) После того, как выбранный музыкальный файл проиграется до конца, нам нужно проиграть из remainTracksList следующий файл и так до конца этого списка.

S>А у класса Player есть такое событие?

Ну там не событие, а функция возвращающая текущий статус проигрывания

X>>Событие должно оповещать, что текущий трэк завершил проигрывание и ставить на проигрыш следующий трэк из remainTracksList.

S>Ставить на проигрыш должен обработчик события.

Ну да, заговорился!

X>>Ну так чтобы мы нажали в таблице на один из трэков, слушаем до тех пор пока не проиграется последний трэк из remainTracksList.


X>>Собственно осталось реализовать только событие, остальное сделал.

S>А в чём, собственно, затруднение?

Ни разу с событиями не работал, по этому не могу понять как их разрабатывать!
С уважением!
Re[2]: События, делегаты - использование
От: xobotik Россия  
Дата: 16.06.10 19:24
Оценка:
Здравствуйте, Sinclair, Вы писали:

Для наглядности, вот класс Player:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace MusicLibrary
{
    public class Player
    {

        private String Pcommand;
        private bool isOpen;

        [DllImport("winmm.dll")]
        private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

        private static Player player;
        private int baseVolumn;
        private int trebleVolumn;
        private int leftVolumn;
        private int rightVolumn;
        private int masterVolumn;


        public Player()
        {
            this.Bass = 10 * 100;
            this.LeftVolume = 10 * 100;
            this.MasterVolume = 10 * 100;
            this.RightVolume = 10 * 100;
            this.Treble = 10 * 100;
        }
        public static Player GetPlayer()
        {
            if (player == null)
                player = new Player();
            return player;
        }
        public void Close()
        {
            Pcommand = "close MediaFile";
            mciSendString(Pcommand, null, 0, IntPtr.Zero);
            isOpen = false;
        }
        public void Open(string sFileName)
        {
            Pcommand = "open \"" + sFileName + "\" type mpegvideo alias MediaFile";
            mciSendString(Pcommand, null, 0, IntPtr.Zero);
            isOpen = true;
        }
        /// <summary>
        /// Воспроизведение уже открытого файла по кругу или нет
        /// </summary>
        public void Play(bool loop)
        {
            if (isOpen)
            {
                Pcommand = "play MediaFile";
                if (loop)
                    Pcommand += " REPEAT";
                mciSendString(Pcommand, null, 0, IntPtr.Zero);
                this.Bass = this.Bass;
                this.LeftVolume = this.LeftVolume;
                this.MasterVolume = this.MasterVolume;
                this.RightVolume = this.RightVolume;
                this.Treble = this.Treble;
            }
        }
        /// <summary>
        /// Воспроизведение указаного файла
        /// </summary>
        public void Play(string FileName)
        {
            if (isOpen == true)
            {
                Close();
            }
            Open(FileName);
            Play(false);
        }
        /// <summary>
        /// Установка паузы
        /// </summary>
        public void Pause()
        {
            Pcommand = "pause MediaFile";
            mciSendString(Pcommand, null, 0, IntPtr.Zero);
        }
        /// <summary>
        /// Получение текущего статуса
        /// </summary>
        public String Status()
        {
            int i = 128;
            System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(i);
            mciSendString("status MediaFile mode", stringBuilder, i, IntPtr.Zero);
            return stringBuilder.ToString();
        }
        /// <summary>
        /// Получение/Установка громкости левого динамика
        /// </summary>
        public int LeftVolume
        {
            get
            {
                return leftVolumn;
            }
            set
            {
                mciSendString(string.Concat("setaudio MediaFile left volume to ", value), null, 0, IntPtr.Zero);
                leftVolumn = value;
            }
        }
        /// <summary>
        /// Получение/Установка громкости правого динамика
        /// </summary>
        public int RightVolume
        {
            get
            {
                return rightVolumn; 
            }
            set
            {
                mciSendString(string.Concat("setaudio MediaFile right volume to ", value), null, 0, IntPtr.Zero);
                rightVolumn = value;
            }
        }
        /// <summary>
        /// Получение/Установка общей громкости воспроизведения
        /// </summary>
        public int MasterVolume
        {
            get
            {
                return masterVolumn;
            }
            set
            {
                mciSendString(string.Concat("setaudio MediaFile volume to ", value), null, 0, IntPtr.Zero);
                masterVolumn = value;
            }
        }
        /// <summary>
        /// Получение/Установка громкости басов
        /// </summary>
        public int Bass
        {
            get
            {
                return baseVolumn;
            }
            set
            {
                mciSendString(string.Concat("setaudio MediaFile bass to ", value), null, 0, IntPtr.Zero);
                baseVolumn = value;
            }
        }
        /// <summary>
        /// Устанавливает/получения звукового высокочастотного уровня.
        /// </summary>
        public int Treble
        {
            get
            {
                return trebleVolumn;
            }
            set
            {
                mciSendString(string.Concat("setaudio MediaFile treble to ", value), null, 0, IntPtr.Zero);
                trebleVolumn = value;
            }
        }
        /// <summary>
        /// Проверка установленна ли пауза
        /// </summary>
        public bool IsPaused()
        {
            return Pcommand == "pause MediaFile";
        }
        /// <summary>
        /// Проверка происходит ли проигрывание
        /// </summary>
        public bool IsPlaying()
        {
            return Status() == "playing";
        }
        /// <summary>
        /// Проверка Открыт ли какой либо файл
        /// </summary>
        public bool IsOpen()
        {
            return isOpen;
        }
        /// <summary>
        /// Остановлено ли проигрывание
        /// </summary>
        public bool IsStopped()
        {
            return Status() == "stopped";
        }
    }
}
С уважением!
Re[3]: События, делегаты - использование
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.06.10 23:20
Оценка:
Здравствуйте, xobotik, Вы писали:


X>Ну там не событие, а функция возвращающая текущий статус проигрывания

Функция не поможет — её кто-то должен вызвать. Нужно именно событие — которое само вызовет обработчик, когда произойдёт.


X>>>Собственно осталось реализовать только событие, остальное сделал.

S>>А в чём, собственно, затруднение?

X>Ни разу с событиями не работал, по этому не могу понять как их разрабатывать!

Ну как же не работал — вон обработчик события OnCellClick же приведён.
Статью вот эту
Автор(ы): Алексей Дубовцев
Дата: 26.03.2005
Глава из книги Алексея Дубовцева “Microsoft .NET в подлиннике”, посвященная описанию работы с делегатами в .NET. Подробно разбираются многие аспекты работы с делегатами и на наглядных примерах раскрываются многие особенности использовании этой возможности.

уже прочитал?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: События, делегаты - использование
От: xobotik Россия  
Дата: 16.06.10 23:26
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Функция не поможет — её кто-то должен вызвать. Нужно именно событие — которое само вызовет обработчик, когда произойдёт.


Это да, если событие OnCellClick срабатывает один раз.

S>Ну как же не работал — вон обработчик события OnCellClick же приведён.


Я имел ввиду свои делать=) Просто никогда в этом потребности особой не возникало.

S>Статью вот эту
Автор(ы): Алексей Дубовцев
Дата: 26.03.2005
Глава из книги Алексея Дубовцева “Microsoft .NET в подлиннике”, посвященная описанию работы с делегатами в .NET. Подробно разбираются многие аспекты работы с делегатами и на наглядных примерах раскрываются многие особенности использовании этой возможности.

уже прочитал?


нет, читаю wrox .NET Framework 3.5 для профессионалов, ну тут как-то не очень про события и делегаты. Статью прочитаю обязательно.
Спасибо=)
С уважением!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.