FórumGdH

Página Inicial do Guia do Hardware

Registrar FAQ Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Voltar   FórumGdH > Profissional > Programação, scripts, web e banco de dados
Bem-vindo ao FórumGdH
Não se esqueça de se registrar, é grátis . Nós temos 759.325 usuários, convidamos você fazer parte de nossa comunidade também! Se ainda não encontrou o que procura use nossa pesquisa. Esperamos que aprecie nosso trabalho.

Resposta
 
Opções do Tópico
Antigo 05-05-2003, 17:11   #1 (permalink)
GBastos
Super Participante
 
Avatar de GBastos
 
Registrado em: Sep 2001
Localização: Salvador, Bahia
Idade: 32
Mensagens: 770
Reputação: 22 GBastos está indo no caminho certo
Padrão Abrindo arquivos via Windows com Delphi

Olá pessoal!

Estou com problemas quanto à integração de um programa com o Windows. É simples, quero que utilizando a opção abrir com do windows ou mesmo dando dois cliques (uma vez que a associação tenha sido feita no Windows) o meu programa abra o arquivo selecionado.
Tentei utilizar ParamStr mas debugando o programa e verificando a variável com o watch informa é inacessível... Porém não dá erro, simplesmente abre o programa como se eu tivesse rodado ele direto do executavel... Eu li que o ParamStr é da unit System que não está na minha uses clause, porém se eu tentar colocar ele diz que a unidade já foi definida...
Então alguma sugestão?
__________________
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
GBastos está offline   Responder com Quote
Antigo 05-05-2003, 17:37   #2 (permalink)
romulo
Zumbi
 
Registrado em: Dec 2001
Localização: Fortaleza / CE
Mensagens: 7.506
Reputação: 31 romulo está indo no caminho certo
Enviar mensagem via ICQ para romulo
Padrão

É com o ParamStr mesmo. Por exemplo, um programinha que pega o primeiro parâmetro passado e abre uma caixa de mensagem com ele:

Código:
program Mensagem; uses Forms; {$R *.RES} begin Application.Initialize; Application.Run; Application.MessageBox(PChar(ParamStr(1)), 'Mensagem', 0); end.
Lembrando que ParamStr(0) retorna o caminho do executável.
__________________
Minha coleção de jogos (todos originais)
romulo está offline   Responder com Quote
Antigo 05-05-2003, 17:49   #3 (permalink)
GBastos
Super Participante
 
Avatar de GBastos
 
Registrado em: Sep 2001
Localização: Salvador, Bahia
Idade: 32
Mensagens: 770
Reputação: 22 GBastos está indo no caminho certo
Padrão

Citação:
Postado Originalmente por romulo
É com o ParamStr mesmo. Por exemplo, um programinha que pega o primeiro parâmetro passado e abre uma caixa de mensage...
Mas e onde fica afinal a maldita unit system?

E é isso que eu estou fazendo, porém não no código do projeto, tem q ser lá?
No form MDI principal eu coloquei um if ParamCount > 1 then aí crio o MDI child e passo o ParamStr(1) como parametro do arquivo, porém ele está abrindo um arquivo vazio e quando eu rodei colocando um breakpoint nessa linha, vi que ele informa inacessible value tanto para o ParamCount quanto para o ParamStr...
__________________
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
GBastos está offline   Responder com Quote
Antigo 05-05-2003, 18:22   #4 (permalink)
romulo
Zumbi
 
Registrado em: Dec 2001
Localização: Fortaleza / CE
Mensagens: 7.506
Reputação: 31 romulo está indo no caminho certo
Enviar mensagem via ICQ para romulo
Padrão

Citação:
Postado Originalmente por GBastos
Mas e onde fica afinal a maldita unit system?

E é isso que eu estou fazendo, porém não no código do projeto, tem q...
Você não precisa declarar, ela já fica disponível automaticamente. Você está debugando dentro do Delphi mesmo né? Você lembrou de colocar uns parâmetros para teste no Run->Parameters? Se não der certo, posta o código aí.
__________________
Minha coleção de jogos (todos originais)
romulo está offline   Responder com Quote
Antigo 05-05-2003, 19:08   #5 (permalink)
GBastos
Super Participante
 
Avatar de GBastos
 
Registrado em: Sep 2001
Localização: Salvador, Bahia
Idade: 32
Mensagens: 770
Reputação: 22 GBastos está indo no caminho certo
Padrão

Citação:
Postado Originalmente por romulo
Você não precisa declarar, ela já fica disponível automaticamente. Você está debugando dentro do Delphi mesmo né? Voc...
Lembrei sim... :lol:

Estou sem o código agora, amanhã posto!
__________________
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
GBastos está offline   Responder com Quote
Antigo 06-05-2003, 15:32   #6 (permalink)
GBastos
Super Participante
 
Avatar de GBastos
 
Registrado em: Sep 2001
Localização: Salvador, Bahia
Idade: 32
Mensagens: 770
Reputação: 22 GBastos está indo no caminho certo
Padrão

Aí vai:

Código:
procedure TPrincipalForm.FormCreate(Sender: TObject); var EditorForm: TEditorForm; begin EditorForm := TEditorForm.Create(Self); EditorForm.Visible := True; if ParamCount > 1 then EditorForm.Abrir(ParamStr(1)); end;
__________________
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
GBastos está offline   Responder com Quote
Antigo 06-05-2003, 17:28   #7 (permalink)
romulo
Zumbi
 
Registrado em: Dec 2001
Localização: Fortaleza / CE
Mensagens: 7.506
Reputação: 31 romulo está indo no caminho certo
Enviar mensagem via ICQ para romulo
Padrão

Citação:
Postado Originalmente por GBastos
Aí vai:

[code]procedure TPrincipalForm.FormCreate(Sender: TObject);
var
EditorForm: TEditorFor...
O argumento da função Abrir é uma string mesmo? Esse código tá correto, não deveria dar nenhum erro.
__________________
Minha coleção de jogos (todos originais)
romulo está offline   Responder com Quote
Antigo 06-05-2003, 17:36   #8 (permalink)
GBastos
Super Participante
 
Avatar de GBastos
 
Registrado em: Sep 2001
Localização: Salvador, Bahia
Idade: 32
Mensagens: 770
Reputação: 22 GBastos está indo no caminho certo
Padrão

É sim, conforme ai embaixo... O procedimento funciona normalmente quando chamado pelo OpenDialog...

Código:
procedure TEditorForm.Abrir(const Arquivo: string); begin Nomedoarquivo := Arquivo; {parametro passado} RichEdit1.Lines.LoadFromFile(Nomedoarquivo); Caption := ExtractFilename(Nomedoarquivo); end;
Não entendo pq dá valor inacessivel se em outro procedimento utilizo
assignfile(arquivoini, ExtractFilePath(ParamStr(0)) + 'hdpad.ini') normalmente...
__________________
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
GBastos está offline   Responder com Quote
Antigo 06-05-2003, 18:54   #9 (permalink)
romulo
Zumbi
 
Registrado em: Dec 2001
Localização: Fortaleza / CE
Mensagens: 7.506
Reputação: 31 romulo está indo no caminho certo
Enviar mensagem via ICQ para romulo
Padrão

Citação:
Postado Originalmente por GBastos
É sim, conforme ai embaixo... O procedimento funciona normalmente quando chamado pelo OpenDialog...

[code]proced...
Acabei de fazer um teste aqui no Delphi 5 e rodou normal.
__________________
Minha coleção de jogos (todos originais)
romulo está offline   Responder com Quote
Antigo 06-05-2003, 19:08   #10 (permalink)
romulo
Zumbi
 
Registrado em: Dec 2001
Localização: Fortaleza / CE
Mensagens: 7.506
Reputação: 31 romulo está indo no caminho certo
Enviar mensagem via ICQ para romulo
Padrão

Só mais uma coisa, o nome do arquivo é o segundo parâmetro na chamada do executável, né? Porque só passa por esse teste se houverem dois parâmetros:

if ParamCount > 1 then
__________________
Minha coleção de jogos (todos originais)
romulo está offline   Responder com Quote
Antigo 07-05-2003, 11:16   #11 (permalink)
GBastos
Super Participante
 
Avatar de GBastos
 
Registrado em: Sep 2001
Localização: Salvador, Bahia
Idade: 32
Mensagens: 770
Reputação: 22 GBastos está indo no caminho certo
Padrão

Citação:
Postado Originalmente por romulo
Só mais uma coisa, o nome do arquivo é o segundo parâmetro na chamada do executável, né? Porque só passa por esse tes...
É, como eu disse botei lá no parameters o nome do arquivo e ai q dá como valor inacessivel... Como pode dar valor inacessivel e não dar erro? As variáveis e funçoes da unit system sao otimizadas em tempo de execução para economizar memoria?

Já tentei como linha de comando mesmo ("c:\arquivos de programas\borland\delphi\projetcs\hdpad\hdpad.exe" c:\teste.txt) e não vai pra canto nenhum...
__________________
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
GBastos está offline   Responder com Quote
Antigo 07-05-2003, 14:05   #12 (permalink)
romulo
Zumbi
 
Registrado em: Dec 2001
Localização: Fortaleza / CE
Mensagens: 7.506
Reputação: 31 romulo está indo no caminho certo
Enviar mensagem via ICQ para romulo
Padrão

Citação:
Postado Originalmente por GBastos
c:\arquivos de programas\borland\delphi\projetcs\hdpad\hdpad.exe" c:\teste.txt
Com essa chamada aí não vai dar certo, pois no if você testa se existe mais de 1 parâmetro. Mude pra 0 que vai dar certo.

if ParamCount > 0 then
__________________
Minha coleção de jogos (todos originais)
romulo está offline   Responder com Quote
Antigo 07-05-2003, 18:28   #13 (permalink)
GBastos
Super Participante
 
Avatar de GBastos
 
Registrado em: Sep 2001
Localização: Salvador, Bahia
Idade: 32
Mensagens: 770
Reputação: 22 GBastos está indo no caminho certo
Padrão

Citação:
Postado Originalmente por romulo
Com essa chamada aí não vai dar certo, pois no if você testa se existe mais de 1 parâmetro. Mude pra 0 que vai dar ce...
Mas entao o ParamCount não retorna o número de parametros reais, so retorna o número de parametros depois do executavel?
__________________
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
GBastos está offline   Responder com Quote
Antigo 07-05-2003, 20:22   #14 (permalink)
romulo
Zumbi
 
Registrado em: Dec 2001
Localização: Fortaleza / CE
Mensagens: 7.506
Reputação: 31 romulo está indo no caminho certo
Enviar mensagem via ICQ para romulo
Padrão

Citação:
Postado Originalmente por GBastos
Mas entao o ParamCount não retorna o número de parametros reais, so retorna o número de parametros depois do executavel?
Exatamente.
__________________
Minha coleção de jogos (todos originais)
romulo está offline   Responder com Quote
Antigo 09-05-2003, 15:09   #15 (permalink)
GBastos
Super Participante
 
Avatar de GBastos
 
Registrado em: Sep 2001
Localização: Salvador, Bahia
Idade: 32
Mensagens: 770
Reputação: 22 GBastos está indo no caminho certo
Padrão

Citação:
Postado Originalmente por romulo
Exatamente.
Era isso mesmo! Outra coisa, fiz uns testes e descobri que essas variáveis ficam inacessiveis devido a otimização...

O problema agora se transformou em outro, ao tentar criar o form child está dando algo como Could not create form. There is no active MDI form.

Porém o form está ativo, inclusive antes esse mesmo código funcionava, agora q botei essas variáveis q tá dando pau...
O código q funcionava era o seguinte:
Código:
procedure TPrincipalForm.NovoArquivo(Sender: TObject); begin QuantJanelasNovas := QuantJanelasNovas + 1; TEditorForm.Create(self); end;
Pode parecer estranho mas funcionava, agora mudei para:
Código:
procedure TPrincipalForm.NovoArquivo(Sender: TObject); var EditorForm: TEditorForm; begin QuantJanelasNovas := QuantJanelasNovas + 1; EditorForm := TEditorForm.Create(Self); if ParamCount > 0 then EditorForm.Abrir(ParamStr(1)); end;
E dá esse erro q falei na linha do Create... Tentei tb mudar o nome do procedimento para NewChild como aconselha a documentação do Delphi, mas dá o mesmo erro...
__________________
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
GBastos está offline   Responder com Quote
Antigo 09-05-2003, 15:51   #16 (permalink)
romulo
Zumbi
 
Registrado em: Dec 2001
Localização: Fortaleza / CE
Mensagens: 7.506
Reputação: 31 romulo está indo no caminho certo
Enviar mensagem via ICQ para romulo
Padrão

Citação:
Postado Originalmente por GBastos
Era isso mesmo! Outra coisa, fiz uns testes e descobri que essas variáveis ficam inacessiveis devido a otimização...
...
Será que sem querer você não mudou o FormStyle do FormPrincipal?
__________________
Minha coleção de jogos (todos originais)
romulo está offline   Responder com Quote
Antigo 09-05-2003, 17:46   #17 (permalink)
GBastos
Super Participante
 
Avatar de GBastos
 
Registrado em: Sep 2001
Localização: Salvador, Bahia
Idade: 32
Mensagens: 770
Reputação: 22 GBastos está indo no caminho certo
Padrão

Citação:
Postado Originalmente por romulo
Será que sem querer você não mudou o FormStyle do FormPrincipal?
:lol: Heheheheh, foi a primeira coisa q pensei tb, mas tá certo lá...
__________________
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
GBastos está offline   Responder com Quote
Antigo 09-05-2003, 19:03   #18 (permalink)
romulo
Zumbi
 
Registrado em: Dec 2001
Localização: Fortaleza / CE
Mensagens: 7.506
Reputação: 31 romulo está indo no caminho certo
Enviar mensagem via ICQ para romulo
Padrão

Citação:
Postado Originalmente por GBastos
:lol: Heheheheh, foi a primeira coisa q pensei tb, mas tá certo lá...
Vou fazer uns testes aqui nesse fim de semana pra ver se descubro o que é. Se eu demorar a responder me manda uma MP, que eu sou meio esquecido... ops: :lol:
__________________
Minha coleção de jogos (todos originais)
romulo está offline   Responder com Quote
Antigo 09-05-2003, 19:08   #19 (permalink)
GBastos
Super Participante
 
Avatar de GBastos
 
Registrado em: Sep 2001
Localização: Salvador, Bahia
Idade: 32
Mensagens: 770
Reputação: 22 GBastos está indo no caminho certo
Padrão

Citação:
Postado Originalmente por romulo
Vou fazer uns testes aqui nesse fim de semana pra ver se descubro o que é. Se eu demorar a responder me manda uma MP,...
Hehehehe, estou sem acesso a internet em casa, vou fazer uns testes tb e digo o q aconteceu na segunda..
__________________
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
GBastos está offline   Responder com Quote
Antigo 12-05-2003, 13:39   #20 (permalink)
GBastos
Super Participante
 
Avatar de GBastos
 
Registrado em: Sep 2001
Localização: Salvador, Bahia
Idade: 32
Mensagens: 770
Reputação: 22 GBastos está indo no caminho certo
Padrão

Descobri o problema, uma das chamadas do procedimento estava vindo do TPrincipalForm.Create, então na verdade o form ainda não estava criado quando a chamada era feita... Resolvi botando um timer para so chamar a função depois de 0.1 segundo... Mas será que não teria uma solução mais elegante q esse hack?

Outra coisa, voltando à questão do tópico, existe alguma maneira fácil de lidar com nomes de diretórios com espaço ou só fazendo uma função para gerenciar isso? Tipo:
c:\arquivos de programas\borland\delphi\projects\pad.exe c:\windows\profiles\gustavo bastos\desktop\teste.txt
Na verdade ele acha que c:\windows\profiles\gustavo é o parâmetro 1 e bastos\desktop\teste.txt o 2...
__________________
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
GBastos está offline   Responder com Quote
Resposta


Opções do Tópico

Regras de Mensagens
Você não pode criar tópicos
Você não pode postar respostas
Você não pode anexar arquivos
Você não pode editar suas mensagens

Código vB está Ligado
Smiles estão Ligado
Código [IMG] está Ligado
Código HTML está Desligado
Ir para...


Horários baseados na GMT -3. Agora são 12:19.