Суббота, 16.12.2017, 21:32
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 3123»
Форум » Delphi » Создание mp3 плеера на Delphi » Установочный файл + ассоциирование файлов
Установочный файл + ассоциирование файлов
KikoДата: Вторник, 15.05.2012, 07:45 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
1)После создания плеера) возникло желание создать установочный файл, чтобы так сказать "убрать лишние.. файлы" вроде длльки и ини.
2)Но хотелось бы чтобы была возможность ассоциирования файлов то есть -->Чтобы при установке у пользователя спрашивалось хочет ли он чтобы mp3 файлы ассоциировались с этой программой или нет, при запуске песни двойным щечлком открывалось не в Windows media player'е или винапе а в моей программе.
3) Но и это ещё не всё :D, на примере Windows media playera, при открытии файла щёлчком из проводника открывается плеер и в плей лист добавляется эта песня, но если открыть ещё тем же способом старая песня убирается из плей листа и добавляется и начинает проигрываться новая.
4) ну последнее, при нажатии правой клавишей по mp3 файлу в контекстном меню есть функция добавить в список воспроизведения windows media.
Ну и собственно вопросы))
1) Насколько всё это возможно?
2) Какой программой воспользоватся?
3) Как это осуществить, то что возможно?
4) Могли бы вы помочь? и не сильно ли я наглею? biggrin


 
Filo$oFДата: Вторник, 15.05.2012, 18:27 | Сообщение # 2
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
Kiko, Для создания установочного файла могу посоветовать программу Inno Setup и дополнение к ней ISTool
Просто удаляете всё лишнее, оставив только библиотеки и Project.exe. А после загоняете всё в указанную мной выше программу.

Сам искал информацию по ассоциации файлов с программой и как понял сделать это можно только в самой программе, а не при её установке. Там работа с реестром. Весьма муторно. Решил отложить на потом. smile
Вот найденная мною статья на эту тему: http://delphidevelop.ru/publ/13-1-0-229
 
KikoДата: Среда, 16.05.2012, 15:06 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
Программа то у меня была) уже создавал ранее инсталки, думал знает кто, где есть с ассоциацией всё-таки мне кажется это на уровне установочного файла) а не проги.
Я тоже решил пока это оставить..), да и передо мной весит вопрос насчёт "запуск от имени администратора", в одно место бы создателей 7 винды -_- , программу устанавливаю в programm files, -> проблема если запускать не от имени админа, программа не создаст и не запишет ничё в ini файл, устанавливать в другое место как-то не очень хочется, ибо программ файлз как-то более стандарт.., не знаешь случайно как решить проблему?) ну например как запрашивать сразу запуск от имени админа?)


 
Filo$oFДата: Среда, 16.05.2012, 15:42 | Сообщение # 4
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
Kiko,
Я как-то этим вопросом не задавался. smile
 
xaramamburuДата: Суббота, 19.05.2012, 21:47 | Сообщение # 5
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Kiko,
Для запуска песен из проводника в созданном плеере, ему необходимо передавать параметры командной строки, это можно сделать используя ParamStr и ParamCount.
ParamStr(0) - содержит саму команду, а ParamStr(1), ParamStr(2) и т.д. содержит передаваемые параметры.
ParamCount - содержит количество передаваемых параметров.

В разделе Var добавим:

flag_create: boolean = true;

Далее мы в процедуре OnCreate формы добавим следующий код, который позволит нам получать параметры передаваемые при запуске нашей программе:

Code

if paramcount>0 then
begin
// здесь нужно вызвать процедуру очистки плейлиста;
// для примеров из урока это можно сделать так:
ListBox1.Clear;
//получаем передаваемый параметр и добавляем его в плейлист
ListBox1.Items.Add(Paramstr(1));
//Получаем имя файла для проигрывания
Filename:=ListBox1.Items.Strings[0];
//Выделяем строку в ListBox
ListBox1.ItemIndex:=0;
flag_create:=false; //флаг первого запуска
//здесь вызываем процедуру проигрывания песни;
// для примеров из урока это можно сделать так:
player;
end;

Но сейчас возникнет другая проблема, при каждом двойном клике на песню в проводнике будет запускаться своя копия программы, что бы этого избежать мы должны запретить запуск второй копии, но при этом передать первой копии все пути к запускаемым песням если их выделено несколько.
Для этого открываем сам файл проекта, обратите внимание не модуль формы, а файл проекта он имеет расширение dpr и пишем код аналогичный этому:
Code
             
program mp3player;

uses
              Forms, Windows,
              mp3 in 'mp3.pas' {Form_player};

{$R *.res}

var
              CopyDataStruct : TCopyDataStruct;
              S: string;
begin
S:='';
CreateMutex(Nil, true, 'player'); //запрещаем повторный запуск
             if GetLastError = ERROR_ALREADY_EXISTS then begin
                    S:=paramstr(1); //добавляем файлы из проводника
                    copyDataStruct.dwData := 0;
                    CopyDataStruct.cbData := Length(S)+1;
                    CopyDataStruct.lpData:=PAnsiChar(AnsiString(S));
                    //Отсылаем сообщение в окно с заголовком
                    //далее отсылаем предыдущей копии команду на добавление
                    SendMessage(FindWindow('TForm_player', nil), $004A {WM_COPYDATA}, 0, LParam(@CopyDataStruct));
                    //закрываем программу
                    halt
end;                
              Application.Initialize;
              Application.MainFormOnTaskbar := True;
              Application.CreateForm(TForm_player, Form_player);
              Application.Run;
end.

Далее в модуле основной формы добавляем следующий код:

В разделе описаний описываем процедуру:
procedure wmcopydata(var msg: twmcopydata); message wm_copydata;

В разделе Var описываем следующие переменные:
flag:boolean = true;
nn:integer = 0;
kk: integer = 0;

Далее в разделе implementation пишем код описанной ранее процедуры wmcopydata:

Code

//процедура получения данных из внешней программы
procedure TForm_player.wmcopydata(var msg: twmcopydata);
var
              s: string;
begin
                  if flag then //проверяем флаг разрешения на очистку плейлиста
                  begin
                   if flag_create then ListBox1.Clear;;//вызов процедуры очистки плейлиста если он не был очищен при запуске плеера. Вы должны вставить свою.
                   flag:=false;//Выключаем флаг, иначе при каждом полученном параметре будет очищаться плейлист
                   timer3.Enabled:=true;//запускаем таймер
                   end;
                           s := PAnsiChar((msg.CopyDataStruct.lpData));//получаем переданный параметр
                           ListBox1.Items.Add(s);//добавляем его в плейлист
                           nn:=nn+1;//счетчик - нужен для того чтобы узнать когда закончиться передача данных
                     //будем проверять его по таймеру
end;

Далее на форму добавляем компонент Timer, в моем случае это Timer3. Свойство Enabled устанавливаем False. Свойство Interval надо будет подобрать так, чтобы список загружаемых файлов из проводника успевал загрузиться в плейлист (от 100 до 1000), я установил 350. Дело в том, что если установить маленькое значение, то файлы не успевают подгружаться в плейлист, а если установить большое, то при быстрых двойных кликах на файле, в место одного раза он загружается несколько раз. К сожалению решение кривое, но другого предложить пока не могу, проверял на AIMP там точно также, если быстро кликать то файл попадает в плейлист несколько раз.

Для события OnTime таймера пишем следующий код:

Code

procedure TForm_player.Timer3Timer(Sender: TObject);
begin
if kk=nn then //если счетчики равны значит передача данных прекратилась
                            begin
                      timer3.Enabled:=false;//выключаем таймер
                      flag:=true;//устанавливаем флаг разрешения очистки плейлиста
                      nn:=0;//обнуляем счетчик контроля данных
                      //Получаем имя файла для проигрывания
                      Filename:=ListBox1.Items.Strings[0];
                      //Выделяем строку в ListBox
                      ListBox1.ItemIndex:=0;
                      mode:=stop;
                      if flag_create then player;//запускаем процедуру проигрывания если она не была запущена при запуске плеера
                      flag_create:=true;
                            end;
              kk:=nn;
end;

Код проверялся на Delphi 2010. В Delphi7 возможно в плейлисте появятся крякозяблы, это из-за того, что в Delphi 2010 используются строки Unicode. В этом случае нужно поменять тип с PAnsiChar на PChar и AnsiString на String. Короче смотрите здесь http://programmersforum.ru/showthread.php?p=579675#post579675 или здесь http://delphiru.ru/other/14-2012-03-16-17-51-39.html.
У кого заработает отпишитесь пожалуйста.
Да, забыл сказать, не забудьте сделать ассоциацию файлов mp3 с вашим плеером в Windows. smile
 
MuLtLaNdIaДата: Суббота, 19.05.2012, 22:44 | Сообщение # 6
Рядовой
Группа: Пользователи
Сообщений: 12
Репутация: 0
Статус: Offline
xaramamburu,
У меня всё прекрасно работает smile Спасибо smile


Сообщение отредактировал MuLtLaNdIa - Суббота, 19.05.2012, 22:44
 
xaramamburuДата: Суббота, 19.05.2012, 22:58 | Сообщение # 7
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
MuLtLaNdIa,
Нужно проверять быстрое двойное кликание по файлу и успевает ли загружаться выделенная группа файлов? И изменяя свойство Interval таймера получить некоторое оптимальное значение, чтобы пользователь например, не успевал открыть выделенный список файлов дважды без очистки плейлиста. smile К сожалению, если вы избавитесь от двойного кликания, то не все файлы будут успевать подгружаться в плейлист. Поэтому нужно будет выбрать, что то одно, среднее. smile
 
Filo$oFДата: Воскресенье, 20.05.2012, 10:12 | Сообщение # 8
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu,

Зделал как указано, но пытаюсь запустить файлы и вскакивает ошибка "Access violation at addres 004fed55 in module 'Project1.exe'. Read of addres 000002F8."
Потом ошибка пропадает, но при наведении курсора на форму вновь выскакивает.

Добавлял этот код в исходник к вашим урокам, но там пишет "Undeclared identifier 'TCopyDataStruct' "
 
xaramamburuДата: Воскресенье, 20.05.2012, 10:27 | Сообщение # 9
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,
Добавьте в файле проекта модуль Windows в Uses.)))))))))
 
Filo$oFДата: Воскресенье, 20.05.2012, 10:31 | Сообщение # 10
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu,

Добавлено, но всё ровно тоже самое smile
 
xaramamburuДата: Воскресенье, 20.05.2012, 10:32 | Сообщение # 11
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,
Я имел ввиду исходник к урокам.))))
 
Filo$oFДата: Воскресенье, 20.05.2012, 19:58 | Сообщение # 12
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu,
Работает, только пришлось всё переписать сначала.
А как сделать, чтобы в плейлист грузился не один файл, а все выделенные?
 
xaramamburuДата: Воскресенье, 20.05.2012, 20:10 | Сообщение # 13
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,
Дак и так должны грузиться все выделенные файлы. Выделяете файлы и правой кнопкой мыши - открыть. Могу скинуть мой пример вам, если надо.)))
 
Filo$oFДата: Воскресенье, 20.05.2012, 21:46 | Сообщение # 14
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
У меня почему-то Windows не хочет ассоциировать файлы с программой.. Открываю перетаскивая на ярлык smile

Добавлено (20.05.2012, 20:29)
---------------------------------------------
Наверное поэтому и не открывает выделенные smile

Добавлено (20.05.2012, 21:46)
---------------------------------------------
Ничего не понимаю..
Мне MuLtLaNdIa скинул свои исходники. Почему-то с его программой система ассоциирует mp3 файлы, а с моей не хочет cry

 
MuLtLaNdIaДата: Воскресенье, 20.05.2012, 23:03 | Сообщение # 15
Рядовой
Группа: Пользователи
Сообщений: 12
Репутация: 0
Статус: Offline
Filo$oF,
у меня тока плеер твой запускается при нажатии на МР3 но в плейлист не добавляется sad но зато ассоциируется smile
у меня СемёркА)
 
Форум » Delphi » Создание mp3 плеера на Delphi » Установочный файл + ассоциирование файлов
Страница 1 из 3123»
Поиск:


Copyright MyCorp © 2017Конструктор сайтов - uCoz