none
Form lento ao carregar controles RRS feed

  • Pergunta

  • Olá Pessoal, bom dia.

     

    Ao carregar meu form o mesmo está bastante lento, sem nenhuma programação. Só mesmo para carregar os controles.

     

    São muitos controles, coisa de 130 a 160 controles, em média, divididos no TabControl.

     

    A minha pergunta é:

     

    1 - Existe alguma forma de deixar mais rápido?

    2 - Caso não, existe então alguma forma de só mostrar o form depois de todo carregado. Vejo que ele mostra os controles desenhando, fica muito esquisito e o usuário com certeza vai reclamar (com toda razão).

     

    Ajuda do tipo: Tem que diminuir o número de controles. (Infelizmente, isso não posso).

     

    Já testei no VB.NET 2005 e 2008. Nos dois ficam lentos.

     

    Obrigado.

    terça-feira, 17 de junho de 2008 14:47

Respostas

  • Olá Galera.

    Consegui desconbrir o motivo da lentidão ao carregar a tela.

     

    No form Main (MDI Pai) estava setado no código do Shown a propriedade

    Me.Opacity=50

     

    Isso era uma sujeira, tinha colocado para fazer um teste a muito tempo atrás. Quando retirei essa instrução, o carregamento das telas voltou ao normal.

     

    Essa propriedade recebe número double entre 0 e 1, como estava setado 50, suponho eu que estava sobrecarregando e deixando lento o carregamento dos controles.

     

    Enfim, tudo resolvido. Obrigado a todos que ajudaram.

    quinta-feira, 19 de junho de 2008 16:02

Todas as Respostas

  •  

    Olá, tudo bem por ai?

    Bom trabalho com desenvolvimento de sistema para escolas e faculdade e nosso cadastro de alunos tem na média essa quantidade de campos também.

    O que seria lento para você, quanto ele demora para abrir? É win ou web?

     

    Abraços.

    terça-feira, 17 de junho de 2008 17:02
  • Oi.

     

    O Projeto é WinForms.

     

     

    Na verdade a questão não é o lento e sim a construção dos controles na tela. Quando abre ele mostra que está desenhando.

     

    Se tivesse uma forma de fazer:

    Form fica invisível

    Form carrega os controles

    Form aparece

    Fim

     

    Ou seja, uma forma em que o usuário não visse os controles sendo desenhados. Já carregasse de vez. Só isso.

     

     

    terça-feira, 17 de junho de 2008 17:14
  • Só por curiosidade.

    Qual a config. da máquina que ta mostrando desenhando a tela?

    Por que você pode tentar deixar tudo visible = false, e no Shown da tela mandar visible = true.

    Se na primeira vez que carrega faz isso e na segunda já vai melhor, tente usar o NGen segue link http://msdn.microsoft.com/en-us/library/6t9t5wcf(VS.80).aspx

     

    Abraços.

    terça-feira, 17 de junho de 2008 17:50
  • Máquina não é pois a minha tem uma configuração muito boa:

    2GB de Ram DDR2, Dual Core 3Ghz.

     

    Já havia utilizado o NGen.

     

     

    Já tentei tb jogar visible=false no Load e depois mandar um visible =true no Shown mas o form aberto é MdiChid, logo se fizer isso dá pau. Obs.: se não fosse filho funcionaria perfeito isso. Mas velho, aí saio da usabilidade da tela. Não dá.

     

    Sua tela que tem essa média de controle não mostra desenhando?? Que esquisito, só a minha? Aqui na empresa todas as máquinas mostram desenhando.

     

    Abraços.

     

     

    terça-feira, 17 de junho de 2008 18:24
  • hehe seu pc é o dobro do meu.

    Rodei o aplicativo aqui para conferir e não mostrou desenhando a tela, e to rodando ie7 com 4 abas, wmp11, 2 vs.net 2008, outlook 2007, e é um atlhon de 2.2 com 1gb de memória.

    Muito estranho isso mesmo, qual versão do vs.net está usando, seu form tem imagens de fundo essas coisas? Programou algo nos eventos Load, Draw, Shown?

     

    Abraços.

    terça-feira, 17 de junho de 2008 19:07
  • Tem nada. Só desenhei. Na verdade, no load estou mandando maximizar, mas já terei e continua a mesma coisa.

     

    Estou usando o vs2008.

     

    Estranho demais cara, por isso que estou doido aqui...

     

    Mas valeu pela ajuda. Pensei que pdoeria ser algo no Options do visual studio, mas pelo jeito acredito que não seja, pois levei o dia todo estudando uma forma de melhorar isso.

     

     

     

     

     

    terça-feira, 17 de junho de 2008 19:35
  • Cara o que podemos fazer é o seguinte.

    Crie um projeto novo, adiciona esse form nele, e manda para o meu e-mail mfalthmann@hotmail.com e eu abro ele aqui para ver.

     

    Abraços.

    terça-feira, 17 de junho de 2008 19:44
  • O negócio que no projeto herdo de outro form as funcionalidades padrões, que por sua ver pega do arquivo de recurso as imagens. Além de alguns controles serem modificados. Para eu montar tudo em outro projeto vai dá um trabalhão.

     

    Tem alguma outra sugestão?

    terça-feira, 17 de junho de 2008 20:21
  •  

    Mandar o projeto todo hehe mas acho que não vão permitir isso Wink

    Cara recomendo pesquisar primeiro nos controles modificados, ver se está usando corretamente os recursos das imagens, veja no form pai se tem algum problema.

     

    Pode ser um desses itens o problema.

     

    Abraços.

    terça-feira, 17 de junho de 2008 20:29
  • É vou verificar isso. Mas a princípio tá tudo ok. Valeu aí.

    Abraços.

     

     

    quarta-feira, 18 de junho de 2008 11:38
  • Bem desculpa me intrometer mas, além dos possíveis erros com as imagens o que você também pode

    fazer é criar uma Thread com um Delegate para carregar o Form sem prejudicar o restante do aplicativo isso funciona muito bem.

    Dica: experimenta antes de chamar o Form usar o seguinte  Form.SuspendLayout, após a Thread terminar de carregar o Form você usa Form.ResumeLayout isso impede que o usuário veja toda a transformação que está havendo enquanto o form é criado, então quando você setar o ResumeLayout o Form estará pronto. sem problemas visuais.

     

    quarta-feira, 18 de junho de 2008 20:15
  • Olá Amigo.

     

    Nem é o caso ainda de utilizar Thread pois até então não fiz nenhum programação no form. Apenas o desenhei.

     

    Testei o Form.SuspendLayout e o Form.ResumeLayout, porém ele continua desenhando na tela, a diferença que ele só redimenciosa os controles após executar o Form.ResumeLayout. Muito interessante, vai me servir em outra situação, mas neste que é o que está me tirando do sério não resolve.

     

    Não utilizo imagens em controles, nada. Tudo limpinho. Apenas alguns controles eu dei uma evoluída, mas só de tratamento, nada que iria influenciar no carregamento, pois isso que estou achando estranho demais.

     

    De repente é assim mesmo. Estou quase chegando a essa conclusão. Como antes eu programei em Delphi,VB e VS.Net 2003 posso está mal acostumado. Pois nestas ferramentas anteriores nunca desenhou ao carregar as telas.

    Estou utlizando o vs 2008.

     

    De qualquer forma agradeço pela ajuda.

     

    Abraços.

     

    quarta-feira, 18 de junho de 2008 20:38
  • Cara já passei por uma situação assim e acredite o que me salvou foi carregar o Form com a Propriedade Visible = False eu carregava o Form sem precisar e só quando era hora pedia pra ser exibido...

     

    Uma Outra alteranativa é tentar deixar a opacidade do Formulário carregar gradativamente

     

     

    quarta-feira, 18 de junho de 2008 20:45
  • É já tentei. Esse form é filho. Seto o pai dele, dou um show, depois seto para visible=false, mas aí ele abre fica desenhando a tela de esconde. Não serve pra mim desse jeito.

     

    Se quiser te mando um e-mail para vc ver o print que dei na tela ao carregar e depois de carregado.

     

    Abraços.

    quarta-feira, 18 de junho de 2008 20:53
  • anns_rock@hotmail.com

     

    adoro essas coisas pode mandar...vou fazer questão em ajudar...

     

    quarta-feira, 18 de junho de 2008 20:56
  • Vamos fazer só mais um teste tudo bem?

     

    Sete as Propriedades do Form

     

    BakColor = Black

    TransparencyKey = Black

     

    tenho quase certeza que ele não irá desenhar...

     

    ou melhor veja esse Tópico

     

    Siga os procedimentos do Tópico para ver os resultados na real.

     

        http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=3504398&SiteID=21

     

    quarta-feira, 18 de junho de 2008 21:00
  •  Maxwel Barbosa wrote:

    É já tentei. Esse form é filho. Seto o pai dele, dou um show, depois seto para visible=false, mas aí ele abre fica desenhando a tela de esconde. Não serve pra mim desse jeito.

     

    Se quiser te mando um e-mail para vc ver o print que dei na tela ao carregar e depois de carregado.

     

    Abraços.

     

     

     

     

    Veja esse Tópico fazer as coisas ficarem invisíveis "ou Quase tudo" é comigo mesmo...kkkkkkkk

     

       http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=3504398&SiteID=21

     

     

    quarta-feira, 18 de junho de 2008 21:01
  • Mesma coisa. rsrs.

     

    Deve ser algum bug do Vs2008, só pode. Não tem mais outra explicação.

     

     

    quarta-feira, 18 de junho de 2008 21:15
  •  

    Que Pena..

     

    Bom também existe outro site muito interessante talvez haja algo que lhe interesse

     

    http://www.dreamincode.net/

     

    quarta-feira, 18 de junho de 2008 21:19
  • Olá novamente Maxwel Smile.

    Por favor poste o Designer.cs do seu form aqui.

     

    Abraços.

    quinta-feira, 19 de junho de 2008 11:24
  • Ok. Te enviei por e-mail pois por aqui não suportou.

    quinta-feira, 19 de junho de 2008 11:42
  • Olá Galera.

    Consegui desconbrir o motivo da lentidão ao carregar a tela.

     

    No form Main (MDI Pai) estava setado no código do Shown a propriedade

    Me.Opacity=50

     

    Isso era uma sujeira, tinha colocado para fazer um teste a muito tempo atrás. Quando retirei essa instrução, o carregamento das telas voltou ao normal.

     

    Essa propriedade recebe número double entre 0 e 1, como estava setado 50, suponho eu que estava sobrecarregando e deixando lento o carregamento dos controles.

     

    Enfim, tudo resolvido. Obrigado a todos que ajudaram.

    quinta-feira, 19 de junho de 2008 16:02
  • Que Bom que você pode resolver o problema e para garantir Maxwell que o form irá ficar bem leve ao carregar use a intrução .SuspendLayout para iniciar a contrução do Form com as informações que vierem a ser inseridas no código posteriormente a intrução .SuspendLayout é ótima para fazer leituras em Database que precisam retornar um número grande de registros e como você está trabalhando com um Formulário FIlho caso o Pai esteja ocupado realizando outra tarefa o .SuspendLayout é bem inteligente e não espera outros processos dentro Aplicativo para ser concluído você pode usar da seguinte forma

     

    Me.SuspendLayout()

    Application.DoEvents()

     'seu código

    Me.ResumeLayout()

     

    Abraço t+

    quinta-feira, 19 de junho de 2008 22:11