VideoControl visible delphi

05/07/2020

0

Boa noite,

Tenho uma aplicação simples de slide em android, com imagens e videos. Funciona da seguinte forma:
Quando for uma imagem o videocontrol seto como visible:= false; e o imgconteudo seto visible:= true; e se for video é o contrario.

Porém no caso do videocontrol não respeita fica um quadro preto do videocontrol.
Segue o código que utilizo.

if dtmod.imagenslocvideo.Text <> '1' then
  begin
   MediaPlayer1.STOP;
   MediaPlayerControl1.Visible:= False;
   imgconteudo.Visible:= True;
  end;

   if dtmod.imagenslocvideo.Text = '1' then
  begin
   imgconteudo.Visible:= false; 
   MediaPlayerControl1.Visible:= true;
   MediaPlayer1.CurrentTime:= 1;
   MediaPlayer1.media.Play;  
       
  end;
Jordan Bernardes

Jordan Bernardes

Responder

Posts

06/07/2020

Emerson Nascimento

tente, sempre que possível, deixar o código menos 'verboso':
MediaPlayerControl1.Visible := (dtmod.imagenslocvideo.Text = '1');
imgconteudo.Visible := not MediaPlayerControl1.Visible;

if MediaPlayerControl1.Visible then
begin
  MediaPlayer1.CurrentTime := 1;
  MediaPlayer1.media.Play;
end
else
   MediaPlayer1.STOP;

// para o caso da aparência da tela, talvez um Refresh() ou Repaint() no form e/ou nos componentes funcione
// alterne entre os comandos abaixo, ou ative todos. algum deles deve funcionar.
MediaPlayer1.Resfreh();
//Formulario.Refresh();
//Formulario.Repaint();


Responder

06/07/2020

Jordan Bernardes

tente, sempre que possível, deixar o código menos 'verboso':
MediaPlayerControl1.Visible := (dtmod.imagenslocvideo.Text = '1');
imgconteudo.Visible := not MediaPlayerControl1.Visible;

if MediaPlayerControl1.Visible then
begin
  MediaPlayer1.CurrentTime := 1;
  MediaPlayer1.media.Play;
end
else
   MediaPlayer1.STOP;

// para o caso da aparência da tela, talvez um Refresh() ou Repaint() no form e/ou nos componentes funcione
// alterne entre os comandos abaixo, ou ative todos. algum deles deve funcionar.
MediaPlayer1.Resfreh();
//Formulario.Refresh();
//Formulario.Repaint();




Obrigado por sua resposta, mais o problema continua fica uma tela preta na hora de trocar de vídeo para imagem. A imagem fica no fundo e fica o quadro preto do mediaplayercontrol sobre a imagem.
Responder

07/07/2020

Emerson Nascimento

Sei que é um "ajuste técnico" mas... e se você alterar a largura e a altura do objeto? ou ainda posicioná-lo fora do seu container?
Tenha uma variável que guarda a posição original do componente e, ao exibir o form, atribua conteúdo a ela.
Algo assim:
procedure TFormX.FormShow(Sender: TObject);
begin
  PosTopMediaControl := MediaPlayerControl1.Top;

  [demais comandos do OnShow]
end;

daí, no momento de tratar a apresentação do componente:
MediaPlayerControl1.Visible := (dtmod.imagenslocvideo.Text = '1');
imgconteudo.Visible := not MediaPlayerControl1.Visible;
 
if MediaPlayerControl1.Visible then
begin
  MediaPlayer1.Top := PosTopMediaControl; // PosTopMediaControl foi atribuída no OnShow
  MediaPlayer1.CurrentTime := 1;
  MediaPlayer1.media.Play;
end
else
begin
  MediaPlayer1.STOP;
  MediaPlayer1.Top := TWinControl(TMediaPlayer1.Parent).Height + 10; // joga o componente pra fora do objeto que o comporta
end;
 
TWinControl(MediaPlayer1.Parent).Resfreh;

Responder

07/07/2020

Jordan Bernardes

Sei que é um "ajuste técnico" mas... e se você alterar a largura e a altura do objeto? ou ainda posicioná-lo fora do seu container?
Tenha uma variável que guarda a posição original do componente e, ao exibir o form, atribua conteúdo a ela.
Algo assim:
procedure TFormX.FormShow(Sender: TObject);
begin
  PosTopMediaControl := MediaPlayerControl1.Top;

  [demais comandos do OnShow]
end;

daí, no momento de tratar a apresentação do componente:
MediaPlayerControl1.Visible := (dtmod.imagenslocvideo.Text = '1');
imgconteudo.Visible := not MediaPlayerControl1.Visible;
 
if MediaPlayerControl1.Visible then
begin
  MediaPlayer1.Top := PosTopMediaControl; // PosTopMediaControl foi atribuída no OnShow
  MediaPlayer1.CurrentTime := 1;
  MediaPlayer1.media.Play;
end
else
begin
  MediaPlayer1.STOP;
  MediaPlayer1.Top := TWinControl(TMediaPlayer1.Parent).Height + 10; // joga o componente pra fora do objeto que o comporta
end;
 
TWinControl(MediaPlayer1.Parent).Resfreh;



Emerson muito obrigado por sua ajuda, quanto ao problema da imagem resolvi deixando somente o vídeo. Porem agora me deparo com outro o problema, eu deixei somente videos executando em loop. Depois de um determinado tempo o App simplemente informa que parou de responder e fecha. Segue o código que esta em timer de 20 segundos:

MediaPlayer1.STOP;
TBlobField(dtmod.imagensloc.FieldByName('IMAGEM')).SaveToFile(TPath.GetDocumentsPath + PathDelim +dtmod.imagensloccdinscricao.Text+dtmod.imagensloccodigo.Text+'.3gp');

MediaPlayer1.FileName:= TPath.GetDocumentsPath + PathDelim +dtmod.imagensloccdinscricao.Text+dtmod.imagensloccodigo.Text+'.3gp';
MediaPlayer1.media.Play;
Responder

07/07/2020

Emerson Nascimento

O procedimento está correto? Você grava o mesmo arquivo a cada 20 segundos?
Ou tem alguma outra parte do código que posiciona em outro registro?

Tomando como base somente o código apresentado, o sistema está gravando o mesmo arquivo desnecessariamente a cada 20 segundos..

Veja se a alteração abaixo ajuda:
strNomeArquivo := TPath.GetDocumentsPath + PathDelim + dtmod.imagensloccdinscricao.Text + dtmod.imagensloccodigo.Text + '.3gp';

if not FileExists(strNomeArquivo) then // não sei se FileExists() funciona na plataforma
  TBlobField(dtmod.imagensloc.FieldByName('IMAGEM')).SaveToFile(strNomeArquivo);

if (MediaPlayer1.FileName <> strNomeArquivo) then
begin
  MediaPlayer1.STOP;
  MediaPlayer1.FileName := strNomeArquivo;
end;

MediaPlayer1.media.Play;

OBS.: Se eu entendi a finalidade do código, acho que pode ser mais fácil verificar se o componente não tem uma propriedade AutoRewind, ou Loop, para que o vídeo fique em loop diretamente pelo componente.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar