none
Formulário pisca enquanto redimensiona RRS feed

  • Pergunta

  • Estou desenvolvendo uma pequena aplicação em VB 2008 e estou experimentando um tremular da janela (formulário) enquanto ele é redimensionado.

    Acontece que eu reposiciono o conteúdo, que está em um TableLayoutPanel com um código simples, mas o Utilizador vê um tremular de aproximadamente um segundo.

    Há possibilidade de o formulário somente ser exibido após este redimensionamento? Ou o redimensionamento ser efetivado em segundo plano?

    Code Snippet

    Private Sub frmProfessores_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize

    ' Posiciona a tabAlunos no centro da tela (frmPrincipal).

    tlpProfessores.Left = (Me.Width / 2) - (Me.tlpProfessores.Width / 2)

    tlpProfessores.Top = (Me.Height / 2) - (Me.tlpProfessores.Height / 2) - 60

    End Sub

     

     

    Ah, o fomulário é um MDI-Filho e é chamado e maximizado a partir do Pai:

    Code Snippet

    If Aluno Is Nothing OrElse Aluno.IsDisposed Then

    Aluno = New frmAluno

    Aluno.MdiParent = Me

    Aluno.Show()

    Aluno.WindowState = FormWindowState.Maximized

    Else

    ' Ele já está aberto

    Aluno.BringToFront()

    End If

     

     

    Obrigado!

    quinta-feira, 3 de julho de 2008 04:55

Respostas

  • Após várias tentativas, comprovadas (publicadas) em um outro computador com XP SP2 (o desenvolvimento se dá sob o Vista / VB2008), inclusive com figuras .JPG, .PNG e .BMP, não resta outra opção senão retirar a figura de fundo (logo).

     

    E dou por encerrada esta publicação.

     

    Muito agradecido ao ViewState por todo o empenho e votos de bom fim de semana a todos!

     

    sexta-feira, 11 de julho de 2008 05:29

Todas as Respostas

  • Grande,

     

    Tente ao invez de usar este resize, use a propriedade StartPosition com o valor CenterParent.

    segunda-feira, 7 de julho de 2008 18:36
  • O porém, ViewState, é que o TableLayoutPanel não possui a propriedade StartPosition. E centralizar o formulário onde este TableLayoutPanel está contido não é a solução, pois eu quero que este formulário fique sempre maximizado.

    Se eu maximizo o TableLayoutPanel fica na mesma posição relativa e, consequentemente, descentralizado.

     

    Obrigado!

     

    segunda-feira, 7 de julho de 2008 20:17
  • Não sei se entendi o seu problema....

     

    Vc tem um formulario pai.... Certo?

     

    Dentro dele vc quer abrir outra janela no esquema de MDI.... Certo?

     

    segunda-feira, 7 de julho de 2008 20:25
  • Sim, eu tenho um formulário MDI-Pai (frmPrincipal) que tem, entre vários, um MDI-Filho (frmEscolas).

     

    No frmEscolas, eu coloquei todos os objetos (campos, imagens, DataGridView, etc.) dentro das células de um TableLayoutPanel para poderem ser posicionados no centro do formulário aquando da maximização ou restauração.


    Quando o Utilizador abre o frmEscolas, ainda no código do frmPrincipal, ele (frmEscolas) é maximizado e o TableLayoutPanel é centralizado. Nesta hora ocorrem muitas piscadelas.

     

    O que eu quero é evitar que o frmEscolas seja apresentado antes da centralização dos objetos para que o Utilizador não veja todo aquele "pisca-pisca". Ou outra solução.

     

    Na esperança de ter sido mais claro, agradeço o seu interesse.

    segunda-feira, 7 de julho de 2008 22:09
  •  

    Você não esta usando dock no TableLayoutPanel e por conta disso tem que redimenciona-lo quando o seu form eh redimencionado certo?
    segunda-feira, 7 de julho de 2008 22:31
  • Não, ViewState, é importante que o TableLayoutPanel (e tudo o que está inserido nele) permanençam no tamanho "original". Ele deve apenas ser posicionado ao centro do MDI-Filho (frmEscolas).

     

    Aliás, foi por essa razão que eu optei por usar este contentor, para evitar de posicionar todos os objetos no centro da tela (do MDI-Filho).

     

    segunda-feira, 7 de julho de 2008 22:41
  • Agora sim entendi....

     

    Tenta o seguinte

     

    Code Snippet

    this.SuspendLayout();

    tableLayoutPanel1.Left = (this.Width / 2) - (tableLayoutPanel1.Width / 2);

    tableLayoutPanel1.Top = (this.Height / 2) - (tableLayoutPanel1.Height / 2) - 60;

    this.ResumeLayout();

     

     

     

    Tentei replicar o problema mas aqui não da isso. A ideia no codigo é enquanto vc ta trocando os valores ele não atualiza a tela, depois de trocado ele atualiza. Acho que deve ajudar.
    terça-feira, 8 de julho de 2008 15:32
  • Pos é, ViewStat, se eu retirar o BackgroundImage a sua dica fica cinco estrelas, mas se eu insistir em manter uma imagem (logo) de fundo, o problema persiste. Isso porque a imagem está com a opção BackgroundImageLayout ativada para esticar, e quando o formulário é redimensionado...

     

    Parece que dessa eu não fujo, não é mesmo? A não ser que eu carregue a imagem após o redimensionamento (vou tentar!).

     

    Ah, é em VB 2008 Express, por isso a sua dica fica melhor assim:

     

    Code Snippet

    Me.SuspendLayout()

    ' Posiciona a tlpDisciplinas no centro da tela (frmPrincipal).

    tlpDisciplinas.Left = (Me.Width / 2) - (Me.tlpDisciplinas.Width / 2)

    tlpDisciplinas.Top = (Me.Height / 2) - (Me.tlpDisciplinas.Height / 2) - 60

    Me.ResumeLayout()

     

     

     

    Aguardo um comentário seu para fecharmos mais essa, por favor.

     

    Desde já, obrigado!

     

    terça-feira, 8 de julho de 2008 17:28
  •  

    Realmente, mesmo carregando a imagem (de um arquivo de recursos) após o redimensionamento do formulário, há muitos piscas.

     

    Continuo a aguardar um comentário para fecharmos este tópico.

     

    Valeu!

    terça-feira, 8 de julho de 2008 17:35
  • Mesmo com a imagem de fundo não consigo replicar o problema, mas compreendo-o... Exitem outros 2 eventos que podem ser uteis, ResizeStart, ResizeEnd, talvez vc queira mover o table soh no ResizeEnd.

     

    terça-feira, 8 de julho de 2008 18:41
  • Caro ViewState, eu até coloquei um breakpoint para ter a certeza, mas nem o ResizeStart, nem o ResizeEnd são acionados. Apenas o Resize!

    Vai entender!

     

    De qualquer forma eu vou tentar com uma imagem pequena (a atual tem 800x600) para verificar se é performance, embora o meus 2GB no Core2Duo 2,8GHz com a Radeon X1550 correspondem bem à demanda.

     

    O MS SQL 2005 Express também tem se comportado bem noutras viagens...

     

    Para já, até ao final de semana, eu mantenho esta em aberto.

     

    Obrigado e até breve!

     

    terça-feira, 8 de julho de 2008 19:00
  • Nos testes com figuras pequenas o resultado é idêntico aos testes com figuras menores. Os formatos usados estão em .PNG com tamanhos que variam dos 25 aos 39kB.

     

    Bem, consegui reduzir bastante o pisca-pisca. Alterei o código no MDI-Pai...

     

    De:

    Code Snippet

    ' Abre o frmDisciplinas.

    ' Se ele nunca foi inicializado, significa que nunca foi aberto.

    If Disciplina Is Nothing OrElse Disciplina.IsDisposed Then

    Disciplina = New frmDisciplina

    Disciplina.MdiParent = Me

    Disciplina.Show()

    Disciplina.WindowState = FormWindowState.Maximized

    Else

    ' Ele já está aberto

    Disciplina.BringToFront()

    End If

     

     

    Para:

    Code Snippet

    ' Abre o frmDisciplinas.

    ' Se ele nunca foi inicializado, significa que nunca foi aberto.

    If Disciplina Is Nothing OrElse Disciplina.IsDisposed Then

    Disciplina = New frmDisciplina

    Disciplina.MdiParent = Me

    Disciplina.WindowState = FormWindowState.Maximized

    Disciplina.Show()

    Else

    ' Ele já está aberto

    Disciplina.BringToFront()

    End If

     

     

    Daí, depois que o formulário é apresentado, apenas duas piscadelas rápidas e o formulário já está disponível.

     

    Obrigado!

    quarta-feira, 9 de julho de 2008 00:48
  • Se toda hora que vc apresenta o form vc maximiza ele, pq não setar isso ja na janela de proriedades, desta for estaria garantido que o Maximized estaria setado antes do Show, e vc tiraria essa linha do seu codigo.

     

    quarta-feira, 9 de julho de 2008 15:26
  • Viva, ViewState!

     

    Eu já havia tentado isso. Estranhamente ocorre de o formulário MDI-Filho ficar desposicionado:

    Alinhado à esquerda e restaurado para qualquer valor de StartPosition e WindowState=Maximized.

     

    Eu demorei para respondê-lo por estar fazendo o teste novamente. Já havia me esquecido do porquê.

     

    Cumprimentos.

     

    quinta-feira, 10 de julho de 2008 05:03
  • Muito interessante.
    quinta-feira, 10 de julho de 2008 15:11
  • Após várias tentativas, comprovadas (publicadas) em um outro computador com XP SP2 (o desenvolvimento se dá sob o Vista / VB2008), inclusive com figuras .JPG, .PNG e .BMP, não resta outra opção senão retirar a figura de fundo (logo).

     

    E dou por encerrada esta publicação.

     

    Muito agradecido ao ViewState por todo o empenho e votos de bom fim de semana a todos!

     

    sexta-feira, 11 de julho de 2008 05:29