Array
(
)

ParamStr

Rudá
   - 26 jan 2006

Estou fazendo um Tocador.

Já fiz tudo só a um problema

Quero que quando a pessoa clicar no arquivo exemplo

Musica.avi

E se a pessoa selecionou mais de um arquivo para ouvir exemplo

Musica1.avi
Musica2.avi
Musica3.avi

ele abrir meu programa e rodar as músicas.

Como faço isso??

--------------------------------


Rodc
   - 27 jan 2006

Você tem que gravar no registro do windows que a extenção .avi é sua e não do MediaPlayer.
Tem dicas na Net falando como fazer isto, dá uma procurada melhor.


Michael
   - 27 jan 2006

Olá!

[url=http://delphi.about.com/cs/adptips2001/a/bltip0801_3.htm]Neste link[/url] vc encontrará uma procedure que registra uma aplicação com uma determinada extensão de arquivo.

Porém, isso apenas não é o suficiente para que seu aplicativo execute os arquivos passados via linha de comando. Como vc mesmo disse no título do post, vc deve usar ParamStr para pegar os ´parâmetros´ informados, e tbm ParamCount, para saber se mais de um arquivo está na linha de comando. Veja um exemplo:

#Código

var
I: Integer;
Arquivos: TStringList;
begin
Arquivos := TStringList.Create;
try
for I := 1 to ParamCount - 1 do
if FileExists(ParamStr(I)) then
Arquivos.Add(ParamStr(I));
// Faz alguma coisa com Arquivos
finally
Arquivos.Free;
end;
end;


[]´s


Rudá
   - 27 jan 2006

Fiz a alteração no registro e coloquei e a função para mostrar todos os parâmetros só que não mostrou nenhum parâmentro.

Ai mudei o código para isso para ele mostrar o primeiro parâmentro.

#Código

var 
I: Integer;
Arquivos: TStringList;
begin
Arquivos := TStringList.Create;
try
for I := 0 to ParamCount - 1 do
if FileExists(ParamStr(I)) then
Arquivos.Add(ParamStr(I));
// Faz alguma coisa com Arquivos
finally
Arquivos.Free;
end;
end;


Ai ele mostrou o caminho do programa.


Michael
   - 27 jan 2006

Note que eu usei a função FileExists para garantir que o(s) arquivo(s) informado(s) exista(m) no disco. Se vc testou informando Musica1.avi, Musica2.avi, etc, obviamente que o StringList ficará vazio.

[]´s


Rudá
   - 27 jan 2006

Cara, vc não entendeu minha pergunta desde o começo.

Quando vc clica no arquivo musica.asf em uma pasta qualquer ele abre o windows media player ou qualquer outro programa, e ele abre logo a música, eu to querendo fazer isso, quando a pessoa clicar no arquivo musica.asf ele abre meu programa e toca a musica, mas eu fiz o que vc falou, registrei no registro tudo certo mas ele não mostra nada.

Não era para mostrar o arquivo musica.asf nos paramentros para eu poder tocar ele??


Rodc
   - 27 jan 2006

Rudá, entra no Registry do Windows e vai na pasta que ele guarda as informações sobre as extensões. Verifica se as informações da sua extensão são parecidas com de outra extensão.
Uma outra sugestão é, pelo Windows Explorer, ir em ferramentas/Opções e na guia ´tipos de arquivo´ selecionar a sua extensão e mandar ela abrir com o seu arquivo, daí você pode ver como o windows gravou as informações no registry.


Michael
   - 27 jan 2006

Entendi sim sua pergunta desde o início, e lhe forneci informações suficientes para solucioná-la. Perdi meu tempo aqui testando minhas dicas, mesmo sabendo que elas funcionariam. E funcionam de fato.

[]´s


Rudá
   - 27 jan 2006

Fiz como vc falou e ficou assim no registro

´C:\player.exe´ ´¬1´

No meu sistema fiz assim no create

#Código

ShowMessage(IntToStr(ParamCount));
for i:= 0 to ParamCount - 1 do
ShowMessage(ParamStr(i));


Apareceu um parâmetro que é o caminho do meu programa C:\player.exe

Não apareceu nenhum outro parâmetro.


Michael
   - 27 jan 2006

Vc não prestou atenção no meu código. O loop deve começar em 1, e não em 0. ParamStr(0) retorna o path da aplicação.

Faço uma pequena correção tbm: o loop deve ir de 1 a ParamCount, e não a ParamCount - 1, como eu erroneamente postei acima.

[]´s


Rudá
   - 27 jan 2006

Blz deu certo.

Agora só mais uma coisa quando eu cliquei em dois arquivos e clique abrir no media player ele listava os dois arquivos, e no meu caso ele abriu duas vezes meu programa, como faço para ele abrir só uma vez??


Rjun
   - 27 jan 2006

Para abrir somente uma instância da sua aplicação, faça uma pesquisa no fórum por MUTEX.


Rodc
   - 27 jan 2006

Acho que o problema do Rudá não é abrir bloquear várias instâncias do mesmo programa e sim como fazer para que o windows explorer passe todos os caminhos no ParamStr() de apenas uma aplicação.
Acho que não vai funcionar, mas tenta colocar no registro do windows assim:
´C:\player.exe´ ´¬1´ ´¬2´
e veja se virá dois parâmetros.


Rudá
   - 27 jan 2006

Não funcionou não rodc


Michael
   - 27 jan 2006

Eu acreditava que usando o parâmetro ¬L ao invés de ¬1 solucionaria o problema, pois é desta forma que arquivos como MP3 estão configurados no Windows para abrirem o Windows Media Player. Porém não funcionou.

Pesquisei rapidamente pela Web mas não achei nenhuma informação sobre máscaras que possam ser usadas nesse caso. Penso que haja uma forma, via DDE, de se fazer isso, mas este é um segmento de programação que não possuo muito conhecimento a respeito.

De qualquer forma, há uma solução: como o colega Rjun disse, vc pode usar mutexes para garantir que apenas uma única instância da sua aplicação estará rodando. E, nesse momento, vc passa uma mensagem para a outra instância contendo o caminho do arquivo a ser aberto.

Para controlar múltiplas cópias da sua aplicação, use, como já mencionado, mutexes. E para enviar mensagens entre elas, vc pode usar este componente: [url=http://subsimple.com/delphi.asp]InterAppComm[/url].

[]´s