O Delphi3 começou a ter o componente TWebBrowser, mas apareceu na forma de controles ActiveX naquele momento e precisava ser introduzido por si só. O painel do componente está ativado. Costumo ouvir as pessoas que repreendem Delphi por fazer muito mal. Será mais.
Aqui estão algumas experiências sobre o uso de TWebBrowser para fazer programas e alguns exemplos e informações coletadas na Internet.
1. Inicialização e finalização
Quando você executa um método de TwebBrowser para executar a operação desejada, como execwb, etc., você pode ter encontrado erros como "tentando ativar o alvo ausente não registrado" ou "objeto ole não registrado" ou não há erro, mas Não é feito. Quando o usei para programar, descobri que o Execwb às vezes funciona, mas às vezes não funciona. Também foi uma oportunidade acidental que eu percebi que os objetos OLE precisavam ser inicializados e encerrados (há poucas coisas para entender).
Eu usei o método mencionado no meu artigo anterior "Delphi Program Window Animation & Solutions for Normal Louco de Arranjo". Finalmente consegui! A razão, acho que é provavelmente porque o TWebBrowser é um objeto OLE incorporado e não é um VCL escrito em Delphi.
Inicialização
Oleinitializar (nulo);
Finalização
tentar
Oleuninitializar;
exceto
fim;
Essas frases são colocadas depois de todas as declarações na janela principal, antes de "fim".
-------------------------------------------------------- -----------------------------------
2. EmpheyParam
No Delphi 5, o método de navegação do TWebBrowser está sobrecarregado várias vezes:
Procedimento Navegue (URL const: WideString);
Procedimento Navegue (const URL: wideString; var sinalizadores:
Olevariant);
Procedimento Navegue (const URL: wideString; var sinalizadores:
Olevariant;
Procedimento Navegue (const URL: wideString; var sinalizadores:
Olevariant;
Olevariant);
Procedimento Navegue (const URL: wideString; var sinalizadores:
Olevariant;
Olevariant;
Em aplicações reais, ao chamar o último método, pois raramente usamos os últimos parâmetros, mas a declaração de função requer parâmetros variáveis, o método geral é o seguinte:
var
T: Olevariant;
Começar
webbrowser1.navigate (edit1.text, t, t, t, t);
fim;
É muito problemático definir a variável t (e ainda existem muitos lugares para usá -la). De fato, podemos usar o vazio (emapaparam é uma variável vazia de variante comum, não atribua um valor a ele), apenas uma frase:
webbrowser1.navigate (edit1.text, esvazyParam, esvaziPyparam, vazio, esvaziado);
Embora seja um pouco mais longo, é muito mais conveniente do que definir variáveis sempre. Obviamente, o primeiro método também pode ser usado.
webbrowser1.navigate (edit1.text)
-------------------------------------------------------- -----------------------------------
3. Operações de comando comuns podem ser concluídas usando o método EXECWB.
Procedimento Execwb (CMDID: OLECMDID; CMDEXECOPT:
OLECMDEXECOT);
Procedimento Execwb (CMDID: OLECMDID; CMDEXECOPT: OLECMDEXECOT;
var Pvain:
Olevariant);
Procedimento Execwb (CMDID: ROLECMDID; CMDEXECOPT:
OLECMDEXECOT;
Olevariant;
Aberto: a caixa de diálogo "Endereço da Internet aberto" aparece, e o CommandId é OLECMDID_OPEN (se a versão do navegador for IE5.0,
Então este comando não está disponível).
Salve como: ligue para a caixa de diálogo Salvar como.
EXECWB (OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT,
EsvaziPPARAM,
EsvaziPPARAM);
IMPRIMEIRA, IMPRIMEIRA ENFIGURAÇÕES DE VIVERAÇÃO E PÁGINA: Ligue para as caixas de diálogo "Imprimir", "Imprimir visualização" e "Configurações da página" (ou5.5 e acima suportam apenas as versões "Type"
Visualização de impressão, portanto, a implementação deve verificar se este comando está disponível).
EXECWB (OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT,
EsvaziPPARAM,
EsvaziPPARAM);
Se querystatuswb (olecmdid_printpreview) = 3 então
EXECWB (OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT,
EsvaziPPARAM, vazio);
EXECWB (OLECMDID_PAGESETUP, OLECMDEXECOPT_DODEFAULT,
EsvaziPPARAM,
EsvaziPPARAM);
Corte, copie, cola, selecione tudo: não há necessidade de dizer muito sobre a função, é importante observar que o corte e a colagem não apenas fornecem texto para editar quadros, mas também sem edição nas páginas da web.
O texto da caixa de edição também é eficaz. Obter seu comando Ativar status
Existem duas maneiras de executar comandos (tomando uma cópia como exemplo, cortar, colar e selecionar tudo substituirá as respectivas palavras -chave.
Basta alterá -lo, a saber, colar e selecionar, respectivamente):
A. Use o método de querystatuswb do twebbrowser.
if (querystatuswb (olecmdid_copy) = olecmdf_enabled) ou
Olecmdf_supportd) então
EXECWB (OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT,
EsvaziPPARAM,
EsvaziPPARAM);
B. Use o método QueryCommandenabled do iHtMLDocument2.
var
Doc: ihtmldocument2;
Começar
Doc: = webbrowser1.document como ihtmldocument2;
Se doc.QueryCommandeNabled ('cópia') então
Doc.execCommand ('cópia', false, esvaziPPARAM);
fim;
Pesquisa: consulte a nona função "encontre".
-------------------------------------------------------- -----------------------------------
4. Tamanho da fonte
Semelhante aos cinco itens do "máximo" ao "mínimo" no menu "Fonte" (correspondente a números inteiros 0 ~ 4, maior, etc., assumindo que os nomes dos cinco itens de menu são os seguintes, tag, tag
As propriedades são definidas como 0 ~ 4, respectivamente).
A. Leia o tamanho da fonte da página atual.
var
T: Olevariant;
Começar
Webbrowser1.execwb (olecmdid_zoom,
OLECMDEXECOPT_DONTPROMPTUSER,
Esvaziado, t);
Caso T de
4: maior.CHecked: = true;
3: maior.CHecked: = true;
2: Middle.CHecked: = true;
1: pequeno.CHecked: = true;
0: menor.CHecked: = true;
fim;
fim;
B. Defina o tamanho da fonte da página.
Maior.ccecked: = false;
Maior.CHecked: = false;
Middle.Ceched: = false;
Pequeno.CHecked: = false;
Menor.CHecked: = false;
Tmenuitem (remetente) .CHecked: = true;
t: = tmenuitem (remetente) .tag;
Webbrowser1.execwb (olecmdid_zoom,
OLECMDEXECOPT_DONTPROMPTUSER,
t, t);
-------------------------------------------------------- -----------------------------------
5. Adicione aos favoritos e organize os favoritos
const
Clsid_shelluihelper: tguid =
'{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}';
var
P: Procedimento (alça: THANDLE; Caminho: PChar);
procedimento TFFORM1.OrganizeFavorite (remetente: Tobject);
var
H: hwnd;
Começar
H: = loadlibrary (pchar ('shdocvw.dll'));
Se h <> 0 então
Começar
P: = getProcaddress (H, PChar ('DoornizeFavdlg'));
se atribuído (p) então P (Application.Handle,
PCHO (favfolder));
fim;
Freelibrary (H);
fim;
procedimento TForm1.AddFavorite (remetente: Tobject);
var
Shelluihelper: Ishelluihelper;
URL, Título: Olevariant;
Começar
Título: = webbrowser1.locationName;
Url: = webbrowser1.locationurl;
Se url <> '' então
Começar
ShelluiHelper: = CreateComObject (clsid_shelluihelper) como
Ishelluihelper;
Shelluihelper.addFavorite (URL, título);
fim;
fim;
O método de usar o método acima para abrir a caixa de diálogo "Adicionar aos favoritos" através da interface Ishelluihelper é relativamente simples, mas há uma desvantagem, ou seja, a janela aberta não é uma janela de modo, mas é independente do aplicativo. É concebível que, se você usar o mesmo método que o procedimento OrganizeFavorite para abrir a caixa de diálogo, poderá implementar naturalmente a janela do modo porque pode especificar o identificador da janela dos pais (o efeito é o mesmo que abrir o "adicione ao favorito" diálogo no Explorer e IE). O problema é obviamente isso. Não importava se era uma janela de padrão?
O processo a seguir informará o protótipo de função do doaddtofavdlg. Deve -se notar que a caixa de diálogo aberta dessa maneira não executa a operação "Adicionar aos favoritos". quer colocar o atalho da Internet.
procedimento TForm1.AddFavorite (ou seja: TEFEDDEDWB);
Procedimento CreateUrl (AurlPath, AURL: PChar);
var
URLFILE: TINIFILE;
Começar
Urlfile: = tinifile.create (string (aurlpath));
rlfile.writestring ('InternetShortcut', 'url',
String (aurl));
rlfile.free;
fim;
var
AddFav: function (alça: THANDLE;
Urlpath: pchar;
Título: Pchar;
Favidlist: pitemidlist): bool;
Fdoc: ihtmldocument2;
Urlpath, url, título: matriz [0..max_path] de char;
H: hwnd;
pidl: pitemidlist;
Lento: bool;
Começar
Fdoc: = ihtmldocument2 (ie.document);
se fdoc = nil, então saia;
StrpCopy (title, fdoc.get_title);
StrpCopy (url, fdoc.get_url);
Se url <> '' então
Começar
H: = loadlibrary (pchar ('shdocvw.dll'));
Se h <> 0 então
Começar
ShgetSpecialFolderLocation (0, csidl_favorites, pidl);
AddFav: = getProcaddress (h, pchar ('doaddtofavdlg');
se atribuído (addfav), então
Lento: = addfav (alça, urlpath, sizeof (urlpath),
Título, sizeof (título), pidl)
fim;
Freelibrary (H);
Se Fretok então
Createurl (urlpath, url);
fim
fim;
-------------------------------------------------------- -----------------------------------
6. Faça o foco do Webbrowser
O TwebBrowser é muito especial.
O próprio Explorer possui teclas de atalho, a solução é a seguinte:
procedimento TFFORM1.SETFOCUSTODOC;
Começar
Se webbrowser1.document <> nil então
com webbrowser1.application como ioleObject Do
Doverb (oleiverb_uiactivate, nil, webbrowser1, 0, alça,
GetClientRect);
fim;
Além disso, também encontrei uma maneira mais fácil, que está listada aqui:
Se webbrowser1.document <> nil então
Ihtmlwindow2 (ihtmldocument2 (webbrowser1.document) .parentwindow) .focus
Acabei de encontrar uma maneira mais fácil, talvez a mais fácil:
Se webbrowser1.document <> nil então
Ihtmlwindow4 (webbrowser1.document) .focus
Além disso, você precisa determinar se o documento ganhou foco:
Se ihtmlwindow4 (webbrowser1.document) .hasfocus então
-------------------------------------------------------- -----------------------------------
7. Clique no botão "Enviar"
Assim como há um botão "padrão" em cada formulário no programa, cada formulário na página da web também possui um botão "padrão" - ou seja, um botão com o atributo "Enviar". é equivalente a clicar em "Enviar" no mouse. No entanto, o twebbrowser não parece responder à tecla Enter e, mesmo que a visualização do formulário que contém o twebbrowser seja definida como true, as chaves enviadas pelo usuário para o TWEBBrowser não podem ser interceptadas no evento KeyPress do formulário.
Minha solução é usar o componente ApplicatineVents ou escrever o evento OnMessage do objeto Tapplication por si mesmo, julgar o tipo de mensagem e responder à mensagem do teclado. Quanto ao botão "Enviar", você pode fazer isso analisando o código -fonte da Web, mas encontrei um método mais simples e mais rápido. Alguém escreveu.
A. Use a função SendKeys para enviar a tecla Enter para WebBrowser
Em Delphi
5 Existe um arquivo SNDKEY32.PAS no diretório INFO/EXTRAS/SENDKEYS no CD, que contém duas funções SendKeys e AppActivate. É muito simples.
SendKeys ('~', verdadeiro); // Pressione a tecla de retorno
A descrição detalhada do parâmetro da função SendKeys, etc., está incluída no arquivo SNDKEY32.PAS.
B. Passe a mensagem de teclado recebida para o WebBrowser no evento OnMessage.
Procedimento TForm1.ApplicationEvents1Message (var msg: TMSG;
var manipulado: booleano);
{Corrige o mau funcionamento de algumas chaves no Webbrowser
controlar}
const
Stdkeys = [vk_tab, vk_return];
Extkeys = [vk_delete, vk_back, vk_left, vk_right];
chaves estendidas}
fextended = $ 01000000;
Começar
Manipulado: = false;
com msg do
if ((mensagem> = wm_keyfirst) e (mensagem <= wm_keylast)))
e
((wparam em stdkeys) ou
{$ Ifdef ver120} (getKeyState (vk_control) <0) ou {$ endif}
(wparam em extkeys) e
((lparam e fextended) = fextended)) Então
tentar
Se Ischild (Handle, hwnd), então {lida com todo o navegador
Mensagens relacionadas}
Começar
com {$ ifdef
Ver120} aplicativo _ {$ else} aplicativo {$ endif} como
IoleinplaceActiveObject do
Manipulado: = translateAccelerator (msg) = s_ok;
Se não for tratado então
Começar
Manipulado: = true;
TRANTLATEMESSAGE (MSG);
DispatchMessage (MSG);
fim;
fim;
exceto
fim;
fim; // MessageHandler
(Este método vem de incorporadowb.pas)
-------------------------------------------------------- -----------------------------------
8. Obtenha o código -fonte da página da web e HTML diretamente do TwebBrowser
Vamos primeiro introduzir um método extremamente simples para obter o código -fonte da página da web que o TwebBrowser está acessando. O método geral é usar a interface dos imersistas fornecida pelo objeto Document no controle TWEBBrowser para implementá -lo. Tamanho do código -fonte HTML, aloque o bloco global de memória da heap, crie um fluxo e, em seguida, escreva texto HTML no fluxo. Embora o programa não seja complicado, existem métodos mais simples, portanto o código de implementação não é mais fornecido. De fato, basicamente todas as funções do IE TwebBrowser devem ter uma maneira relativamente simples de implementá -las, e o mesmo é verdade para obter o código -fonte da página da web. O código a seguir exibe o código -fonte da página da web no Memo1.
Memo1.Lines.add (ihtmldocument2 (webbrowser1.document) .body.outerhtml);
Ao mesmo tempo, é muito simples salvar os arquivos HTML como arquivos de texto ao navegar no TwebBrowser, e nenhuma ferramenta de análise de sintaxe é necessária, porque o TWEBBrowser também é concluído, da seguinte forma:
Memo1.Lines.add (ihtmldocument2 (webbrowser1.document) .body.outerText);
-------------------------------------------------------- -----------------------------------
9. "Encontre" função
A caixa de diálogo Pesquisa pode ser chamada pressionando a tecla Ctrl-F quando o documento recebe o foco. O programa para fazer isso.
var
Doc: ihtmldocument2;
TxTrange: ihtmltxTrange;
Começar
Doc: = webbrowser1.document como ihtmldocument2;
DOC.SELECTALL;
// Esta frase é particularmente importante, porque a premissa de que o método do objeto ihtmltxtrange pode ser operado é
// O documento já possui uma área de seleção de texto. Como a seguinte declaração é executada, não será
// Consulte o processo de selecionar todos os documentos.
TxTrange: = doc.Selection.CreaterRange como ihtmltxTrange;
TxTrange.findText ('texto a ser pesquisado', 0,0);
TxTrange.Select;
fim;
Além disso, você pode obter o conteúdo de texto atualmente selecionado no txt.get_text, que é útil em algum momento.
-------------------------------------------------------- -----------------------------------
10. Extraia todos os links na página da web
Esse método vem de um amigo do Fórum de Monopólio, respondendo a uma pergunta.
var
Doc: ihtmldocument2;
Todos: ihtmlelementcollection;
Len, I: Inteiro;
Item: Olevariant;
Começar
doc: = webbrowser1 .Document como ihtmldocument2;
Todos: = doc.get_links;
len: = all.length;
para i: = 0 a len-1 comece
item: = all.item (i, varepty);
memor1.lines.add (item.href);
fim;
fim;
-------------------------------------------------------- -----------------------------------
11. Defina a codificação de Twebbrowser
Por que sempre sinto falta de muitas oportunidades? Na verdade, eu deveria ter pensado nisso por um longo tempo, mas uma diferença de pensamento a tornará um mundo de diferença. Se eu tivesse pensado mais sobre isso e tentei mais, não teria sido classificado em 11º. Aqui está uma função, que é inimaginavelmente simples de resolver.
Procedimento setcharset (AWEBBROWSER: TWEBBROWSER; ACHARST:
Corda);
var
Refresco: Olevariant;
Começar
Ihtmldocument2 (awebbrowser.document) .set_charset (acharset);
Refreshlevel: = 7;
Awebbrowser.Refresh2 (Refreshlevel);
Fim;