Mostrando postagens com marcador Delphi. Mostrar todas as postagens
Mostrando postagens com marcador Delphi. Mostrar todas as postagens

sexta-feira, 17 de julho de 2009

Imagem de cabeçalho dinâmica no Rave Reports

Você tem o seu sistema, emite relatórios em Rave Reports e precisa customizar o relatório para atualização dos cabeçalhos de relatório a cada novo cliente? E porque não usar cabelhos com imagens e atribui-las dinamicamente ao Rave em tempo de execução? - Neste post veremos como passar para o Rave, através de parâmetros o caminho de um Bitmap que deverá ser carregado em tempo de execução e ser exibido como sendo o cabeçalho do relatório.

Inciando pelo Rave, crie um novo documento de relatórios, crie uma estrutura utilizando os componentes Region e Band e adicione um componente Bitmap Component. Acessando agora o Event Editor do Bitmap, selecione o evento onBeforePrint e insira seguinte linha de código:

function Bitmap1_OnBeforePrint(Self: TRaveBitmap);
begin
Bitmap1.FileLink := Raveproject.getparam('pImagem');
end OnBeforePrint;


Obs.: Clique em compile e certifique-se que o código seja aceito pelo Rave.

O código faz com que o caminho seja atribuido para a imagem em tempo de execução de acordo com o valor recebido no parâmetro "pImagem" que deverá ser criado na propriedade Parameters do relatório.

Agora criando a aplicação Delphi, adicione os componente RvProject e RvSystem, faça a configuração dos mesmos (ver configurações), adicione um componente OpenDialog para localizar o Bitmap e adicione um botão vinculando a ele o seguinte código que irá atribuir o arquivo selecionado ao parâmetro e exibir o relatório:


procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.Filter := 'Bitmap (*.bmp)|*.bmp';
if OpenDialog1.Execute then
begin
RvProject1.Open;
RvProject1.SelectReport('Report1',False);
RvProject1.SetParam('pImagem',OpenDialog1.FileName);
RvProject1.Execute;
end;
end;


Pronto, execute agora a aplicação e clique sobre o botão, localize a imagem do cabeçalho na extensão .bmp e veja que a mesma é exbida no relatório do Rave Reports. Na sua aplicação, crie uma seção de parâmetros em alguma tabela do banco de dados ou mesmo no arquivo de configurações *.INI (ver configurações) e mantenha o caminho do cabeçalho de relatório sempre salvo. Abraço e até o próximo post.

segunda-feira, 13 de julho de 2009

Listando programas instalados

Já pensou em fazer um aplicativo capaz de listar todos os programas instalados em seu computador? E associar os devidos ícones a cada um dos programas instalados? Neste post irei mostrar a criação de uma rotina bem simples capaz de lhe exibir a lista de todos os programas que você possui instalados ai no seu Windows associando os icones correspondentes a cada um deles.

Para começar, crie uma nova aplicação Delphi for Win32 e adicione ao formulário principal um componente Button alterando a propriedade Align para "alTop", um Label com a propriedade Align para "alBotton", um ListView organizado como "alClient" e também um componente ImageList e adicione neste uma imagem que será utilizada como imagem Default caso não seja possível encontrar o ícone do programa listado.


Acessando a unit de código do aplicativo, declare uma procedure chamada "ListaProgramasInstalados" e a seguir use as teclas Shift+Ctrl+C para fazer a implementação da mesma e adicione o código a seguir que se encontra comentado de acordo com as funcionalidades dos principais blocos que serão executados:

Obs.: declare as uses Registry e Shellapi.


procedure TForm1.ListaProgramasInstalados;
Var
List:TStringList;
Registry : TRegistry;

I:Integer;

Icon : TIcon;

DisplayName, DisplayIcon:String;
Item:TListItem;

begin

{ Cria objeto para pesquisa no registro do Windows }
Registry := TRegistry.Create;

{ Cria uma objeto para listagem dos programas }

List := TStringList.Create;

{ objeto para associar os icones aos programas }

Icon := TIcon.Create;

try
with
Registry do
begin
RootKey := HKEY_LOCAL_MACHINE;

if
OpenKey('Software\Microsoft\Windows\CurrentVersion\Uninstall',False) Then

Begin

{ obtem a lista de nomes dos programas instalados }
GetKeyNames(List);
CloseKey;

End;
{ percorre a lista de programas e busca o ícone para associá-lo }
for i:=0 to List.Count-1 do
begin
RootKey := HKEY_LOCAL_MACHINE;
OpenKey('Software\Microsoft\Windows\CurrentVersion\Uninstall\'+List[i],False);
DisplayName := ReadString('DisplayName');
DisplayIcon := ReadString('DisplayIcon');
if DisplayName <> '' then
begin
{ faz a associação do ícone ao programa }
Item := ListView1.Items.Add;
Item.Caption := DisplayName;
if DisplayIcon <> '' then
begin
Icon.Handle := ExtractIcon(HInstance,PAnsiChar(DisplayIcon),0);
Item.ImageIndex := ImageList1.AddIcon(Icon);
end else
Item.ImageIndex := 1;
end;
CloseKey;
End;
end;
Finally

{ limpa os objetos da memória }
Registry.Free;

List.Free;

Icon.Free;

end;
end
;


Por final, adicione ao evento OnClick do botão o código a seguir fazendo com que o procedimento seja executado e os programas listados, exibindo no Label a quantidade de programas que estão aparecendo na listagem.

procedure TForm1.Button1Click(Sender: TObject);
begin
ListaProgramasInstalados;
Label1.Caption := IntToStr(ListView1.Items.Count)+' programas instalados em seu computador.';

end;

Execute o aplicativo e clique sobre o botão para visualizar seu funcionamento. Abraço q até o próximo post.

quarta-feira, 3 de junho de 2009

Executando video no Delphi

Já pensou em fazer seu próprio sistema para reprodução de vídeos? Poder programar o palyer da forma como você quiser? Ao usar o componente MediaPlayer do Delphi, isto pode ser possível, ele além de reproduzir vários formatos de audio é também capaz de reproduzir videos.

Em um novo projeto no Delphi, adicione ao formulário os seguintes componentes:
- Panel: que será utilizado como
Display para a reprodução do vídeo.
- MediaPlayer: que fará a execução do vídeo.
- TrackBar: linha do tempo da execução do vídeo.
- Button1: altere o
Caption para "abrir".
- Button2: altere para "Pause".
- Button3: altere para "Stop".
- Timer: para atualizar a linha do tempo.
- OpenDialog: para localizar e abrir o arquivo de vídeo.

Adicione o seguinte código ao evento
OnClick do botão abrir:
procedure TForm1.Button1Click(Sender: TObject);
var
TheLength: LongInt;
begin
if OpenDialog1.Execute then
begin
with MediaPlayer1 do
begin
DeviceType := dtAVIVideo;
TimeFormat := tfFrames;
FileName := OpenDialog1.FileName;
Open;
TrackBar1.Max := Frames;
TheLength := Length;
Display := Panel1;
DisplayRect := Rect(10,10, Panel1.Width-20,Panel1.Height-20);
Play;
end;
end;
end;


Adicione o seguinte código ao evento OnClick do Button2 (Pause):
procedure TForm1.Button2Click(Sender: TObject);
begin
If Button2.Caption = 'Pause' Then
Button2.Caption := 'Continue'
else
Button2. Caption := 'Pause';
MediaPlayer1.Pause;
end;

Adicione o seguinte código ao evento OnClick do Button3 (Stop):
procedure TForm1.Button3Click(Sender: TObject);
begin
MediaPlayer1.Stop;
MediaPlayer1.Frames := 0;
TrackBar1.Position := 0;
Panel1.Refresh;
end;

Adicione o evento a seguir ao evento OnTimer do componente Timer1 para atualizar a linha do tempo de acordo com o avanço do video:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if MediaPlayer1.Frames > 0 then
begin
TrackBar1.Position := MediaPlayer1.Position;
end;
end;

Adicione o código a seguir ao evento OnChange do TrackBar1 para atualizar o vídeo no Display caso o usuário avance ou recue a linha do tempo:
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
With MediaPlayer1 do
Begin
StartPos := TrackBar1.Position;
Play;
End;
end;

Salve o projeto em seu computador, compile e execute sua aplicação. Clique no botão "abrir", e localize um arquivo de vídeo no formato "*.avi" para que seja executado. Abraço e até o próximo post.

quarta-feira, 22 de abril de 2009

Passagem de parâmetros para Rave Reports

Bom, após alguns dias com as postagens paradas, estou voltando hoje para iniciar uma série de dicas sobre relatórios com Rave Reports, e para começar, veremos hoje a configuração e passagem de parâmetros do Delphi para um relatório no Rave.

Com o Rave Reports aberto, crie um novo relatório, salve o mesmo em um diretório do seu computador e sem seguida selecione o relatório na
Report Library e altere a propriedade Name do mesmo para "rptParam". Observe também que o mesmo possui uma propriedade chamada Parameters, onde você poderá adicionar os parâmetros que deseja passar do Delphi ao Rave. Abra o String Editor de parâmetros e adicione "pNome" (se desejar adicionar mais parâmetros, basta dar um ENTER e digitar o novo parâmetro na próxima linha).

Para que possamos visualizar o valor recebido através do parâmetro na tela, vamos seguir os passos de criação de um relatório profissional adicionando à tela um componente
Region da paleta Report. Ajuste as dimensões do componente Region para que utilize todo o espaço da página contida entre o pontilhado vermelho que delimita a área imprimivel do relatório. Arraste agora para o interior do Region um componente Band também da paleta Report, este que por sua vez se alinhará sózinho ao topo. Dentro da Band, adicione um componente Data Text e vá até a propriedade Data Field e clique sobre os 3 pontinhos "..." para abrir o Data Text Editor, no qual vá até o item Project Parameters e selecione o parâmetro "pNome" configurado e adicione-o (Insert Parameter) ao Data Text e confirme a tela. O próximo passo agora será a codificação do processo para execução do relatório no Delphi, onde após a criação de um novo projeto, arraste da paleta Rave para o formulário os seguintes componentes: - RvSystem - RvProject: defina a propriedade Engine para o RvSystem, onde ficam as configurações do relatório a ser exibido. Em ProjectFile procure o relatório criado no Rave Reports, será o projeto a ser executado. Adicione um Button ("Exibir relatório") ao formulário onde faremos a codificação do processo para passagem de valores ao parâmetro e também exibição do relatório em tela. Adicione o código a seguir ao evento OnClick do botão, onde o mesmo encontra-se comentado de acordo com a função desempenhada por cada bloco:
procedure
TForm1.Button1Click(Sender: TObject);

begin

{ fecha o projeto do relatório }
RvProject1.Close;

{ selecione o nome do parâmetro e atribui-lhe um valor }
RvProject1.SetParam('pNome','MAIKEL SCHEID');
{ seleciona o relatório a ser exibido }

RvProject1.Execute;

{ abre o projeto do relatório }

RvProject1.Open;
RvProject1.SelectReport('rptParam',True);
{ executa o relatório selecionado }
end;

Finalizado a codificação, execute o projeto e observe que o valor passado ao parâmetro está sendo exibido na tela do relatório (confira resultado na figura abaixo). Desta mesma maneira agora você poderá passar resultados de cálculos realizados no Delphi para ser exibidos no relatório, passar caminhos absolutos de imagens, entre outras funcionalidades que facilitarão seus relatórios.

Bom, por ora seria isto, acompanhe os próximos posts com novas dicas. Abraço

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.

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...

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.

quarta-feira, 21 de janeiro de 2009

Obtendo tamanho de arquivos

Alguma vez já pensou numa rotina para saber o tamanho de um arquivo? Bom, e isso é bem simples de fazer, com a declaração de uma única função já conseguimos resolver nosso problema, veja:

function TForm1.TamanhoArquivo(Arquivo: string): Integer;
begin
with TFileStream.Create(Arquivo, fmOpenRead or fmShareExclusive) do
try
Result := Size;{resultado em bytes}
finally
Free;
end;
end;


Agora para mostrar um resultado, você pode adicionar à tela um componente OpenDialog e um Button, adicionando ao evento OnClick do button o seguinte código:

if OpenDialog1.Execute then
begin
ShowMessage('Tamanho do arquivo é '+FloatToStr(TamanhoArquivo(OpenDialog1.FileName)/1024));
end;


Agora simples, implemente a função nas suas rotinas de programação, deixando seus sistemas mais funcionais. Por ora seria isto, até a próxima.

Destacando palavras no RichEdit

Bom galera, de volta das férias, de volta aos posts. Já de início, uma coisa que a algum tempo vinha despertando minha curiosidade, e hoje, vendo um post de usuário no fórum do Imasters, resolvi colocar a cabeça pra pensar. Imagine, um formulário no Delphi onde você vai digitando normalmente seu texto, e dentro dele, algumas palavras vão ganhando destaque, cores diferentes, ficam em negrito. Da mesma forma como acontece no Word, ao digitar "microsoft" ele corrige e troca para "Microsoft", ou, porque não fazer com que fique imediatamente em negrito também, assim "Microsoft".

De início, crie um novo projeto Windows Forms (Win32) no Delphi, em seguida, adicione os seguintes componentes: Edit (Edit1), ColorBox (ColorBox1) da paleta additional,um Button (Button1) e um RichEdit (RichEdit1) da paleta Win32.

Agora, no código, no corpo da unit, crie um novo tipo (nova declaração de tipo), adicionando as seguintes linhas logo após a linha "type":

TRPalavras = Record
DS_PALAVRA: String;
VR_COR : TColor;
ESTILO : TFontStyles;
end;

TAPalavras = array of TRPalavras;

Agora, declare uma variável do tipo private, da seguinte forma:

APalavras : array of TRPalavras;

Esta varável irá descender do tipo TRPalavras criado anteriormente.

Acessando agora o evento OnClick do botão, adicione o código a seguir, o qual será responsável por armazenar no array quais as palavras e respectivas cores que devem ser destacadas no texto a ser digitado no componente RichEdit.

{ Adicionando as palavras a lista }
SetLength( APalavras, Length( APalavras )+1 );
APalavras[ High( APalavras ) ].DS_PALAVRA := Edit1.Text;
APalavras[ High( APalavras ) ].VR_COR := ColorBox1.Selected;
APalavras[ High( APalavras ) ].ESTILO := [fsBold];

Por final, adicione também ao evento OnKeyUp do RichEdit o código a seguir, código este que irá identificar o início e fim de uma palavra que está sendo digitada, fazendo sua comparação com as palavras armazenadas. Caso a palavra digitada coincida com uma das armazenadas, um comando for será disparado fazendo com que todas as letras sejam destacadas em negrito e de acordo com a cor selecionada com componente ColorBox.

procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
const
LetrasValidas = ['a'..'z', 'A'..'Z', '0'..'9', '<', '>', '!', '='];

var
iPosIni: Integer;
iPosFim: Integer;
iSelStart: Integer;
iSelLength: Integer;
iLoopFor: Integer;
sText: String;
begin

LockWindowUpdate(RichEdit1.Handle);

{ guardaremos a posição inicial }
iSelStart := RichEdit1.SelStart;
iSelLength := RichEdit1.SelLength;

sText := RichEdit1.Text;

{ Acharemos o inicio da palavra }
iPosIni := iSelStart;
if sText[ iPosIni ] in LetrasValidas then
begin
for iLoopFor := iSelStart-1 downto 0 do
begin
if sText[ iLoopFor ] in LetrasValidas then
iPosIni := iLoopFor
else
Break;
end;
end;

{ Acharemos o final da palavra }
iPosFim := iSelStart;
for iLoopFor := iSelStart+1 to Length( RichEdit1.Text ) do
begin
if RichEdit1.Text[ iLoopFor ] in LetrasValidas then
iPosFim := iLoopFor
else
Break;
end;

{ Selecionaremos a palavra }
RichEdit1.SelStart := iPosIni-1;
RichEdit1.SelLength := (iPosFim)-RichEdit1.SelStart;

{ setaremos a cor original e estilo original }
RichEdit1.SelAttributes.Color := clBlack;
RichEdit1.SelAttributes.Style := [];

{ Atribuiremos a nova cor e estilo caso encontre a palavra }
for iLoopFor := 0 to High( APalavras ) do
begin
if UpperCase(APalavras[ iLoopFor ].DS_PALAVRA) = UpperCase(RichEdit1.SelText) then
begin
RichEdit1.SelAttributes.Color := APalavras[ iLoopFor ].VR_COR;
RichEdit1.SelAttributes.Style := APalavras[ iLoopFor ].ESTILO;
Break;
end;
end;

{ Posicionaremos o cursor na posição original }
RichEdit1.SelStart := iSelStart;
RichEdit1.SelLength := iSelLength;

LockWindowUpdate(0);

end;

Com o sistema em funcionamento, ao adicionarmos a palavra "microsoft", e digitarmos um texto no componente RichEdit da tela, ao digitarmos alguma das palavras adicionadas, a mesma será descada, conforme mostra a imagem.

Assim, faça a implementação em seus sistemas, boa leitura e até a próxima.
Obs.: Deixe um comentário com seu nome / e-mail para receber os fontes.

quinta-feira, 13 de novembro de 2008

Dicas de DBGrid - Final [Mostrando Imagens]

Mostrando Imagens no DBGrid

Muito útil também na analise das informações de um DBGrid, um recurso que este componente também possibilita é o uso de imagens em agregadas à colunas e valores do mesmo. Para configurar o recurso de imagens, adicione ao formulário um componente ImageList da paleta de componentes Win32 e com um duplo clique sobre o mesmo, utilize o botão “Add” para adicionar dois ícones que utilizaremos na representação de aprovado ou reprovado quanto a nota média obtida pelo aluno. Os ícones poderão normalmente ser encontrados nos diretório “C:\Arquivos de Programas\Arquivos Comuns\Borland Shared\Images\Buttons”.

Após adicionados os ícones, vá até o evento DrawColumnCell do gdRegistros, onde criamos a pouco as linhas de código responsáveis por zebra o DBGrid. Os códigos de adição de imagens serão conciliados aos códigos já adicionados, onde o evento deverá ter o seguinte código exibido na Listagem 3.

Listagem 3. Utilizando imagens no DBGrid

procedure TfrmPrincipal.gdRegistrosDrawColumnCell(Sender: TObject;

const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

var

bitmap : TBitmap;

fixRect : TRect;

bmpWidth : integer;

imgIndex : integer;

begin

//Deixa o DBGrid Zebrado

if not Odd (cdsRegistros.RecNo) then

if not (gdSelected in State) then

begin

gdRegistros.Canvas.Brush.Color := clSilver;

gdRegistros.Canvas.FillRect(Rect);

gdRegistros.DefaultDrawDataCell(Rect,Column.Field,State);

end;

//Incrementa as inagens no DBGrid

fixRect := Rect;

if Column.Field = cdsRegistrosNotaMedia then

begin

//Utilizaremos uma condiçao simulando a média de aprovação 8

if cdsRegistrosNotaMedia.Value >= 8 then

imgIndex := 0

else

imgIndex := 1;

//Criar em runtime um TBitmap

bitmap := TBitmap.Create;

try

//Selecionando a imagem...

ImageList1.GetBitmap(imgIndex,bitmap);

//Fixar as dimensões do bitmap

bmpWidth := (Rect.Bottom - Rect.Top);

fixRect.Right := Rect.Left + bmpWidth;

//Desenhar o bitmap (imagem)

gdRegistros.Canvas.StretchDraw(fixRect,bitmap);

finally

//Limpa o TBitmap

bitmap.Free;

end;

//Ajustar o espaço do Retângulo para a imagem

fixRect := Rect;

fixRect.Left := fixRect.Left + bmpWidth;

end;

//Desenhar o texto no Grid

gdRegistros.DefaultDrawColumnCell(fixRect,DataCol,Column,State);

end;

Ao executar agora nossa aplicação, observe que o Grid ficou organizado de uma forma bem diferente, onde todas as médias de alunas iguais ou acima de 8 foram agregadas a uma imagem e o restante dos resultados a um outro Bitmap representando que os mesmos foram reprovados (Figura 5).

Figura 5. Aparência do DBGrid após implementação do uso de imagens

Opções do DBGrid

Ao selecionar o DBGrid observe uma propriedade chamada Options, na qual poderemos ainda fazer uma série de configurações na aparência do DBGrid. Irei apresentar algumas das opções mais utilizadas:

- dgEditing: deixe esta opção habilitada com True. É responsável por permitir a edição e cadastro de registros diretamente no Grid, recurso que no caso desta aplicação está sendo utilizado por não termos uma tela especifica para cadastros e edições.

- dbTitles: recurso onde você poderá optar entre exibir ou ocultar a linha de apresentação dos títulos do DBGrid, deixe-a como True.

- dgIndicator: permite que você escolha em exibir ou não a seta de indicação na linha do Grid que está selecionada. Altere o recurso para False.

- dgColLines: nesta opção você poderá configurar se deseja exibir ou ocultar as linhas das colunas do DBGrid. Deixe habilitada como True esta função.

- dgRowLines: altere esta opção para False e observe que as linhas entre os registros do DBGrid não estarão mais sendo exibidas.

- dgMultiSelect: propriedade que permite a configuração de permitir que o usuário selecione mais de uma linha por vez no DBGrid. Altere a opção para True.

Após estas configurações execute sua aplicação novamente e verifique uma aparência diferenciada da qual obteve na execução anterior. A aparência do Grid será semelhante a imagem ilustrada na Figura 6.

Figura 6. DBGrid modificado através da propriedade Options

Conclusão

Vimos nestes post formas praticas e interessantes de trabalhar e customizar a aparência do componente DBGrid em suas aplicações. Estas dicas aqui mostradas foram poucas comparado com o grande número de situações e customizações possíveis ao componente, fica então o desafio de você mesmo descobrir novos recursos, como por exemplo implantação de campos Lookup em um DBGrid ou ainda em tempo de execução estar adicionando outros componentes em Runtime como por exemplo um CheckBox. Grande abraço e até a próxima.

quinta-feira, 16 de outubro de 2008

Customizando tamanho de upload de arquivos em páginas asp.net

Em algumas das situações de desenvolvimento, faz-se necessário que rotinas de upload de arquivos para o servidor sejam configuradas. Há porém situações de upload que podem variar desde carregar uma foto, arquivo de texto até o upload de softwares, executáveis e arquivos compactados, de diferentes tamanhos.

Provavelmente quem já tenha utilizado esta rotina de upload já possa ter sido barrado pelo tamanho de limite do Framework (2.0) que fica em uma margem aproximada do tamanho máximo de 5 MB, de acordo com configurações default da instalação. Mas se a idéia for realizar um upload de software, por exemplo, que poderá chegar a 30 MB, como poderíamos fazer?

A solução para este problema é bem simples, trata-se nada mais do que uma configuração a ser realizada no arquivo Web.Config da aplicação, reescrevendo assim as limitações originais do Framework. No Web.Config, logo após o final da implementação da tag </system.net>, crie uma nova implementação chamada de location. Neste bloco, definiremos para qual página vamos reescrever as configurações do tamanho de upload, adicionando o seguinte trecho:


<location path="upload_page.aspx">
<system.web>
<httpRuntime maxRequestLength="20480" />
</system.web>
</location>


Observe que junto a tag location atribuímos um path, que se trata o nome para a página que iremos reescrever o limite de tamanho, e logo em seguida, na propriedade maxRequestLength, definimos em KB o tamanho permitido, no caso, 20 MB = (20 x 1024 Kb), chegando ao valor de 20480 que será configurado.

Ao executar a aplicação, o novo limite já poderá ser utilizado, lembrando que será valido apenas para a página configurada. No caso de reescrever para mais páginas, reescreva o bloco na quantidade de vezes que for necessário, um abaixo o outro. Em breve, farei um post apresentando alguns cuidados no momento de fazer upload de arquivos e a rotina de códigos necessários. Até a próxima.

quarta-feira, 15 de outubro de 2008

Utilizando javascript para manipular a visibilidade de painéis de pesquisa

Quem já não sentiu a necessidade de exibir ou ocultar painéis de pesquisa em uma aplicação asp.net? Uma solução interessante seria a utilização da propriedade Visible, definindo-a como True ou False de acordo com a necessidade, mas com desvantagens, pode ser apenas aplicado a componentes da VCL (runatserver) e é muito demorado, pelo fato que toda vez que uma manipulação necessita ser feita, toda a página é recarregada.

Uma das soluções para otimizar a situação é a utilização de blocos javascript integrados com os componentes da aplicação Delphi for asp.net. No RAD 2007 vamos criar uma nova asp.net application e simular um formulário de pesquisa, com possibilidade de filtrar por um período de dados, filtro este que se tornará visível a partir da seleção de um componente CheckBox.

Adicione ao formulário um componente CheckBox(ckFiltrar) da paleta Web Controls, da paleta HTML Elements arraste um componente HTML Flow Panel (Painel) que na verdade trata-se de uma div HTML e dentro da mesma adicione os textos “Data Inicial:” e “Data Final” seguido de dois componentes TextBox. Por último, logo abaixo a div, adicione um componente Button que irá simular a aplicação do filtro.

Iniciando pela criação dos blocos de javascript, vá até a página de código aspx e posicionando-se no head da página, adicione as seguintes funções javascript:

<head runat="server">
<title></title>
<script>
function FecharFiltro()
{
document.getElementById("Painel").style.

visibility="hidden";
}
function Filtro()
{
if (document.getElementById("ckFiltrar").

checked == true)
{
document.getElementById("Painel").style.

visibility="visible";
}
if (document.getElementById("ckFiltrar").

checked == false)
{
document.getElementById("Painel").style.

visibility="hidden";
}
}
</script>
</head>


Estas funções são responsáveis por manipular a visibilidade do painel de pesquisa, seja no momento em que a página for carregada ou seja na seleção do componente ckFiltrar onde utilizamos o if para verificar se o mesmo está marcado ou não.

Por último, precisamos vincular o código a página e ao componente ckFiltrar, vinculo este que será realizado no evento Load da página. Acessando o evento, digite as seguintes linhas de código:

ClientScript.RegisterStartupScript(GetType,

'OnLoad','<script>javascript:

FecharFiltro();</script>');
ckFiltrar.Attributes.Add('onClick',

'javascript:Filtro();');

Neste código, na primeira linha definimos que toda vez que a página for recarregada, a função javascript “FecharFiltro” será executada, ocultando o painel de pesquisa. Na segunda linha, atribuímos ao evento onClick do ckFiltrar a função “Filtro”, que fará a manipulação de visibilidade do painel de pesquisa.

Executando a aplicação, ao marcar e desmarcar o componente observe que o painel será exibido ou ocultado de acordo com a opção. Se estiver marcado, o painel estará visível.

Dessa mesma forma, poderá implementar mais funcionalidades em outros componentes utilizando javascript ou criar novos blocos de códigos. Até a próxima.