GARANTIR DESCONTO

Fórum Integrando Delphi com Internet Explorer #4198

31/03/2009

0

Ola,

Gostaria de sabe como é possivel criar um programa que me faça a seguinte função
Queria preencher automaticamente um form de uma pagina especifica.

Ex:

www.meusite.com.br/estoque/inserir.asp

onde existem os campos:
Nome -> Quantidade -> Descrição

como posso passar os dados de um prorgrama em delphi para essa pagina!!!


Obs.: gostaria de usar essa funcao no Internet Explorer... e não com um componente no delphi..

Alexandre Furlan

Alexandre Furlan

Responder

Posts

31/03/2009

Rodrigo Mourão

Olá Alexandre !!!   A programação Web é muito diferente de programção Win32. Dúvidas como a sua são muito comuns porém inviavel do ponte de vista Técnico !!!   Primeiro Pq paginas asp, assim como asp.net, php e outras são geradas dinamicamente pelo engine da linguagem de script que esta no servidor. Sendo assim via Delphi isso não é possivel.   Uma solução seria criar script  "maliciosos" onde você tentaria enviar instrições para o servidor para então preencher os campos que deseja mas isso iria esbarrar na parte de segurança do site.   Se voce possui acesso ao site ou conhece o desenvolvedor e possivel solicitar a criacao de um canal para que possa enviar os dados via Delphi ou qualquer outra lingugem atraves de WebServices. Por isso essa tecnologia tem crescido tanto, pois com ela podemos fazer tudo em um site com qualquer linguagem sem nem mesmo depender de browser !!   Estamos a disposição !!!   Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
Responder

Gostei + 0

31/03/2009

Alexandre Furlan

Ola...

Tenho um codigo aqui mas ele e meio defeituoso... gostaria que voce desse uma olhada nele

procedure TMainForm.Button1Click(Sender: TObject);var  hIE: HWND;  ShellWindow: IShellWindows;  WB: IWebbrowser2;  spDisp: IDispatch;  IDoc1: IHTMLDocument2;  Document: Variant;  k, m: Integer;  ovElements: OleVariant;  i: Integer;begin  ShellWindow := CoShellWindows.Create;  for k := 0 to ShellWindow.Count do  begin    spDisp := ShellWindow.Item(k);    if spDisp = nil then Continue;      spDisp.QueryInterface(iWebBrowser2, WB);      if WB <> nil then      begin        WB.Document.QueryInterface(IHTMLDocument2, iDoc1);        if iDoc1 <> nil then        begin          WB := ShellWindow.Item(k) as IWebbrowser2;          begin            Document := WB.Document;              for m := 0 to Document.forms.Length - 1 do              begin                ovElements := Document.forms.Item(m).elements;                for i := 0 to ovElements.Length - 1 do                begin                  ovElements.item('q').Value = 'Busca';                end;              end;           end;        end;      end;  end;end;


assim ele vai setar o valor do input q... seria um teste ao google.. como voce pode ver ele é funcional para quando você tem uma instancia apenas aberta do internet explorer, quando passa de mais de uma janela aberta ele comeca a dar erros.... tu poderia analisar isso e se possivel me dizer como fazer isso funcionar apenas no site que eu queira www.meusite.com
Agradeço desde já

Abraços
Responder

Gostei + 0

31/03/2009

Rodrigo Mourão

Olá Alexandre, deculpe descordar mas o código acima não está nenhum pouco funcional, não do ponto de vista tecnico. E cou lhe mostrar o motivo.

1) Primeiro ele faz isso de interface dos objetos COM que a mivcrosoft utiliza nos programas que fazem parte do windowas, como IE, Calc, WordPad, etc. Isso é ruim pois muda a versão do SO e corremos o risco de nosso codigo nao funcionar mais.

2) O segundo motivo vc mesmo disse, se tivermos mais de um Browser aberto teremos um comportamento inesperado pois como vc ve ele localiza um Browser aberto para fazer uma varedurra nele.

3) Repare no que é feito, não sei se você conhece tecnologia COM mas o que ele esta fazendo ai seria mais ou menos o seguinte. E como se eu verificasse se sua aplicacao esta aberta. Se sim varro todos os forms dela tentando localizar o From de cliente. Achando varro todos os controles do Form tetando localizar um Edit especifico e por fim achando o Edit escrevo dentro dele. E o que o codigo faz porem faz uma varredura na pagina aberta no borwser.


Existe ainda um outro fato que são essas interfaces como IShellWindows,  IHTMLDocument2, etc.  Eu desconheco essas interfaces provavelmente você ou alguem deve ter impotado de alguma TypeLibrary (TLB).

Se me informar qual é a type labray onde estão as interfaces posso ver (mas não garanto sucesso) se consigo algo diferente.

Abs !!!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi

Responder

Gostei + 0

01/04/2009

Alexandre Furlan

Bom dia,

Rapaz eu nao sei nada sobre esse codigo que lhe mostrei

achei isto em um forum chines....

por isso gostaria que você desse uma olhada nele....

e me desse algumas dicas de como melhoralo para pegar o setar o valor das inputs

quando estiver no site X

se poder fazer isso por min eu fico grato

se não eu agradeco da mesma forma

um forte abraço
Responder

Gostei + 0

01/04/2009

Rodrigo Mourão

Então alexandre como lhe falei. Para que eu possa modificar o codigo preciso da TypeLibra. 
Pelos fatos expostos abaixo acredito ser inviável o feito. Mas de qualquer forma estamos sempre a disposição.

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi



Responder

Gostei + 0

01/04/2009

Alexandre Furlan

Pelo que vejo sao API's do Windows creio que isso possa lhe ajudar

IShellWindows:- Esta e para identificar as Janelas- http://msdn.microsoft.com/en-us/library/cc836570%28VS.85%29.aspx
IHTMLDocument2:- Creio que esta e para trabalhar no HTML- http://msdn.microsoft.com/en-us/library/aa752574%28VS.85%29.aspx
Responder

Gostei + 0

01/04/2009

Rodrigo Mourão

Olá Alexandre !!

Sei que isso é API do windows porem o porblema e justamente o Delphi acessar a API. Isso pode ser feito de duas formas ou dando uses numa unit com metodos mapeados da API, como é o caso da uses em ShellAPI ou entao utilizando uma Type Library como e o caso do Word. Podemos abrir o word, criar um documento, formatar e salvar de dentro do delhpi mas tem que ter a TLB com as interfaces.

Como lhe falei: se voce tiver a unit com o mapeamento desta interface ou entao a TypeLabrary entao poderei tentar algo.

Abs !!!


Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi


Responder

Gostei + 0

02/04/2009

Alexandre Furlan

Ola,
Agora eu intendi oque voce quis dizer....
realmente eu tive um trabalho de achar essa TBL
Neste link que estou mandando contem o zip com as 2 TBL
http://www.sendspace.com/file/0uuhgy
Um Forte Abraço
Responder

Gostei + 0

02/04/2009

Rodrigo Mourão

Olá Alexandre !!  Agora sim posso tentar ajudá-lo !!

Como lhe falei abaixo o código está muito espedífico mas vou analizar as units e ve se podemos fazer algo porém não posso garantir sucesso!!

Peço que aguarde enquanto realizo os testes !!

Obrigado !!!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
Responder

Gostei + 0

02/04/2009

Alexandre Furlan

Ola Ricardo

Estou no aguarde oque você poder fazer por min

eu fico muito grato

um forte abraço
Responder

Gostei + 0

06/04/2009

Rodrigo Mourão

Olá Amigo !!!

Não deu pra fazer muito coisa não pois o codigo faz uma busca em qualquer janela aberta que implemente a interface IBrowser. Se voce tiver com o Winsdows Explore aberto ele vai buscar no WE também.

Entao o que eu fiz foi dar uma maretada no codigo e amarrar para buscar se so tiver no endereço especifico. Lá em baixo tambem coloquei um try except para poder omitir qualquer acess violation que possa dar. Segue codigo:

var
  ShellWindow: IShellWindows;
  WB: IWebbrowser2;
  spDisp: IDispatch;
  IDoc1: IHTMLDocument2;
  Document: Variant;
  I, J, X: Integer;
  ovElements: OleVariant;
begin
  ShellWindow := CoShellWindows.Create;
  for I := 0 to ShellWindow.Count do
  begin
    spDisp := ShellWindow.Item(I);
    if spDisp = nil then Continue;
      spDisp.QueryInterface(IWebBrowser, WB);
      if WB <> nil then
      begin
        //troque pelo seu endereco
        if  WB.Get_LocationURL = 'http://www.google.com.br/' then
        begin
          WB.Document.QueryInterface(IHTMLDocument2, IDoc1);
          if IDoc1 <> nil then
          begin
            WB := ShellWindow.Item(I) as IWebbrowser2;
            Document := WB.Document;
            for J := 0 to Document.forms.Length - 1 do
            begin
              ovElements := Document.forms.Item(J).elements;
              for X := 0 to ovElements.Length - 1 do
              begin
                try
                  //troque o 'q' pelo nome do edit na pagina html
                  ovElements.item('q').Value := 'Busca';
                except

                end;
              end;
            end;
          end;
        end;
      end;
  end;
end;



Espero ter ajudado !!!

Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar