Fórum Integrando Delphi com Internet Explorer #4198
31/03/2009
0
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
Curtir tópico
+ 0Posts
31/03/2009
Rodrigo Mourão
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
Gostei + 0
31/03/2009
Alexandre Furlan
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
Gostei + 0
31/03/2009
Rodrigo Mourão
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
Gostei + 0
01/04/2009
Alexandre Furlan
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
Gostei + 0
01/04/2009
Rodrigo Mourão
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
Gostei + 0
01/04/2009
Alexandre Furlan
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
Gostei + 0
01/04/2009
Rodrigo Mourão
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
Gostei + 0
02/04/2009
Alexandre Furlan
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
Gostei + 0
02/04/2009
Rodrigo Mourão
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
Gostei + 0
02/04/2009
Alexandre Furlan
Estou no aguarde oque você poder fazer por min
eu fico muito grato
um forte abraço
Gostei + 0
06/04/2009
Rodrigo Mourão
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)