ParamStr

Delphi

26/01/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??

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


Rudá

Rudá

Curtidas 0

Respostas

Rodc

Rodc

26/01/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.


GOSTEI 0
Michael

Michael

26/01/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 [b:b137432028]ParamStr [/b:b137432028]para pegar os ´parâmetros´ informados, e tbm [b:b137432028]ParamCount[/b:b137432028], para saber se mais de um arquivo está na linha de comando. Veja um exemplo:

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


GOSTEI 0
Rudá

Rudá

26/01/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.

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.


GOSTEI 0
Michael

Michael

26/01/2006

Note que eu usei a função [b:44c4db0a0c]FileExists [/b:44c4db0a0c]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 [b:44c4db0a0c]StringList [/b:44c4db0a0c]ficará vazio.

[]´s


GOSTEI 0
Rudá

Rudá

26/01/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??


GOSTEI 0
Rodc

Rodc

26/01/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.


GOSTEI 0
Michael

Michael

26/01/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


GOSTEI 0
Rudá

Rudá

26/01/2006

Fiz como vc falou e ficou assim no registro

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

No meu sistema fiz assim no create

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


Apareceu um parâmetro que é o caminho do meu programa [b:32cca4b24f]C:\player.exe[/b:32cca4b24f]

Não apareceu nenhum outro parâmetro.


GOSTEI 0
Michael

Michael

26/01/2006

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

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

[]´s


GOSTEI 0
Rudá

Rudá

26/01/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??


GOSTEI 0
Rjun

Rjun

26/01/2006

Para abrir somente uma instância da sua aplicação, faça uma pesquisa no fórum por [b:8bece4e45b]MUTEX[/b:8bece4e45b].


GOSTEI 0
Rodc

Rodc

26/01/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.


GOSTEI 0
Rudá

Rudá

26/01/2006

Não funcionou não [b:3692aa2929]rodc[/b:3692aa2929]


GOSTEI 0
Michael

Michael

26/01/2006

Eu acreditava que usando o parâmetro [b:bb8754beec]¬L[/b:bb8754beec] ao invés de [b:bb8754beec]¬1[/b:bb8754beec] 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 [b:bb8754beec]DDE[/b:bb8754beec], 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 [b:bb8754beec]Rjun [/b:bb8754beec]disse, vc pode usar [b:bb8754beec]mutexes [/b:bb8754beec]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


GOSTEI 0
POSTAR