Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как во время запуска плеера воспроизвести более одного файла? [D7, WinXP]


alex_bog ©   (2006-08-04 19:49:00) 

Пишу собственный медиаплеер на Delphi, за основу взял библиотеки BASS, но не в этом суть. Проблема заключается вот в чем: любой уважающий себя плеер умеет открывать за раз более одного файла (то есть, если в проводнике выбрать несколько медиафайлов и перетащить их на иконку плеера, то он их воспроизведет). В реальности же (то есть, у меня, в Delphi) через параметры коммандной строки (ParamStr(1)) отлавливается только тот файл, на котором был совершен щелчок (при переносе или вызове контекстного меню, не важно), а остальные файлы идут лесом... Но плееры как-то ведь узнают об остальных файлах. Вопрос - КАК ОНИ ЭТО ДЕЛАЮТ, и КАК ЭТО СДЕЛАТЬ НА DELPHI?


alex_bog   (2006-08-11 13:32:00) [1]

Действительно, так и есть. Сейчас зарегистрировал расширения (пока вручную) и сразу открываться начало n копий плеера, так что спасибо за помощь!


Rial   (2006-08-09 22:09:00) [2]

После этого твои файлы будут открываться автоматически
с помощью указаннго приложения.

Если обвести группы файлов и нажать для всех "Enter", то
откроется столько копий программы, сколько файлов было выделено.
И каждой из копий первым параметром командной строки будет
передано имя "ее" файла.
То есть при запуске очередной копии ты должен предусмотреть,
открыто ли уже единожды твое приожение, или нет.
Это ты можешь сделать, разобравшись с обменом данными между приожениями.

Действительно, одна копия откроется, есль нажать "открыть с помошью",
но дело только в том, что остальные файлы проводник просто не знает
пока, как и открыть.

Другой вопрос, что сторонние приложения открываются единожды, так как
они при запуске передают полученное имя фала активной копии и
терминируются.


Rial   (2006-08-09 22:01:00) [3]

По поводу регистрации расширений :


Unit Registration;

Interface

{
 Регистариция приложение с указанием имени исполняемого файла,
именен папки приложение, расширением, названием программы, командой открытия (напр. '%1')
 Обратите внимание, что команду открытия необходимо брать в двойные кавычки!
}

//Регистрация расширения
procedure CreateFileReg(Const IconFileName, Name, Ext, FileLabel, OpenCommand : String; Const IconNumber : Integer; Const NoOpen : Boolean);
//Регистрация приложения
procedure CreateSoftReg(Const ExeName, SoftName : String);
//Удаление регистрации расширения
procedure DeleteFileReg(Const Name, Ext : String);
//Удаление регистрации расширения
procedure DeleteSoftReg(Const SoftName : String);
//Получение установочной директории
function GetInstallPath(Const SoftName : String) : String;

Implementation
Uses SysUtils, Windows, Registry;

Const SoftPath='\Software\';
     InstallStr='InstallPath';

function GetInstallPath(Const SoftName : String) : String;
Var Reg : TRegistry;
begin
GetInstallPath:=GetCurrentDir;
Try
 Reg:=TRegistry.Create;
 Reg.RootKey:=HKEY_LOCAL_MACHINE;
 Try
  If (Reg.OpenKey(SoftPath + SoftName, False))then begin
   GetInstallPath:=Reg.ReadString(InstallStr);
   Reg.CloseKey;
  end;
 Finally
  Reg.Free;
 end;
Except
end;
end;

procedure CreateSoftReg(Const ExeName, SoftName : String);
Var Reg : TRegistry;
begin
Try
 Reg:=TRegistry.Create;
 Reg.RootKey:=HKEY_LOCAL_MACHINE;
 Try
  Reg.CreateKey(SoftPath + SoftName);
  If Reg.OpenKey(SoftPath + SoftName, False) then begin
   Reg.WriteString(InstallStr, ExtractFileDir(ExeName));
   Reg.CloseKey;
  end;
 Finally
  Reg.Free;
 end;
Except
end;
end;

procedure CreateFileReg(Const IconFileName, Name, Ext, FileLabel, OpenCommand : String; Const IconNumber : Integer; Const NoOpen : Boolean);
Var Reg : TRegistry;

procedure Step(Const Path, Name, Value : String);
begin
If (Reg.OpenKey(Path, True))then begin
 Reg.WriteString(Name, Value);
 Reg.CloseKey;
end;
end;

begin
Try
 Reg:=TRegistry.Create;
 Reg.RootKey:=HKEY_CLASSES_ROOT;
 Try
  Step('\' + Ext, '', Name);
  Step(Name, '', FileLabel);
  If (NoOpen)then
   Step('\' + Name, 'NoOpen', '');
  Step('\' + Name + '\DefaultIcon', '', IconFileName + ',' + IntToStr(IconNumber));
  If (OpenCommand <> '')then
   Step('\' + Name + '\Shell\Open\Command', '', '"' + IconFileName + '" ' + OpenCommand);
 Finally
  Reg.Free;
 end;
Except
end;
end;

procedure DeleteFileReg(Const Name, Ext : String);
Var Reg : TRegistry;
begin
Reg:=TRegistry.Create;
Reg.Rootkey:=HKEY_CLASSES_ROOT;
Try
 Reg.DeleteKey('\' + Ext);
 Reg.DeleteKey(Name);
Finally
 Reg.Free;
end;
end;

procedure DeleteSoftReg(Const SoftName : String);
Var Reg : TRegistry;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Try
 Reg.DeleteKey(SoftPath + SoftName);
Finally
 Reg.Free;
end;
end;

end.


Сначала ригистрируй приложение, потом - его расширение.


alex_bog   (2006-08-09 20:52:00) [4]

Rial, куда пропал?


alex_bog   (2006-08-06 18:40:00) [5]


> чей плеер

:) Мой плеер (см. первый пост).


> каким образом ты регистрируешь расширения

Никак. Не регистрирую вообще. Расширения стандартные - mp3/2/1, ogg, wma и wav. По-умолчанию они зарегистрированы на WinAMP.
З.Ы. Если нужно предварительно зарегистрировать, то напиши, что конкретно нужно сделать.


> как именно открываешь  файлы

Выделяю группу файлов, затем даю комманду "Открыть с помощью" -> "Выбрать программу..." - "AlexSoftMP.exe", после чего открывается плеер. ОДНА КОПИЯ ПЛЕЕРА, наличие запущенных копий я не проверяю!


> каким образом обрабатываешь их в программе

Пока только проверяю параметры коммандной строки. Так вот, ParamCount ВСЕГДА равен 1, а ParamStr(1) - путь последнего выделенного файла (на котором был совершен щелчок).


Rial   (2006-08-06 17:56:00) [6]


> alex_bog ©   (06.08.06 12:07) [8]


Поясни, пожауйста, чей плеер, каким образом ты регистрируешь расширения,
как именно открываешь  файлы,
а также каким образом обрабатываешь их в программе.
Потому как пока получается путаница.


alex_bog   (2006-08-06 12:07:00) [7]

Кстати, если расширение файла не "mp3" (или там "wma"), то копий запускается действительно n штук... Возможно, дело в DDE?


alex_bog   (2006-08-06 12:06:00) [8]


> Я именно на этот вопрос и ответил.
>
> Const
> MainCaption = 'MyProg';
> TmpCaption = 'TmpProg';
>
> OnCreate:
>
> Caption:=TmpCaption;
> If (FindWindow('TForm1',MainCaption) <>0)then begin
> //Посылаем имя файла открытому приложению.
> Exit;
> end;
> Caption:=MainCaption;

По твоему, безо всяких ухищрений у меня должно запуститься n копий плеера (по количеству файлов), а плеер запускается ОДИН!


Rial   (2006-08-05 21:02:00) [9]


> alex_bog ©   (05.08.06 14:57) [4]
> Значит, сформулируем вопрос по-другому: если я выделю несколько
> mp3-файлов и выберу пункт меню "Открыть с помощью" -> "AlexSoftMP.
> exe", то тут уже точно через параметры отлавливается только
> ОДИН файл. Что делать с остальными?
>


Я именно на этот вопрос и ответил.

Const
MainCaption = 'MyProg';
TmpCaption = 'TmpProg';

OnCreate:

Caption:=TmpCaption;
If (FindWindow('TForm1',MainCaption) <>0)then begin
//Посылаем имя файла открытому приложению.
Exit;
end;
Caption:=MainCaption;


> XProger ©   (05.08.06 19:09) [5]
>
> Насколько я помню длина строки параметров не должна превышать
> 255 символов (т.е. файлов не много выйдет). Могу ошибаться,
>  поправьте если что не так.


То было в DOS. А в делфи можно хоть фильм HEX - кодом через
командную строку передавать. ))


XProger   (2006-08-05 19:09:00) [10]

Насколько я помню длина строки параметров не должна превышать 255 символов (т.е. файлов не много выйдет). Могу ошибаться, поправьте если что не так.


alex_bog   (2006-08-05 14:57:00) [11]


> paramstr(>1)+paramcount() ?

Ладно, был не прав. В случае перетаскивания файлов на иконку плеера пути к медиафайлам на действительно передаются в ParamStr(i), а ParamCount - их количество.
Значит, сформулируем вопрос по-другому: если я выделю несколько mp3-файлов и выберу пункт меню "Открыть с помощью" -> "AlexSoftMP.exe", то тут уже точно через параметры отлавливается только ОДИН файл. Что делать с остальными?


antonn   (2006-08-05 11:58:00) [12]

paramstr(>1)+paramcount() ?


alex_bog   (2006-08-05 10:38:00) [13]

Нифига. Запускается только ОДНА копия и ей на вход передается файл, на котором был совершен щелчок. Так что не все так просто.


Rial   (2006-08-05 04:12:00) [14]

Передаваться всегда будет один файл.
Когда обведешь несколько, проводник запустит для каждого файла копию
программы с один параметром.
Нужно проверять при запуске, если ли уже запущенный плеер, и, если есть,
передавать ему имя файла из командной строки.


Наверх

Титульная страница Поиск, карта сайта Написать письмо