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!