Mostrando postagens com marcador Programação. Mostrar todas as postagens
Mostrando postagens com marcador Programação. Mostrar todas as postagens

sábado, 6 de dezembro de 2008

Criando o navegador básico

Inicie um novo projeto no Delphi (quando ele é aberto, ele já faz isso, é iniciado com um projeto vazio). Vamos inserir no formulário dois quadros: um painel, onde ficarão os botões e a barra de endereços, e o quadro de visualização HTML.

Para inserir um painel, clique no componente "painel" da paleta de componentes, e clique uma vez dentro da tela da janela do programa (o formulário). Veja:

fig1
o componente "panel", "painel"

fig2
o componente inserido no formulário


Vamos ajustar algumas propriedades desse componente, para que ele fique no topo, e sem o texto "Panel1" dentro. Clique uma vez nele para selecioná-lo, e no inspetor de objetos (a janela de propriedades do objeto, se você não sabe, leia o texto do link que indiquei mais acima), localize a propriedade "Caption". Remova o texto dela, deixando assim:

fig3
Para que esse painel fique alinhado na parte superior da tela, localize nessa mesma janela a propriedade "Align", e deixe com o valor "AlTop":

fig4
Com o painel selecionado, clique na borda inferior dele e arraste para baixo, até ficar num tamanho ideal para você.

Agora insira o componente "TWebBrowser". Ele fica na guia "Internet" da paleta de componentes do Delphi, normalmente é o último dessa guia. Não o insira dentro do painel, mas sim fora, ou seja, clique nele uma vez, depois clique na área livre do formulário. Veja como ficará:


fig5
o componente "TWebBrowser"


fig6
o componente inserido no formulário



Ajuste a propriedade "Align" dele assim como você fez com o painel, mas agora escolha "AlClient". Isso faz com que ele ocupe toda a área restante da tela, mesmo que o usuário maximize ou redimensione a janela.

Vamos inserir uma barra de endereços simples (não uma lista, por ser um tutorial para iniciantes nessa área) e os botões "Voltar", "Avançar", "Parar" e "Atualizar". Selecione o componente "Button", "botão", da aba "Standard" dos componentes do Delphi, e insira-o dentro do painel. Agora sim, clique dentro do painel, para que ele fique "dentro" do painel. Se você colocá-lo fora, ele não acompanhará o local fixo no painel, por exemplo, podendo ficar fora do lugar dependendo do tamanho da janela.


fig7
o componente "Button", "botão"


fig8
ele inserido no formulário, dentro do painel


Agora você já deve estar pegando mais intimidade com a inserção de componentes. Insira mais três botões, ao lado desse. Você pode copiá-lo e colá-lo! Clique uma vez nele, ele ficará selecionado (o botão). Tecle CTRL+C e depois CTRL+V, e ele será inserido dentro do painel, depois tecle CTRL+V duas vezes para colar mais dois, e arraste cada um para os seus lugares, de modo a deixar o visual organizado.

Nota para usuários do Visual Basic: se você colar, ele poderá perguntar na primeira vez se você quer que ele crie um "array". Diga que não, ele simplesmente colará. Se você confirmar o "array", todos os botões colados a partir do mesmo receberão o mesmo nome, e os eventos serão diferenciados por meio de um índice. Isso é diferente no Delphi, mas é semelhante: para compartilhar eventos, cada objeto tem um nome diferente e compartilham apenas o evento; por meio do identificador ("Sender") pode-se saber qual botão originou o evento, o que no Visual Basic seria identificado por um índice (um número).

Agora altere os textos dos botões. Selecione um por um, localize a propriedade "Caption" no inspetor de objetos, e digite o texto desejado. Para nosso exemplo, coloque "Voltar" no primeiro botão, "Avançar" no segundo, "Parar" no terceiro e "Atualizar" no quarto.

Para inserir uma barra de endereços, clique no componente "Edit", da aba "Standard" da paleta de componentes, e insira-o também dentro do painel, logo abaixo dos botões (redimensione o painel, se necessário, clicando nele e arrastando a linha inferior para baixo). Redimensione o campo de texto ("Edit") até ficar com um tamanho razoável, para digitar um endereço da Internet. Com o "Edit" selecionado, remova o texto dele. Basta limpar o texto da propriedade "Text", pelo inspetor de objetos.


fig9
o componente "Edit", um campo de texto

fig10
aspecto de como está ficando o programa



Para não perder, salve o projeto. Clique no botão "Salvar tudo" do Delphi, ou no menu "File > Save all", como é a primeira vez. Primeiro salve o arquivo de projeto, de extensão ".dpr". Coloque o nome principal do seu programa, de preferência sem espaço, será o mesmo nome do executável. Por exemplo, "Navegador". Ao clicar em Salvar na janela "Salvar", aparecerá uma outra, agora para salvar a unidade de código do formulário, um arquivo ".pas". Pode deixar o padrão, "Unit1.pas", se você quiser.

O componente WebBrowser usa toda a estrutura do IE, como comentei no começo do arquivo. Para fazê-lo "funcionar", o que seu programa tem que fazer é chamar as funções corretas dele. Algumas são documentadas, outras creio que não... Mas para as mais comuns não há segredo.

Dica: para facilitar as referências, vamos renomear o WebBrowser para um nome mais curto. Selecione o quadro branco do IE, e altere a propriedade "Name" dele, pelo inspetor de objetos. Usarei aqui "web", um nome fácil de identificar e curtinho.

Selecione a barra de endereços, o "Edit1". Quando a pessoa digitar alguma coisa e teclar [enter], o navegador será chamado. Para isso, deveremos configurar o evento da barra de endereços responsável por reconhecer o [enter], e por chamar o navegador.

Selecione a barra de endereços, e vá para a aba "Events" do Object Inspector (na mesma janela onde você altera os títulos, textos, propriedades dos componentes...).

fig11
a aba "Events" do Inspetor de Objetos


Nessa aba podemos personalizar os eventos dos objetos. Os eventos são ações que podem ser realizadas pelo usuário ou pelo programa. Por exemplo, quando o usuário clica num componente visual, o evento onClick é chamado, e o código contido nele será executado. Se o usuário nunca clicar nesse botão, esse código nunca seria executado. Para definir um código, uma ação, quando o usuário teclar [enter] no campo de texto, devemos inserir os comandos no evento "onKeyDown", que pode ser entendido como "aoApertarUmaTecla". Ele é chamado para todas as teclas enquanto o componente de texto estiver com o foco, então deveremos também incluir um verificador, para verificar se a tecla pressionada foi [enter]. Se for, faremos uma chamada ao componente do navegador para abrir o endereço digitado. Se não for, não faremos nada e deixaremos o usuário terminar de digitar :)

Localize o evento "onKeyDown" (não se esqueça de selecionar o "Edit1" antes!), e dê um duplo clique no quadrinho em branco à sua esquerda, onde você percebe que pode digitar algo:

fig12
A janela de código será aberta no ponto correspondente, o Dephi já preparará toda a estrutura para você digitar os comandos. Digite isso, entre o begin e o end:


if Key = VK_RETURN then
web.Navigate(Edit1.Text);


Veja na tela, como ficaria:

fig13

Vamos entender esse código... Traduzindo-o para o português:
se Tecla = Enter então
navegador.Abre(site digitado no campo de endereço);
A estrutura dependerá da linguagem de programação em uso, não se esqueça que este tutorial é de Delphi, portanto, não bastará "copiar e colar" esse mesmo código no Visual Basic ou C++. Mas as idéias são as mesmas.

O if é um comando verificador, e tem esta sintaxe:
if (condição verdadeira) then
faça alguma coisa;
O ponto e vírgula é o caractere terminador de linha em Pascal (a linguagem usada pelo Delphi). As instruções que não estiverem separadas por um ponto-e-vírgula, podem ser digitadas na mesma linha, se você quiser. Pula-se linhas e é costume teclar TAB para dar tabulações e espaços apenas para facilitar a edição do código, visto que quem o editará é uma pessoa – como você!

Nesse código, o verificador verifica se a tecla pressionada ("Key") foi a tecla [enter] ("VK_RETURN" é um identificador no Delphi, para a tecla [enter]; cada tecla tem um código próprio). Se foi, ele chama o método "Navigate" do objeto "web", passando como parâmetro o texto que estiver dentro do campo. Esse texto é obtido pela propriedade "Text", e ela é separada por um ponto do nome do objeto (assim como os métodos, eventos, funções... que aliás são, "num primeiro momento", a mesma coisa, evento, função e método).

Compile o programa e execute-o, digitando qualquer site na barra de endereços, e tecle [enter]. Se der erro na compilação e o programa não rodar, verifique todos os passos descritos, observando a mensagem de erro na tela do Delphi, que normalmente reporta o que ocorreu ou pelo menos a linha.

Dica: para executar o programa de dentro do Delphi, apenas tecle F9, ou clique no botão com o ícone de um "play", na barra de ferramentas. O arquivo gerado terá o mesmo nome do projeto que você salvou, mas a extensão ".exe". Você poderá distribui-lo e inclusive rodá-lo em outros computadores, sem precisar do Delphi :)

Agora vamos definir as ações dos botões. O evento onClick deles é o evento padrão, por ser o mais intuitivo para um botão: fazer alguma coisa quando o usuário clicar nele. Como é o evento padrão, basta dar um duplo clique sobre cada botão, para digitar o evento para ele. Mas nada impede que você o faça selecionando o botão, e dando um duplo clique no evento "onClick", da aba "Events" do Object Inspector.

Essa parte será bem fácil, pois cada botão apenas chamará um método do componente do navegador, que no caso, é gerenciado pelo motor do Internet Explorer, ou seja, já está tud programado.

Dê um duplo clique sobre o botão "Voltar", e digite:

web.GoBack;

GoBack é um método definido pelos criadores do IE, que fará ele voltar à página anteriormente acessada.

Faça a mesma coisa para o botão "Avançar", digitando:

web.GoForward;

Para o botão "Parar":

web.Stop;

E finalmente, o botão "Atualizar":

web.Refresh;

Salve, compile e rode seu programa. Navegue por algumas páginas, para testar. Para que os botões "Voltar" e "Avançar" realmente funcionem, você deverá navegar clicando em alguma coisa (ou acessando outro endereço), e depois clicar no "Voltar".

Continue lendo...

Posts Relacionados:

sábado, 1 de novembro de 2008

MySQL e PHP: Conexão Permanente com o Banco de Dados

Conexões persistentes são conexões que não fecham quando a execução do seu script termina. Quando uma conexão persistente é requisitada, o PHP checa se já existe uma conexão persistente idêntica (que foi mantida aberta anteriormente) - e, se ela existe, ele a usa. Se não existir, ele cria uma nova. Uma conexão 'idêntica' é uma conexão que foi aberta ao mesmo host, com o mesmo nome de usuário e a mesma senha (onde for aplicável).

Pessoas que não estão totalmente familiarizadas com a maneira como servidores web trabalham e distribuem a carga podem confundir conexões persistentes com o que elas não são. In particular, elas não dão a você a habilidade de abrir 'sessões de usuários' na mesma conexão, elas não dão a habilidade de construir uma transação eficientemente, e elas não fazem um monte de outras coisas. De fato, para ser extremamente claro sobre o assunto, conexões persistentes não te dão nenhuma funcionalidade que não era possível com as suas correspondentes não-persistentes.

Por que?


Tem a ver com a maneira como os servidores web funcionam. Existem três maneiras de seu servidor web utilizar o PHP para gerar páginas.

O primeiro método é usar o PHP como um CGI "wrapper". Quando executado dessa maneira, uma instância do interpretador do PHP é criada e destruída para cada requisição de página (por uma página PHP) para o seu servidor web. Como ela é destruída após cada requisição, quaisquer recursos que ela adquirir (como uma conexão para um banco de dados) são fechados quando ela é destruída. Nesse caso, não há nenhum ganho ao tentar usar conexões persistentes -- elas simplesmente não persistem.

O segundo método, o mais popular, é rodar o PHP como um módulo em um servidor com multi-processos, que atualmente só inclue o Apache. Um servidor com multi-processos tipicamente tem um processo ( pai) que coordena uma série de processos (filhos) que são os que realmente fazem o trabalho de servir as páginas. Quando uma requisição chega de um cliente, ela é entregue à um dos filhos que não estiver ocupado servindo outro cliente. Isso significa que quando o mesmo cliente faz uma segunda requisição ao servidor, ele pode ser servido por um processo filho diferente do da primeira vez. Quando abre-se uma conexão persistente, cada página que requisitar serviços de SQL pode reusar a mesma conexão estabelecida ao servidor SQL.

O último método é usar o PHP como um plug-in para um servidor web multithreaded. Atualmente, o PHP4 tem suporte para ISAPI, WSAPI, e NSAPI (no Windows), todos permitindo PHP ser usado como um plug-in em servidores multithreaded como Netscape FastTrack (iPlanet), Internet Information Server (IIS) da Microsoft, e O'Reilly's WebSite Pro. O comportamento é essencialmente o mesmo do modelo multiprocessado descrito anteriormente.

Se conexões persistentes não tem nenhuma funcionalidade a mais, para que elas servem?
A resposta é extremamente simples -- eficiência. Conexôes persistentes são boas se o sobrecarga (overhead) de criar uma conexão ao seu servidor SQL for alta. Saber se essa sobrecarga é alta depende de vários fatores. Como que tipo de banco de dados é, se está ou não na mesma máquina onde o servidor web está, o quão carregada de trabalho está a máquina hospedando o servidor SQL e assim por diante. O ponto é que se a sobrecarga de conexão for alta, conexões persistentes ajudam consideravelmente. Elas fazem com que os processos filhos simplesmente conectam-se uma vez só durante toda sua duração, ao invés de cada vez que eles processam uma página que requer uma conexão ao servidor SQL. Isso significa que cada filho que abriu uma conexão persistente terá sua própria conexão aberta ao servidor. Por exemplo, se você tiver 20 processos filhos diferentes que rodassem um script que fizesse uma conexão persistente à um servidor SQL, você teria 20 conexões diferentes ao banco, uma de cada filho.

Perceba, no entanto, que isso pode ter algumas desvantagens se você estiver usando um banco com limite de conexões que é excedido pela conexões persistentes filhas. Se seu banco tem um limite de 16 conexões simultâneas, e durante um momento de pico de acessos, 17 processos filhos tentam fazer a conexão, um deles não será capaz. Se houver bugs no seus scripts que não permitem que as conexões se fechem (como loops infinitos) o banco de dados com apenas 16 conexões pode rapidamente ficar sobrecarregado. Procure na documentação do seu banco por informações sobre como lidar com conexões ociosas ou abandonadas.

Aviso


Existem mais alguns cuidados a se tomar quando usando conexões persistentes. Um deles é que, quando usando travamento de tabela em uma conexão persistente, se o script por qualquer razão não pode destravar a mesma, então scripts subsequentes usando a mesma conexão serão bloqueados indefinidamente e pode ser preciso reiniciar o servidor http ou o banco de dados. Outro cuidado a se ter é, quando usando transações, um bloco de transação também será carregado para o próximo script que usar a conexão se a execução do script terminar primeiro que o bloco de transação. Em ambos os casos, você pode usar register_shutdown_function() para registrar uma função simples de limpeza para destravar suas tabelas e fazer roll back de suas transação. O ideal é evitar o problema completamente não usando conexões persistentes em scripts que usam travamento de tabelas ou transações (você ainda pode usar elas nos outros casos).

Um resumo importante. Conexões persistente foram feitas para ter um mapeamento de um-para-um com conexões normais. Isso significa que você deve sempre ser capaz de substituir conexões persistentes com conexões não-persistentes e isso não mudará a maneira como seu script se comporta. Pode (e provavelmente irá) mudar a eficiência do mesmo, mas não o seu comportamento! Fonte: PHP.net

Continue lendo...

Posts Relacionados: