Установочный файл + ассоциирование файлов
|
|
Kiko | Дата: Вторник, 15.05.2012, 07:45 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 5
Статус: Offline
| 1)После создания плеера) возникло желание создать установочный файл, чтобы так сказать "убрать лишние.. файлы" вроде длльки и ини. 2)Но хотелось бы чтобы была возможность ассоциирования файлов то есть -->Чтобы при установке у пользователя спрашивалось хочет ли он чтобы mp3 файлы ассоциировались с этой программой или нет, при запуске песни двойным щечлком открывалось не в Windows media player'е или винапе а в моей программе. 3) Но и это ещё не всё :D, на примере Windows media playera, при открытии файла щёлчком из проводника открывается плеер и в плей лист добавляется эта песня, но если открыть ещё тем же способом старая песня убирается из плей листа и добавляется и начинает проигрываться новая. 4) ну последнее, при нажатии правой клавишей по mp3 файлу в контекстном меню есть функция добавить в список воспроизведения windows media. Ну и собственно вопросы)) 1) Насколько всё это возможно? 2) Какой программой воспользоватся? 3) Как это осуществить, то что возможно? 4) Могли бы вы помочь? и не сильно ли я наглею?
|
|
| |
Filo$oF | Дата: Вторник, 15.05.2012, 18:27 | Сообщение # 2 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| Kiko, Для создания установочного файла могу посоветовать программу Inno Setup и дополнение к ней ISTool Просто удаляете всё лишнее, оставив только библиотеки и Project.exe. А после загоняете всё в указанную мной выше программу.
Сам искал информацию по ассоциации файлов с программой и как понял сделать это можно только в самой программе, а не при её установке. Там работа с реестром. Весьма муторно. Решил отложить на потом. Вот найденная мною статья на эту тему: http://delphidevelop.ru/publ/13-1-0-229
|
|
| |
Kiko | Дата: Среда, 16.05.2012, 15:06 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Программа то у меня была) уже создавал ранее инсталки, думал знает кто, где есть с ассоциацией всё-таки мне кажется это на уровне установочного файла) а не проги. Я тоже решил пока это оставить..), да и передо мной весит вопрос насчёт "запуск от имени администратора", в одно место бы создателей 7 винды -_- , программу устанавливаю в programm files, -> проблема если запускать не от имени админа, программа не создаст и не запишет ничё в ini файл, устанавливать в другое место как-то не очень хочется, ибо программ файлз как-то более стандарт.., не знаешь случайно как решить проблему?) ну например как запрашивать сразу запуск от имени админа?)
|
|
| |
Filo$oF | Дата: Среда, 16.05.2012, 15:42 | Сообщение # 4 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| Kiko, Я как-то этим вопросом не задавался.
|
|
| |
xaramamburu | Дата: Суббота, 19.05.2012, 21:47 | Сообщение # 5 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: 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.
|
|
| |
MuLtLaNdIa | Дата: Суббота, 19.05.2012, 22:44 | Сообщение # 6 |
Рядовой
Группа: Пользователи
Сообщений: 12
Статус: Offline
| xaramamburu, У меня всё прекрасно работает Спасибо
Сообщение отредактировал MuLtLaNdIa - Суббота, 19.05.2012, 22:44 |
|
| |
xaramamburu | Дата: Суббота, 19.05.2012, 22:58 | Сообщение # 7 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| MuLtLaNdIa, Нужно проверять быстрое двойное кликание по файлу и успевает ли загружаться выделенная группа файлов? И изменяя свойство Interval таймера получить некоторое оптимальное значение, чтобы пользователь например, не успевал открыть выделенный список файлов дважды без очистки плейлиста. К сожалению, если вы избавитесь от двойного кликания, то не все файлы будут успевать подгружаться в плейлист. Поэтому нужно будет выбрать, что то одно, среднее.
|
|
| |
Filo$oF | Дата: Воскресенье, 20.05.2012, 10:12 | Сообщение # 8 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: 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
Статус: Offline
| Filo$oF, Добавьте в файле проекта модуль Windows в Uses.)))))))))
|
|
| |
Filo$oF | Дата: Воскресенье, 20.05.2012, 10:31 | Сообщение # 10 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu,
Добавлено, но всё ровно тоже самое
|
|
| |
xaramamburu | Дата: Воскресенье, 20.05.2012, 10:32 | Сообщение # 11 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Filo$oF, Я имел ввиду исходник к урокам.))))
|
|
| |
Filo$oF | Дата: Воскресенье, 20.05.2012, 19:58 | Сообщение # 12 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu, Работает, только пришлось всё переписать сначала. А как сделать, чтобы в плейлист грузился не один файл, а все выделенные?
|
|
| |
xaramamburu | Дата: Воскресенье, 20.05.2012, 20:10 | Сообщение # 13 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Filo$oF, Дак и так должны грузиться все выделенные файлы. Выделяете файлы и правой кнопкой мыши - открыть. Могу скинуть мой пример вам, если надо.)))
|
|
| |
Filo$oF | Дата: Воскресенье, 20.05.2012, 21:46 | Сообщение # 14 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| У меня почему-то Windows не хочет ассоциировать файлы с программой.. Открываю перетаскивая на ярлык Добавлено (20.05.2012, 20:29) --------------------------------------------- Наверное поэтому и не открывает выделенные Добавлено (20.05.2012, 21:46) --------------------------------------------- Ничего не понимаю.. Мне MuLtLaNdIa скинул свои исходники. Почему-то с его программой система ассоциирует mp3 файлы, а с моей не хочет
|
|
| |
MuLtLaNdIa | Дата: Воскресенье, 20.05.2012, 23:03 | Сообщение # 15 |
Рядовой
Группа: Пользователи
Сообщений: 12
Статус: Offline
| Filo$oF, у меня тока плеер твой запускается при нажатии на МР3 но в плейлист не добавляется но зато ассоциируется у меня СемёркА)
|
|
| |
|