Ola pessoal,
Quem já tentou trabalhar com o componente PicShow? Bom tem
muitas pessoas que tentam trabalhar com este componente, mas por não entenderem
como ele funciona de fato é que existem tantas críticas para este fantástico
componente freeware para Delphi. No meu caso fiz um pequeno exemplo do
funcionamento deste componente, para exemplificar a sua utilização utilizando o
Delphi versão sete. Neste artigo estarei mostrando como fazer um apresentador
de fotos do zero com este componente, o formulário Splash, não será mostrado
aqui neste artigo porque este artigo irá mostrar como o componente funciona,
mas nos fontes estará o código fonte com o formulário splash, para fins de
estudos e aprofundamento dos leitores deste artigo.
Bom chega de bla..bla..bla.
Se você ainda não tem este componente pegue-o aqui:
Após instalar o componente em seu Delphi ele aparecerá em
uma nova aba em seu palet (chamada Delphi Area), vamos criar um novo projeto.
Em seu formulário você irá colocar os seguintes componentes:
1.
TabSheet;
Ø
Com o botão direito clicar em New Page;
Ø
Acrescentar:
1.
RadioGroup;
Ø
Na propriedade Items;
Ø
Seqüencial;
Ø
Randômico;
Ø
Desabilitar;
1.
SpeedButton;
2.
Toolbar;
1.
Timer;
1.
OpenPictureDialog;
1.
Pichsow; ( Muito Importante!)
Ø
StatusBar;
Bom colocados estes componentes em seu formulário vamos
adicionar em seu ToolBar os seguintes componentes na seguinte seqüência:
1.
Separator;
1.
Panel;
Ø
Dentro
do seu panel colocar:
1.
Combobox; (dentro do panel);
2.
Labels; (dentro do panel um ao lado do outro);
1.
Separator;
1.
Button;
1.
Separator;
1.
Panel;
1. TrackBar
2. Labels;
1.
CheckBox;
Prontinho. Seu formulário deverá ficar parecido com este, se
não for sem problemas.
Se não estiver assim sem problemas, pois você pode
personalizar o seu apresentador do seu jeito, no seu estilo.
Bom se você já montou o seu formulário, vamos fazê-lo
funcionar, mas antes disso compile seu projeto, o Delphi irá pedir para você
salva-lo, salve-o e compile-o, após o seu executável abrir pode fechar o
programa.
Note se o seu componente Picshow não foi corretamente
instalado neste processo o Delphi informará um erro. Tente resolver o erro
primeiro antes de continuar nos próximos passos.
Bom se você compilou e executou seu projeto com sucesso,
parabéns, pois você esta prestes a confeccionar seu apresentador de fotos.
Bom re-nomeando os componentes do formulário.
Ø
No componente PicShow1 tiraremos o “1” deixando apenas o PicShow.;
Ø
RadioGroup colocaremos o nome de rgStyleControl;
Ø
O componente Timer1 deixará apenas “Timer”;
Ø
O TrackBar colocaremos o nome de “tbDysplayInterval”;
Ø
O CheckBox colocaremos o nome de ckOverDRaw;
Ø
O Button colocaremos o nome de “btnChangePatch”;
Ø
O Label ao lado de sua TrackBar coloque o nome
de “lblDisplayIntervalValue”;
Bom como já damos os nomes aos “Bois”, então agora é ir para
o Code do Delphi, bom esta parte é interessante, pois PicShow ele trabalha da seguinte maneira: A
imagem é carregada previamente antes de ser apresentada, para uma boa
apresentação com todos os efeitos e para ficar uma apresentação limpa é
importante criar uma lista de todas as fotos em uma lista de imagens. Bom para
criar nossa lista de imagens, iremos utilizar o seguinte procedimento:
// Cria uma
lista de imagens para a apresentação
procedure
TMainForm.CreateImageList(const Path: String);
const
SNoImage = ''A pasta especifica não contem
arquivos compativeis à Foto.'';
var
FileList: TFileListBox;
begin
if Path <> pastaimagen then
begin
FileList := TFileListBox.Create(nil);
try
FileList.Visible := False;
FileList.Parent := Self;
FileList.Mask := GraphicFileMask(TGraphic);
FileList.Directory := Path;
if FileList.Items.Count > 0 then
begin
fotos.Assign(FileList.Items);
pastaimagen := Path;
if (Length(Path) > 0) and
(pastaimagen[Length(Path)] = ''\'') then
Delete(pastaimagen, Length(Path), 1);
StatusBar.Panels[2].Text :=
IntToStr(fotos.Count) + '' Imagen(s)'';
StatusBar.Panels[3].Text := ''Pasta: '' +
Path;
LoadNextImage;
end
else
MessageDlg(Path + #13#10 + SNoImage,
mtWarning, [mbCancel], 0);
finally
FileList.Free;
end;
end;
end;
Bom como você pode perceber este procedimento não faz
referencia a nenhum componente de seu formulário, então devemos declarar esta
procedure, bom, mas onde declarar isso, você pode perguntar, vamos ver o seu
Code: bem em cima em seu Code Editor você encontra-rá a Cláusula Private. Neste
espaço você vamos declarar o seguinte:
private
fotos: TStringList;
pastaimagen: String;
mostrandoimagem: String;
fotocarregada: String;
{$IFDEF CAPTURE} // em outro artigo explico como se usa isso.
capturasequencia: Integer;
procedure CaptureScreen;
{$ENDIF}
procedure CheckTimer;
procedure ShowNextImage;
procedure LoadNextImage;
procedure CreateImageList(const Path: String);
procedure SetFullScreen(Active: Boolean);
end;
Pronto agora
podemos continuar o desenvolvimento da aplicação.
Vamos declarar
agora o procedimento CaptureScreen Deverá ficar assim (seu código inicial do
seu projeto.
implementation
{$R *.DFM}
uses
FileCtrl {$IFDEF COMPILER7_UP}, XPMan {$ENDIF};
{$IFDEF
CAPTURE}
//Captura a
resolução da tela para ajuste da imagens dentro do componente
procedure TMainForm.CaptureScreen;
var
Bitmap: TBitmap;
ScrDC: HDC;
begin
Update;
Bitmap := TBitmap.Create;
try
Bitmap.Canvas.Brush.Color := clFuchsia;
Bitmap.Width := Width;
Bitmap.Height := Height;
Bitmap.HandleType := bmDIB;
ScrDC := GetDC(0);
try
BitBlt(Bitmap.Canvas.Handle, 0, 0, Width, Height, ScrDC, Left, Top,
SRCCOPY);
finally
ReleaseDC(0, ScrDC);
end;
Bitmap.SaveToFile(Format(CaptureFile, [CaptureSequence]));
finally
Bitmap.Free;
end;
Inc(CaptureSequence);
end;
{$ENDIF}
// Ativa e
desatia o modo tela cheia
procedure
TMainForm.SetFullScreen(Active: Boolean);
begin
if Active and (PicShow.Align = alClient) then
begin
PicShow.SetFocus;
PicShow.Align := alNone;
PicShow.BgMode := bmNone;
PicShow.FrameWidth := 0;
PicShow.ShowHint := False;
Windows.SetParent(PicShow.Handle, 0);
PicShow.SetBounds(0, 0, Screen.Width, Screen.Height);
SetWindowPos(PicShow.Handle, HWND_TOPMOST, 0, 0, Screen.Width,
Screen.Height, SWP_SHOWWINDOW);
ShowCursor(False);
end
else if not Active and (PicShow.Align = alNone) then
begin
Windows.SetParent(PicShow.Handle, Self.Handle);
PicShow.Align := alClient;
PicShow.ShowHint := True;
ShowCursor(True);
end;
end;
Certo agora
clique em seu timer e nas propriedades coloque Enabled:= False, de um duplo
clique nele e coloque a seguinte linha:
procedure
TMainForm.TimerTimer(Sender: TObject);
begin
ShowNextImage;
end;
Agora vamos
declarar o procedimento CheckTimer, deverá ficar assim:
// Atividade
baseada no estado de controle do componente
procedure TMainForm.CheckTimer;
begin
Timer.Enabled := not PicShow.Busy and (fotos.Count > 0);
end;
Vamos
declarar agora o procedimento ShowNextImage Deverá ficar assim:
// começa a
apresentaçao da imagens que já carregadas anteriormente na função loadimage
procedure TMainForm.ShowNextImage;
begin
Timer.Enabled := False;
// Se nao tem mais imagens na lista o programa sai
if fotos.Count = 0 then Exit;
// Se o pichow inicou a apresentaçao para tudo!
if PicShow.Busy then PicShow.Stop;
// Seta o stilo de transação de acordo com a escolha do usuário
case rgStyleControl.ItemIndex of
0: cbStyle.ItemIndex := (cbStyle.ItemIndex + 1) mod cbStyle.Items.Count;
1: cbStyle.ItemIndex := Random(cbStyle.Items.Count);
end;
cbStyleChange(nil);
// Refresh do nome da foto
mostrandoimagem := fotocarregada;
StatusBar.Panels[0].Text := ''mostrando: '' +
mostrandoimagem;
// Começa a apresentação
PicShow.Execute;
end;
Bom agora vamos declarar a função LoadNextImage,
Deverá ficar assim:
procedure TMainForm.LoadNextImage;
var
Index: Integer;
begin
fotocarregada := '''';
if fotos.Count > 0 then
begin
repeat
Index := Random(fotos.Count);
until (fotos.Count <= 1) or (mostrandoimagem <>
fotos[Index]);
fotocarregada := fotos[Index];
PicShow.Picture.LoadFromFile(pastaimagen +
''\'' + fotocarregada);
end;
StatusBar.Panels[1].Text := ''Próx.: '' +
fotocarregada;
end;
Agora que já
declaramos as funções para carregar a imagen e para apresenta-la precisamos
criar a lista de imagens para serem lidas pelo nosso sistema. Então agora vamos
declarar o procedimento CreateImageList
procedure
TMainForm.CreateImageList(const Path: String);
const
SNoImage = ''A pasta especifica não Contem
arquivos compatíveis à Foto.'';
var
FileList: TFileListBox;
begin
if Path <> pastaimagen then
begin
FileList := TFileListBox.Create(nil);
try
FileList.Visible := False;
FileList.Parent := Self;
FileList.Mask := GraphicFileMask(TGraphic);
FileList.Directory := Path;
if FileList.Items.Count > 0 then
begin
fotos.Assign(FileList.Items);
pastaimagen := Path;
if (Length(Path) > 0) and
(pastaimagen[Length(Path)] = ''\'') then
Delete(pastaimagen, Length(Path), 1);
StatusBar.Panels[2].Text :=
IntToStr(fotos.Count) + '' Imagen(s)'';
StatusBar.Panels[3].Text := ''Pasta: '' +
Path;
LoadNextImage;
end
else
MessageDlg(Path + #13#10 + SNoImage,
mtWarning, [mbCancel], 0);
finally
FileList.Free;
end;
end;
end;
Bom está
quase pronto. Falta pouco...
Agora
selecione o seu ComboBox chamado de cbStyleChange, e coloque o seguinte ,deverá
ficar assim:
procedure TMainForm.cbStyleChange(Sender:
TObject);
begin
if PicShow.Style <> cbStyle.ItemIndex + 1 then
begin
PicShow.Style := cbStyle.ItemIndex + 1;
lblStyleNo.Caption := Format(''[ #%d ]'', [PicShow.Style]);
lblStyleNo.Update;
cbStyle.Hint := PicShow.StyleName;
if PtInRect(cbStyle.BoundsRect,
cbStyle.Parent.ScreenToClient(Mouse.CursorPos)) then
Application.CancelHint;
end;
end;
Agora no
componente TrackBar na guia propriedades localize o campo Max e Min bom neste momento
vamos setar o seguinte:
Max = 9500
Min = 500
LineSize=500;
Frequency=
500
Possition= 1000
PageSize= 500
Feito isso
de dois cliques no componente e coloque o seguinte código:
procedure
TMainForm.tbDisplayIntervalChange(Sender: TObject);
begin
Timer.Interval := tbDisplayInterval.Position;
lblDisplayIntervalValue.Caption := Format('' %.1f segundos '',
[Timer.Interval / 1000]);
end;
Agora vamos
clicar duas vezes no seu button do ToolBar, seu código dele deverá ficar assim:
procedure
TMainForm.btnChangePathClick(Sender: TObject);
var
Path: String;
begin
Path := pastaimagen;
if SelectDirectory(''Selecione a pasta de suas fotos:'', '''', Path) then
CreateImageList(Path);
end;
Agora no
SpeedButon dentro de seu Pagecontrol coloque o seguinte código:
procedure
TMainForm.SpeedButton1Click(Sender: TObject);
begin
Randomize;
{$IFDEF CAPTURE}
PicShow.ShowHint := False;
PicShow.Step := 5;
PicShow.ExactTiming := False;
rgStyleControl.ItemIndex := 0; // Random Style
{$ENDIF}
// Cria uma lista de strings para gravar a listagem das imagens
fotos := TStringList.Create;
// upgrade das propriedades do picshow
PicShow.GetStyleNames(cbStyle.Items);
cbStyle.ItemIndex := PicShow.Style - 1;
ckOverDraw.Checked := PicShow.OverDraw;
tbDisplayInterval.Position := Timer.Interval;
if ParamCount > 0 then
CreateImageList(ParamStr(1))
else
//aqui o nome "Fotos" é o nome da
pasta das imagens.
CreateImageList(ExtractFilePath(Application.ExeName) + ''Fotos'');
// Checa o estado do tiner da foto
CheckTimer;
end;
Agora
localize em seu componente PicShow os seguintes eventos:
Ø
PicshowStart;
Ø
PicshowStop;
Ø
PicShowProgress;
Ø
Dblclick;
Para eles
coloque os códigos seguintes, nestes eventos
procedure
TMainForm.PicShowStart(Sender: TObject; Picture, Screen: TBitmap);
begin
CheckTimer;
LoadNextImage;
end;
procedure
TMainForm.PicShowStop(Sender: TObject);
begin
CheckTimer;
end;
procedure
TMainForm.PicShowProgress(Sender: TObject);
begin
{$IFDEF CAPTURE}
CaptureScreen;
{$ENDIF}
end;
procedure
TMainForm.PicShowDblClick(Sender: TObject);
begin
SetFullScreen(PicShow.Align <> alNone);
end;
Prontinho
agora os retoques finais, no seu form1 localize estes eventos:”
Ø
OnDestroy;
Ø
KeyDown;
Coloque estes
códigos:
procedure
TMainForm.FormDestroy(Sender: TObject);
begin
fotos.Free;
end;
procedure
TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_ESCAPE) and (PicShow.Align = alNone) then
begin
SetFullScreen(False);
Key := 0;
end;
end;
Pronto agora
você pode compilar seu projeto, e ver seu apresentador de fotos funcionando.
Se você ao compilar tiver problemas com a unit
FileCTRL, no inicio de Seu SourceCode declare o seguinte:
unit Main;
{$IFDEF COMPILER6_UP}
{$WARN UNIT_PLATFORM OFF} //
evita problemas com a unit FileCtrl
{$ENDIF}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, ExtDlgs, PicShow,
{$IFDEF COMPILER2009_UP} PngImage, {$ENDIF} jpeg, Buttons, ToolWin;
{$IFDEF CAPTURE}
const
CaptureFile = ''C:\PS%6.6u.bmp'';
{$ENDIF}
Bons estudos!