TMediaPlayer em tempo de execução

Em certas circunstâncias, conforme o resultado de algum evento da aplicação, pode ser conveniente chamar a exibição de algum vídeo em um segundo formulário (criado dinamicamente pelo operador new) por meio de um componente TMediaPlayer. Alguns problemas podem resultar dessa decisão. Por exemplo, se o programa estiver sendo desenvolvido para rodar em outros computadores, certamente a propriedade FileName deste componente, marcada inicialmente em tempo de projeto no Object Inspector, deverá ser alterada. Evidentemente, se a exibição do vídeo for uma resposta automática do programa a alguma ação do usuário, a chamada de uma caixa de diálogos (OpenDialog) mostrar-se-á uma solução deselegante e inadequada.

Simplesmente tentar alterar o FileName do TMediaPlayer no código provocará o retorno de mensagens de erros. Uma solução para essas situações é remover o TMediaPlayer colocado no segundo formulário em tempo de desenho e criá-lo em tempo de execução, também por meio do operador new:

1 - Crie uma nova aplicação;

2 - Dê um clique no menu File e depois em New Form;

3 - No menu Project, dê um clique em Options. Na caixa Project Options que se abrirá, escolha a aba Forms;

4 – Selecione Form2 e dê um clique no botão >, mudando esse formulário para a lista Available forms. Em seguida dê um OK. Isso impedirá que esse formulário seja criado automaticamente na inicialização do programa.

5 – Pegue um componente Animate na guia Win32 e o coloque no Form2. Marque a propriedade AutoSize para false, (a propriedade Height para 175 e a propriedade Width para 200 – ou verificar o tamanho desejado). Dê um clique e arraste o controle Animate para o canto superior esquerdo do form.

6 - Agora mude o tamanho do form para o tamanho do controle Animate.

7 – Coloque um Button no primeiro Formulário (Form1) e em seu evento OnClick digite o código responsável pela criação e destruição do segundo formulário:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TForm2 *Form2;
    Form2 = new TForm2(Application);
    Form2->ShowModal();
    delete Form2;
}



8 – Na região dos include da Unit1.cpp digite:

#include "Unit2.h"

Com essas medidas já conseguimos criar o segundo formulário dinamicamente, porém ainda sem a exibição do vídeo.

NOTA: Vamos partir do princípio de que o arquivo de vídeo a ser exibido sempre será instalado juntamente com o programa, na mesma pasta do executável. Dessa forma, o programa sempre saberá onde localizá-lo, independente do diretório ou disco.

9 – No evento OnActivate de Form2, escrevemos o código responsável pela criação dinâmica do TMediaPlayer, bem como pela exibição do vídeo no componente Animate.

void __fastcall TForm2::FormActivate(TObject *Sender)
{
TMediaPlayer *MediaPlayer1 = new TMediaPlayer(this);
MediaPlayer1->Parent = this;
MediaPlayer1->Left = 0;
MediaPlayer1->Top = 1;
MediaPlayer1->Visible = false;
MediaPlayer1->FileName =
(ExtractFilePath(Application->ExeName) + "Meu_Video.avi"); //especifique o arquivo
MediaPlayer1->DeviceType = dtAVIVideo; 
MediaPlayer1->Display = Animate1; 
MediaPlayer1->Open();
MediaPlayer1->Play();

}

10 – O componente TMediaPlayer precisa ser destruído (evento OnDestroy de Form2):

void __fastcall TForm2::FormDestroy(TObject *Sender)
{
delete MediaPlayer1;

}

11 – Na Unit2.h, digite:

TMediaPlayer *MediaPlayer1;

na parte __published:

bem como:

#include <Mplayer.hpp>

na região dos include.

Pode rodar o programa.

IMPORTANTE: responda "no" para a pergunta que o compilador fará se você deseja remover a declaração TMediaPlayer *MediaPlayer1; da Unit2.h.



Abaixo transcrevemos o código completo do programa:

Unit1.h

//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
private:        // User declarations
public:         // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Unit1.cpp


//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TForm2 *Form2;
    Form2 = new TForm2(Application);
    Form2->ShowModal();
    delete Form2;
}
//---------------------------------------------------------------------------


Unit2.h


//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <MPlayer.hpp>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published:    // IDE-managed Components
        TMediaPlayer *MediaPlayer1;
        TAnimate *Animate1;
        void __fastcall FormActivate(TObject *Sender);
        void __fastcall FormDestroy(TObject *Sender);
private:        // User declarations
public:         // User declarations
        __fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif



Unit2.cpp


//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm2::FormActivate(TObject *Sender)
{
TMediaPlayer *MediaPlayer1 = new TMediaPlayer(this);
MediaPlayer1->Parent = this;
MediaPlayer1->Left = 0;
MediaPlayer1->Top = 1;
MediaPlayer1->Visible = false;
MediaPlayer1->FileName =
(ExtractFilePath(Application->ExeName) + "Meu_Video.avi"); //especifique o vídeo
MediaPlayer1->DeviceType = dtAVIVideo; 
MediaPlayer1->Display = Animate1; 
MediaPlayer1->Open();
MediaPlayer1->Play();        
}
//---------------------------------------------------------------------------

void __fastcall TForm2::FormDestroy(TObject *Sender)
{
delete MediaPlayer1;
}
//---------------------------------------------------------------------------



Nota: Para exibição de um vídeo no mesmo formulário, veja o tutorial a respeito neste Site.



HOME || MAPA DO SITE || CURSOS || TUTORIAIS || LINKS || FORUM || CONTATO