quarta-feira, 25 de março de 2009

Resolvendo expressões matemáticas no Delphi

Para aqueles que gostam de matemática, ou para você que tem um sistema comercial e faz inúmeras situações de cálculos para encontrar um resultado, que faz soma, divisão, multiplicação e subtração tudo separado, escrevendo várias linhas de código, o post de hoje lhe dará uma ajuda e ensinará como poderá resolver este problema mais facilmente. Já pensou em executar uma expressão matemática e ao final receber seu resultado, por exemplo:
(97+25)*(14/2+0.98)

Veremos que a partir da criação de uma rotina fixa através de uma function será possível executar toda esta expressão de uma única vez. No Delphi crie uma nova aplicação, altere o caption do formulário principal para "Resolvendo Expressões Matemáticas" e salva os arquivos em um diretório do seu computador. Arraste ao formulário dois componentes Label alterando suas propriedade caption para "Expressão Matemática" e "Dígitos após a vírgula". Arraste também dois componentes Edit (edtExpressao, edtDigitos) e remova o texto presente na propriedade Text. Por último adicione também um Button alterando o caption para "Resolver Expressão".

Acessando o código do formulário, declare na seção private a seguinte function, que será a responsável por resolver a expressão:

function CalculaExpressao(expressao: string; digitos: Byte): string;

Utilizando as teclas de atalho Shift + Ctrl + C crie a implementação para a função onde deverá incluir a seguinte codificação:
function TForm1.CalculaExpressao(expressao: string; digitos: Byte): string;
// Calculo de expressoes matematicas simples
// Suporta numeros inteiros, numeros reais, parenteses
var
z: Char;
ipos: Integer;

function StrToReal(chaine: string): Real;
var
r: Real;
Pos: Integer;
begin
Val(chaine, r, Pos);
if Pos > 0 then Val(Copy(chaine, 1, Pos - 1), r, Pos);
Result := r;
end;

function RealToStr(inreal: Extended; digits: Byte): string;
var
S: string;
begin
Str(inreal: 0: digits, S);
realToStr := S;
end;

procedure NextChar;
var
s: string;
begin
if ipos > Length(expressao) then
begin
z := #9;
Exit;
end
else
begin
s := Copy(expressao, ipos, 1);
z := s[1];
Inc(ipos);
end;
if z = ' ' then nextchar;
end;

function Expression: Real;
var
w: Real;

function Factor: Real;
var
ws: string;
begin
Nextchar;
if z in ['0'..'9'] then
begin
ws := '';
repeat
ws := ws + z;
nextchar
until not (z in ['0'..'9', '.']);
Factor := StrToReal(ws);
end
else if z = '(' then
begin
Factor := Expression;
nextchar
end
else if z = '+' then Factor := +Factor
else if Z = '-' then Factor := -Factor;
end;

function Term: Real;
var
W: Real;
begin
W := Factor;
while Z in ['*', '/'] do
if z = '*' then w := w * Factor
else
w := w / Factor;
Term := w;
end;
begin
w := term;
while z in ['+', '-'] do
if z = '+' then w := w + term
else
w := w - term;
Expression := w;
end;
begin
ipos := 1;
Result := RealToStr(Expression, digitos);
end;


Nesta codificação, a função recebe a expressão por completa e vai verificando a prioridade das operações de sinais a serem executadas bem como resolvendo parenteses e cálculos até que o resultado final seja obtido. A quantidade de dígitos após a virgula também pode ser controlada passando o valor como parâmetro para a função. Para utilizar a função, adicione ao evento OnClick do botão o seguinte código responsável por passar a expressão e quantidade de digitos informados nos campos Edit e retornar o resultado através de uma mensagem na tela do usuário.


A partir deste post, faça a implementação da rotina em seus sistemas ou implemente novos recursos. Abraço e até a próxima.

terça-feira, 24 de março de 2009

Histórias hilárias do cotidiano de um Suporte Técnico em Informática

Todos sabem que ser atendente de Suporte Técnico na área de Informática não é fácil. Muitas vezes é realmente complicado de entender o que o cliente quer nos dizer, ou em alguns casos, quase impossível de entender.

Veja o que aconteceu em um Suporte Técnico de Informática. Esta é uma historia verídica que ocorreu em empresas famosas.
Segue o diálogo entre o ex-funcionário e o cliente da empresa:

- Help desk assistência, posso ajudar?
- Sim, bem.... estou tendo problema com o Word.
- Que tipo de problema?
- Bem, eu estava digitando e, de repente, todas as palavras sumiram.
- Sumiram?
- Elas desapareceram. Nada.
- Nada?
- Está preta. Não aceita nada que eu digite.
- Você ainda está no Word ou já saiu?
- Como posso saber?
- Você vê o Prompt C: na tela?
- O que é esse 'promte-se'?
- Esquece. Você consegue mover o cursor pela tela?
- Não há cursor algum. Eu te disse, ele não aceita nada que eu digite.
- Seu monitor tem um indicador de força?
- O que é monitor?
- É essa tela que parece com uma TV. Ele tem uma luzinha que diz quando está ligado?
- Não sei.
- Bom, olhe atrás do monitor, então veja aonde está ligado o cabo de força. Você consegue fazer isso?
- Acho que sim.
- Ótimo. Siga para aonde vai o cabo e me diga se ele está na tomada.
- Tá sim.
- Atrás do monitor, você reparou que existem dois cabos?
- Não.
- Bom, eles estão aí.. Preciso que você olhe e ache o outro cabo.
- Ok, achei.
- Siga-o e veja se ele está bem conectado na parte traseira do computador.
- Não alcanço!
- Hum. Você consegue ver se está?
- Não.
- Mesmo se você ajoelhar ou se debruçar sobre ele?
- Ah, não, tá muito escuro aqui!
- Escuro?
- Sim, a luz do escritório tá desligada, e a única luz que eu tenho vem da janela, lá do outro lado.
- Bom, acenda a luz então!
- Não posso.
- Por que não?
- Porque estamos sem energia.
- Estão... sem energia...?
Longa pausa...
- Ah! ok, descobrimos o problema agora! Você ainda tem a caixa de papelão e os manuais que vieram com o seu micro?
- Sim, estão no armário.
- Bom! Então, você desconecta o seu sistema, pega tudo, empacota e leva de volta para a loja.
- Sério?? O problema é tão grave assim?
- Sim, temo que seja.
- Bom, então tá. E o que eu digo na loja?
- Diga que você é BURRO demais pra ter um computador !!!

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

USUÁRIO: 'Não consigo imprimir. Cada vez que tento, o computador diz:
- 'Não é possível encontrar a impressora'. Já levantei a impressora e coloquei-a em frente ao monitor para ele ver, mas o computador continua dizendo que não consegue encontrá-la.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

SUPORTE: 'Serviço ao Manual da HP. Sérgio falando. Em que posso ser útil?'
USUÁRIO: 'Tenho uma impressora HP que precisa ser reparada.'
SUPORTE: 'Que modelo é?'
USUÁRIO: 'É uma Hewlett-Packard...'
SUPORTE: 'Isto eu já sei. Quero saber se é colorida ou preto e branco.'
USUÁRIO: 'É bege!'

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

SUPORTE: 'Bom dia. Posso ajudar em alguma coisa?'
USUÁRIO: 'Não consigo imprimir.'
SUPORTE: 'Pode clicar no 'Iniciar' e...'
USUÁRIO: 'Caaalma aí! Não responda assim muito tecnicamente.. Não sou o Bill Gates!'

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

USUÁRIO: ' De repente aparece uma mensagem na minha tela que diz 'Clique
Reiniciar'.... O que eu devo fazer?'
SUPORTE: 'O senhor aperte o botão solicitado, desligue e ligue novamente.' Sem pestanejar, o usuário desliga o telefone na cara do atendente e liga para o suporte novamente.
USUÁRIO: 'E agora o que eu faço?'

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

USUÁRIO: 'Tenho um grande problema. Um amigo meu colocou um protetor de tela no meu computador, mas a cada vez que mexo o mouse, ele desaparece!!!'

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

SUPORTE: 'Em que posso ajudar?'
USUÁRIO: 'Estou escrevendo o meu primeiro e-mail.'
SUPORTE: 'OK, qual é o problema?'
USUÁRIO: 'Já fiz a letra 'a'. Como é que se faz o circulozinho em volta dela pra fazer o tal arroba?'

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

SUPORTE: 'Suporte do se u Provedor de Internet, bom dia. O que deseja?'
USUÁRIO: 'Moço, a Internet também abre aos domingos?'

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Depois de um tempo falando com o atendente do suporte.
SUPORTE: 'O que tem do lado direito da tela?'
USUÁRIO: 'Uma samambaia!'
SUPORTE: silêncio...

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Agora esta última aconteceu comigo, enquanto prestava suporte para um sistema que acabei de instalar no cliente, e precisei enviar uma atualização para correção de layout conforme solicitação do cliente:
EU: por favor, descompacte o arquivo que acabei de lhe enviar na sua área de trabalho. Após vá em meu computador, selecione o disco local C:\ e abra a pasta do sistema. Cole o arquivo lá dentro.
USUÁRIO: já estou no meu computador, se quiser, posso usar o computador da minha funcionária. Acho que não entendi certo, como vou neste disco local C:\? Preciso abrir o computador para colocar o arquivo lá dentro, eu não vou saber isso...
- após eu dar risada por cerca de 10 minutos, tive que retomar a paciência e voltar a explicar tudo para meu cliente. Como diriam meus amigos, este seria um caso de desenhar o procedimento no Paint para que o usuário entenda... rsrs

Bom, depois de todas estas situações e aposto alguns risos, fique preparado para quando precisar prestar suporte para seus clientes. Abraço e até o próximo post.

sexta-feira, 13 de março de 2009

Exibir imagem no fundo do Form

Igual a Web, colocar uma imagem ao fundo de um formulário, só que em Win32, já pensou em fazer isso? Bom, é bastante simples fazer com que seu sistema carregue uma imagem com extensão *.bmp e escreva esta imagem no form, usando o objeto Canvas do formulário, sem usar nenhum componente de imagem. Crie um novo projeto e adicione a ele um Button e um OpenDialog da paleta Dialogs, e já no código declare a seguinte função:
Procedure TForm1.ImgFundoForm(CaminhoBMP:String; DistH, DistV:Integer); Var Imagem :TBitMap; begin Imagem := TBitMap.Create; Try Imagem.LoadFromFile(CaminhoBMP); Canvas.Draw(DistH,DistV,Imagem); Except On e: Exception do ShowMessage('Problemas ao escrever imagem:'+#13+e.message); end; end;

Essa função fará com que seja criado, em runtime um objeto BitMap que por sua vez carregará a imagem bmp a partir do caminho informado. Já na linha seguinte, utilizando o Canvas escrevemos a imagem no form definindo as cordenadas para que a mesma seja exibida.

Para que a imagem seja de fato carregada, adicione ao evento OnClick do Button a seguinte linha de código, responsável pela configuração do OpenDialog, localização da imagem e execução da função.
Pronto, agora você poderá personalizar os formulários do seu sistema aplicando a eles imagens de fundo. Abraço e até a próxima...

quinta-feira, 12 de março de 2009

Tradução de palavras, frases, textos no MSN

Sim, exatamente isso que você leu, agora no MSN você pode traduzir palavras, frases, textos, e o melhor, são 14 idiomas diferente que você poderá escolher. A ferramenta trata-se de uma integração anunciada pela Microsoft entre as ferramentas Windows Live Translator e a ferramenta de comunicação instantânea MSN.

Para iniciar suas traduções, basta que adicione o contato mtbot@hotmail.com à sua lista de contatos e inicie uma conversa. Trata-se de um robô que lhe fará uma simpática apresentação e oferecerá seus recursos de ajuda. A listagem de comandos poderá ser feita ao digitar "TBot ?", onde obterá a seguinte lista:

1 TBot lang - Mostrar línguas de tradução
2 TBot change - Selecionar línguas de tradução

3 TBot stop - Desligar o tradutor

4 TBot start - Ligar o tradutor novamente

5 TBot set - Selecionar sua língua preferida
6 TBot ? - Listar os comandos


Os idiomas de tradução disponíveis são:

1 Alemão

2 Chinês simplificado

3 Chinês tradicional

4 Coreano

5 Espanhol
6 Francês

7 Holandês

8 Inglês
9 Italiano

10 Japonês
11 Polonês

12 Português

13 Russo
14 Árabe


Bom, agora para qualquer dúvida de tradução, converse com o TBot, o seu robô tradutor.

Boas conversas e até a próxima.

Exportar relatórios em Rave Reports para PDF

Quem já não passou por uma experiência onde o cliente solicita que os relatórios sejam exportados do seu sistema em formato PDF? Bom, pode até ser fácil você instalar um impressora PDF na máquina e orientar que ele imprima para o formato, mas, e porque não exportar diretamente o relatório no formato solicitado? Na grande maioria dos geradores de relatórios, esta utilidade está disponível, e no Rave Reports, exportar para PDF é prático e rápido de ser implementado. Vamos montar um pequena estrutura de relatório, e codificar a exportação.

Crie uma nova aplicação Delphi for Win32, e adicione os seguintes componentes:
RvProject (paleta Rave) - Integração com o projeto do relatório
RvSystem (paleta Rave) - Configurações do relatório
RvRenderPDF (paleta Rave) - Exportação do relatório para PDF
ClientDataSet (paleta Data Access) - Importação de XML com dados para o relatório
RvDataSetConnection (paleta Rave) - Ligação do DataSet para exibição dos campos na estrutura do Rave Reports
SaveDialog (paleta Dialogs) - Localizar destino de exportação do relatório
Button (paleta Standard) - altere
Caption para "Exportar para PDF"

Inicialmente, selecione o RvProject e ligue sua propriedade Engine ao componente RvSystem1. Num segundo passo, selecione o ClientDataSet, com o botão direito sobre o mesmo selecione a opção Load from MyBase Table e selecione uma fonte de dados XML (C:\Arquivos de Programas\Arquivos Comuns\Borland Shared\Data\). Também, no componente RvDataSetConnection relacione a propriedade DataSet ao componente ClientDataSet para que a ligação dos dados entre Delphi e Rave Reports seja realizada. Com um duplo clique sobre o RvProject, abra o Rave Design e vamos à criação do arquivo de relatório. Selecionei como fonte de dados o arquivo Country.xml e irei montar um esquema de relatório para exibição de países e capitais. Salve o projeto do rave no mesmo diretório do sistema.
Criado o relatório, retomaremos o Delphi para configuração do RvProject onde iremos incorporar o projeto de relatório. Na propriedade StoreRAV localize o arquivo *.rav criado e em seguida clique em Load. Isso fará com que o relatório seja incorporado ao executável, sem necessidade de que o arquivo seja distribuído junto com a aplicação.

Para codificarmos então a exportação do relatório, adicione o bloco a seguir no evento OnClick do Button onde definimos as configurações do objeto SaveDialog e solicitamos ao usuário que informe um nome e local para que o relatório possa ser salvo. Em seguida, desabilitamos a opção de Preview exibida durante a execução de um relatório, definimos que o mesmo será renderizado para PDF, selecionamos o nome do relatório a ser executado e chamamos a ação.
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveDialog1.Filter := 'Arquivos PDF (*.pdf)|*.pdf';
SaveDialog1.DefaultExt := '*.pdf';
SaveDialog1.Execute;
if SaveDialog1.FileName <> '' then
begin
RvSystem1.SystemSetups := RvSystem1.SystemSetups - [ssAllowSetup];
RvSystem1.DefaultDest := rdFile;
RvSystem1.DoNativeOutput:= false;
RvSystem1.RenderObject:= rvRenderPDF1;
RvProject1.SelectReport('Report1',True);
RvSystem1.OutputFileName:= SaveDialog1.FileName;
rvproject1.Execute;
end;
end;


Ao final do processo, um arquivo PDF será salvo no destino escolhido, pronto para ser enviado por e-mail ou disponibilizado para download em sites Web.
Pela sua leitura muito obrigado, e até o próximo post.

quarta-feira, 11 de março de 2009

SQLConnection - utilizando arquivo de configurações

Bom, creio que muitos já utilizaram este método de desenvolvimento, outros muitos procuram uma maneira de deixar o caminho de conexão ao banco de dados dinâmica, para que em tempo de design na sua estação de trabalho você possa utilizar a base de dados em determinado caminho e que no cliente, sem precisar recompilar o sistema, ou ainda, possa estar conectando a uma base em rede alterando apenas um único arquivo de configurações, chamados de arquivos INI.

Adicionado e configurado um novo componente SQLConnection à sua aplicação, adicione em seu evento OnBeforeConnect (antes de conectar) o seguinte trecho de código:

procedure TDM.CONEXAOBeforeConnect(Sender: TObject);
var
Arquivo: TIniFile{uses IniFiles};
begin
Try
Arquivo:= TIniFile.Create(ExtractFilePath(Application.ExeName)+'CONF.ini');
with DM.CONEXAO do
begin
Params.Values['DATABASE'] := Arquivo.ReadString('DADOS','DATABASE','');
Params.Values['USERNAME'] := Arquivo.ReadString('DADOS','USERNAME','');
Params.Values['PASSWORD'] := Arquivo.ReadString('DADOS','PASSWORD','');
Arquivo.Free
end;
Except
ShowMessage('Não foi possivel conectar! Nenhum servidor disponível...');
End;
end;


Note que estamos criando um novo objeto de inicialização, o qual carregará do mesmo diretório onde encontra-se o executável da aplicação um arquivo "Conf.ini". Este arquivo por sua vez contém as configurações como endereço da base de dados, usuário do banco e senha. Atribuimos então os valores a estes parâmetros de configuração do SQLConnection, acessando os valores da seção "DADOS" e lendo qual valor está armazenado em cada uma das propriedades.

NOTA: Aconselho deixar a propriedade Connected do SQLConnection como False para evitar problemas de conexão.

Criando o Arquivo *.INI

A criação do arquivo de configurações é muito simples, basta que através do bloco de notas crie um novo documento, adicione a ele uma nova seção "[DADOS]" e dentro desta seção, vá adicionando as propriedade que serão lidas pela sua aplicação, ficando assim organizado:
[DADOS]
DATABASE=192.160.10.100/3050:C:\Banco\banco.fdb
USERNAME=SYSDBA
PASSWORD=*********


NOTA: Há diferentes maneiras de você informar o caminho da base de dados, levando em consideração a estrutura e a segurança da rede onde o mesmo será instalado. O uso do IP antecendo o caminho físico do banco é altamente recomendado, em casos do sistema rodar apenas em localhost, use o IP 127.0.0.1, seguido do caminho físico da base, em casos de possuir um servidor de banco de dados, utilize o IP do servidor seguido pelo caminho físico da base no servidor, assim:
192.160.10.100:C:\Banco\banco.fdb
Mas, se você usa a base de dados em rede, e o servidor da aplicação possui Firewall de acesso, será necessário a liberação de acesso à porta 3050 (conexão utilizada pelo Firebird) e passar a utilizar o número da porta junto ao endereço IP, assim:
192.160.10.100/3050:C:\Banco\banco.fdb

Bom, desta forma você conseguirá criar suas aplicações, instalar as mesmas em seus clientes sem necessidade de recompilar pelo motivo do caminho físico da base. Abraço e até o próximo post.

terça-feira, 10 de março de 2009

Verificar se programa está em execução

Você desenvolveu seu programa, mas quer evitar que o mesmo seja aberto novamente quando já está em execução, ou não quer que seja executado enquanto outro processo estiver rodando, como fazer?

Aproveitando parte da rotina que postei no ínicio da semana sobre finalizar processos, criaremos uma rotina para apenas verificar se o processo existe ou não. Crie um novo projeto no Delphi, e declare já no code do projeto a seguinte função:

function TForm1.ProcessoExiste(ExeFileName: string): boolean;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32{declarar Uses Tlhelp32};
begin
result := false;

FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);

while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
begin
Result := true;
exit;
end;
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;


NOTA: declare a uses Tlhelp32

A função será o principal agente para varedura dos processos, onde adicionamos a lista de processos para a memória e depois, através de um While percorremos todos eles, localizando a entrada desejada. Ao encontrar o processo desejado, alteramos o resultado da função para True e abandonamos o while.

Para mostrar o resultado na tela, adicione um componente Edit (Edit1) e um Button (Button1), adicionando o código a seguir ao evento OnClick do Button:

procedure TForm1.Button1Click(Sender: TObject);
begin
if ProcessoExiste(Edit1.Text) then
ShowMessage('Processo encontrado')
else
ShowMessage('Processo não existe');
end;

Pronto, execute o projeto e faça o teste para verificar se o processo do explorer por exemplo está rodando, conforme demostração.
Abraço... até o próximo post.

sexta-feira, 6 de março de 2009

Abrindo documentos Word no Delphi

Quantas vezes você já pensou em como conseguiria abrir um documento do Word dentro da sua aplicação Delphi? Sim, eu sei, tem o RichEdit, mas e se o DOC possuir imagens? E a formatação de parágrafos, tabelas, auto-formas e todos os demais recursos que o Word oferece, sem chances de exibir num RichEdit, certo?

Bem, no Delphi há disponível um componente chamado OleContainer, o qual permite que através de um ActiveX a interface dos programas seja carregada a partir do prórprio formulário da sua aplicação, valendo não apenas para Word, mas para outros aplicativos como Excel, PowerPoint, etc.

Crie uma nova aplicação Delphi for Win32, arraste com componente Panel organizando sua propriedade Align para AlTop e dentro deste, adicione dois componentes Button, alterando o Caption destes para "Abrir Documento" e "Criar Documento". Na área ainda disponível do formulário, adicione um componente OleContainer da paleta System e altere sua propriedade Align para alClient, para que ele use todo o espaço do formulário. Arraste também para a tela da paleta Dialogs um componente OpenDialog e outro SaveDialog.

Realizando a codificação, adicionaremos o seguinte código ao evento OnClick do botão "Abrir Documento", no qual o diálogo de busca de documentos será executado e ao selecionar um documento, a aplicação do Word será criada através do componente OleContainer e o documento carregado.


procedure TForm1.btAbrirClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Screen.Cursor := crHourGlass;
try
OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, True);
OleContainer1.DoVerb(0);
finally
Screen.Cursor := crDefault;
end;
end;
end;


NOTA: Configure a propriedade Filter do OpenDialog permitindo apenas extensões relacionadas ao Word.

No botão "Criar Documento" adicione a lista de códigos a seguir, a qual é responsável por criar um novo objeto do tipo "Word Document" exibindo-o na tela e adicionando um texto a sua área.


procedure TForm1.btCriarClick(Sender: TObject);
begin
OleContainer1.CreateObject('Word.Document', False);
OleContainer1.AllowInPlace := True;
OleContainer1.DoVerb(ovPrimary);
OleContainer1.OleObject.Application.Selection.TypeText('Passagem do Texto para o Documento');
end;


Por último, precisamos que o documento também seja salvo quando saírmos do formulário, pois de nada adiantaria abrir o documento, permitir que alterações nele sejam feitas e não salvar as mesmas. Para isto, adicione ao evento OnDeactivate do OleContainer o seguinte código, que fará uma verificação relacionada ao nome do arquivo para identificar se o mesmo foi aberto ou criado, em seguida salva-o no computador.

procedure TForm1.OleContainer1Deactivate(Sender: TObject);
var
FileName : String;
begin
if OpenDialog1.FileName <> '' then
FileName := OpenDialog1.FileName
else
begin
if SaveDialog1.Execute then
FileName := SaveDialog1.FileName;
end;
if FileName <> '' then
self.OleContainer1.SaveAsDocument(OpenDialog1.FileName) ;
end;


NOTA: Configure a propriedade DefaultExt do SaveDialog para "*.doc". Configure também sua propriedade Filter.

Dessa forma, finalizo este post, deixando-lhe o desafio de criar aplicações Delphi integradas com demais ferramentas disponíveis em seu computador. Abraço e até o próximo post.

quinta-feira, 5 de março de 2009

Obter texto de uma página Web

Quantas vezes você já procurou rotinas para capturar e salvar o texto de uma página web? Obter valores, salvar notícias em uma base de dados, enfim várias funcionalidades que podem ser vinculadas de um sistema Win32 utilizando recursos/dados contidos em páginas Web.
Ao contrário de que você deve estar pensando, não importaremos o código fonte da página e depois remover as tags para limpar o texto, a rotina a seguir obterá apenas texto puro, ignorando a captura de qualquer tag HTML. Crie um novo projeto Delphi for Win32, adicione um componente Edit (edtNavigate) para que seja a barra de navegação, um Button com Caption "Navegar". Logo abaixo adicione um componente WebBrowser que usaremos para exibir a página Web em sua forma original, e de onde também iremos retirar o texto da página que está sendo exibida. Por último, adicione logo abaixo ao WebBrowser outro componente Button alterando o Caption para "Obter Texto" e um componente Memo onde iremos exibir o texto extraído da página Web. Altere a propriedade ScrollBars do Memo para ssBoth a fim de que sejam exibidas as barras de rolagem no sentido vertical e horizontal.
Para dar início ao processo de codificação, adicione ao botão "Navegar" a seguinte linha de código, que irá atribuir uma URL ao componente WebBrowser e exibir o conteúdo:


WebBrowser1.Navigate(edtNavega.Text);

Por último, adicionaremos o código ao botão "Obter Texto", que se trata de uma função disponibilizada no componente WebBrowser, a fim de extrair o conteúdo da página exibida.

memo1.Text := WebBrowser1.OleObject.Document.documentElement.innerText;

Pronto, execute agora seu sistema, digite uma URL válida na barra de navegação e exiba o conteúdo da página na tela. Após carregada a página, clique sobre o botão obter texto e observe que todo o texto foi capturado e jogado ao componente Memo, onde poderia ser salvo em uma base de dados ou qualquer outra ação necessária.

Obrigado pela leitura, até a próxima.

quarta-feira, 4 de março de 2009

Finalizar Processos

Algumas vezes nos deparamos com situações em que não queremos que certo processo esteja executando no computador, durante um processo demorado do sistema por exemplo, você pode querer fechar algum player de áudio, finalizar o messenger entre outras situações. Há diversas formas de realizar e implementar esta rotina, ou seja pelo ID utilizado pelo processo, ou através do próprio nome do executável, "wmplayer.exe" por exemplo.

Criando um novo projeto, altere o Caption do formulário para "Fechar Programas" e arraste para ele um componente Label alterando Caption para "Digite o nome do Processo", um componente Edit (edtProcesso) e um componente Button com Caption "Finalizar Processo". Antes de codificar o evento OnClick do botão, vá ao código e declare na seção Private a seguinte função que receberá por parâmetro o nome do executável:

function Finalizaprocesso(ExeFileName: string): integer;

Na implementação da função, adicione o código a seguite:

function TForm1.Finalizaprocesso(ExeFileName: string): integer;

const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32{declarar Uses Tlhelp32};
begin
result := 0;

FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);

while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(
PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);

end;

A função irá localizar o processo, e quando localizado irá finalizá-lo.

Para executar a função, basta que adicione ao evento OnClick do botão uma chamada ao código, passando para o parâmetro o valor digitado no Edit. Antes de finalizar o processo, ainda solicitamos a confirmação ao usuário.

if Application.MessageBox('Deseja mesmo finalizar este processo?','Finalizar processo',MB_YESNO) = idYes then
Finalizaprocesso(edtProcesso.Text)






Por ora seria isto, abraço e até o próximo post.