VideoControl visible delphi
05/07/2020
0
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
Posts
06/07/2020
Emerson Nascimento
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();
06/07/2020
Jordan Bernardes
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.
07/07/2020
Emerson Nascimento
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;
07/07/2020
Jordan Bernardes
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;
07/07/2020
Emerson Nascimento
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.
Clique aqui para fazer login e interagir na Comunidade :)