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

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.

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.