terça-feira, 10 de abril de 2007

Como integrar aquivos Flash (.swf) no Delphi

Existe um controle activeX que permite a integração de arquivos “swf “no Delphi. Vamos instalar esse controle activeX para prosseguirmos com nosso exemplo.

No Delphi, acesse o menu Component ► Import ActiveX Control. Em seguida selecione o controle Shockwave Flash que está presente na listagem abaixo do título “Import ActiveX”. Este ActiveX já é instalado junto com o Windows.


Em seguida, clique no botão “Install” situado no canto inferior da tela. Na janela seguinte, cujo o título é “Install Component”, vc deve selecionar em que package vc deseja adicionar esse novo componente.



Vc pode escolher uma das packages já existentes, para isso, na aba cujo o título é “Into existing package”, selecione uma das listadas na combo desta tela e click “Ok”.




Ou, para criar uma nova package, na aba “ into new Package”, em Package file name, defina um path e nome de arquivo para criação da package.



Ao confirmar clickando em "OK" o Delphi irá lhe avisar que a package será reconstruída, “package .... will be rebuilt. Continue? ”.



Confirme, a partir daí o Delphi irá fazer o restante automaticamente e quando terminar, lhe informará que o componente TShockwaveFlash foi instalado com sucesso. Observe agora que o esse componente recém instalado se encontra presente na palheta ActiveX.



"Criando um arquivo “.Res"

Crie um diretório para que possamos construir o arquivo de recurso (“.res”). Esse arquivo usaremos para poder carregar o flash para a plicação Delphi, sugiro: “C:\ExemploFlashDelphi”.

Copie o arquivo swflash.ocx, que pode ser encontrado no diretório “c:\windows\system\macromed\flash”, ou “C:\WINNT\system32\Macromed\Flash” para o diretório criado anteriormente.

Copie também o arquivo compilado flash “.swf" que você irá exibir em sua aplicação Delphi para o mesmo diretório.

Agora vamos criar primeiro o arquivo “.rc”, abra o bloco de notas e insira essas duas linhas de comando abaixo:


SHOCKWAVEFILE RCDATA arquivo.swf

SHOCKWAVEOCX RCDATA swflash.ocx


O “arquivo.swf” é o nome do seu compilado flash (.swf). Salve esse txt onde acabamos referenciar “SHOCKWAVEFILE” e “SHOCKWAVEOCX” no mesmo diretório que criamos anteriormente e colocamos o “ocx” (“C:\ExemploFlashDelphi”) com o nome “FlashZn.rc” (o que importa aqui é a extenção do arquivo, “.rc”). Feito isso vamos abrir o Prompt do Ms-Dos e digitar a seguinte linha de comando:

"Brcc32 -r -32 C:\ExemploFlashDelphi \ FlashZn.rc"


Execute a linha de comando acima um para criar o arquivo “FlashZn.res".


Construindo um exemplo no Delphi

1 - Inicie uma nova aplicação no Delphi: Menu File ► New ► Application.

2 - Adicione no Form1 um ShockwaveFlash (Palheta ActiveX), set a propriedade align = alClient. Pressione F12 para exibir a página de código. Nela, procure a palavra reservada “implementation” abaixo da diretiva de compliação “{$R *.dfm}” adicione “{$R FlashZn.res}”.

3 – Na seção private do Form1 digite conforme o trecho de código abaixo a procedure CarregaFlash, em seguida pressione “Ctrl+Shift+C”:



type
TForm1 = class(TForm)
ShockwaveFlash1: TShockwaveFlash;
private
procedure CarregaFlash;
public
end;

Codifique o corpo da procedure conforme exemplo abaixo:

procedure TForm1.CarregaFlash;
const
AZnFlash = 'zn1.swf';
var
ZnAuxDir: String;
MySysDir : array[0..MAX_PATH] of Char;
FileSWFPath, AppDir: String;
AFileRes: TResourceStream;
AMyFile: TFileStream;
begin
GetSystemDirectory(@MySysDir,MAX_PATH);
FileSWFPath := MySysDir+'\macromed\flash\';
GetDir(0,AppDir); // Pega diretório corrente
// Verifica se já existe a OCX do flash na máquina
if not FileExists(FileSWFPath+'swflash.ocx') then
begin
ZnAuxDir := IncludeTrailingPathDelimiter(MySysDir)+'macromed');
// Cria o diretório da OCX, se necessário, e extrai o recurso.
if not DirectoryExists(ZnAuxDir) then
if not CreateDir(ZnAuxDir) then
raise Exception.Create('Não foi possível criar o diretório!');

CreateDir(IncludeTrailingPathDelimiter(ZnAuxDir) + 'flash');

AFileRes := TResourceStream.Create(0, 'SHOCKWAVEOCX', RT_RCDATA);
AMyFile := TFileStream.Create(FileSWFPath + 'swflash.ocx', fmCreate);
try
AMyFile.CopyFrom(AFileRes, AFileRes.Size);
finally
AFileRes.Free;
AMyFile.Free;
end;
// Registra a OCX
Winexec(PChar('regsvr32 /s ' + FileSWFPath + 'swflash.ocx'), SW_HIDE);
end;
// Extrai o .swf para o diretório da aplicação
AFileRes := TResourceStream.Create(0, 'SHOCKWAVEFILE',RT_RCDATA);
AMyFile := TFileStream.Create(AZnFlash, fmCreate);
try
AMyFile.CopyFrom(AFileRes, AFileRes.Size);
finally
AFileRes.Free;
AMyFile.Free;
end;
// Atribui o .swf para o componente
ShockwaveFlash1.Movie := IncludeTrailingPathDelimiter(AppDir) + AZnFlash;
end;

No Evento OnCreate do Form1 codifique:


procedure TForm1.FormCreate(Sender: TObject);
begin
CarregaFlash;
end;

OBS: Todos os arquivos devem estar no mesmo diretório do seu projeto Delphi (projetc1.dpr) para compilar o seu executável. O ".res", o ".ocx" e o arquivo ".swf" também.

Construí este exemplo a partir do código de um amigo, que por sua vez teve como referencia um exemplo do site Ramos da informática

2 comentários:

  1. Muito bom o seu artigo... me serviu bastante. Gostaria de saber se você tem algum exemplo do delphi passando uma string para o flash, já que no meu caso, isto é extremamente útil. Grato, Alexandre Marques (alexandre.marq@gmail.com)

    ResponderExcluir
  2. Da erro de file not found aqui : Fres := TResourceStream.Create(0,'SHOCKWAVEFILE',RT_RCDATA);

    ResponderExcluir