LENTIDÃO CARREGAR FORMUL?VIO

ALANJOVITA 06/10/2016 09:33:39
#467906
Bom dia Galera, tudo bem ?

Preciso de uma ajuda!

Estou com um problema onde ao carregar o formulário os objetos aparecem sendo [Ô]desenhados[Ô] na tela até a finalização. Gostaria de exibir o formulário somente quando o mesmo já estiver 100%. Alguém tem alguma dica ?

Tenho um Sub chamado [Ô]resolucaoTela()[Ô] que ajusta o formulário de acordo com a resolução do monitor.

Dependendo da maquina do cliente esse Load fica muito lento dando a impressão que o sistema está travando mesmo sem dados cadastrados e a todos clientes eu tenho que dar as mesmas explicações, a partir do momento que o formulário já está aberto a reapresentação dele é bem rápida, somente o primeiro carregamento que demora!

Códigos

Load do formulário. -------------------------------------------------------------------
  
Private Sub Form_Vendas_Load(sender As Object, e As EventArgs) Handles MyBase.Load

MsgAguarde.Show()

Application.DoEvents()
resolucaoTela()

Dim ClienteBLL As New ClienteBLL
[ô]ADICIONA AUTOCOMPLETAR PARA O TXT ENDERECO
With Me.txt_endereco
.AutoCompleteCustomSource = ClienteBLL.Listar_Endereco
.AutoCompleteMode = AutoCompleteMode.SuggestAppend
.AutoCompleteSource = AutoCompleteSource.CustomSource
End With
[ô]ADICIONA AUTOCOMPLETAR PARA O TXT BAIRRO
With Me.txt_bairro
.AutoCompleteCustomSource = ClienteBLL.Listar_Bairro
.AutoCompleteMode = AutoCompleteMode.SuggestAppend
.AutoCompleteSource = AutoCompleteSource.CustomSource
End With

Dim telefone As New ClienteBLL

Me.combo_telefone_cliente.DataSource = telefone.Listar_telefone
Me.combo_telefone_cliente.Text = String.Empty

Me.txt_valor.Text = FormatCurrency(0)
Me.txt_ValorTotal.Text = FormatCurrency(0)
Me.txt_valor_maior.Text = FormatCurrency(0)

Me.radio_delivery.Checked = True

[ô]status
status(0) = False
status(1) = False
Status_Pedido()

MsgAguarde.Close()

End Sub

--------------------------------------------------------------------------------------------------------------------
  
Sub resolucaoTela()

Dim PCBLL As New ComputadorBLL
Dim PC As Computador = PCBLL.Localiza(Environment.MachineName)

Me.SuspendLayout()

Dim resolucao_largura As Int32 [ô] largura
Dim resolucao_altura As Int32 [ô] altura

If PC.Resolucao = [Ô]MINIMO[Ô] Then
resolucao_altura = 768
resolucao_largura = 1024
ElseIf PC.Resolucao = [Ô]MAXIMO[Ô] Then
resolucao_altura = 768
resolucao_largura = 1366
Else
resolucao_largura = My.Computer.Screen.Bounds.Width
resolucao_altura = My.Computer.Screen.Bounds.Height
End If


Dim formulario_largura As Int32 = Me.Painel_Geral.Width
Dim formulario_altura As Int32 = Me.Painel_Geral.Height
Dim z As Integer [ô] variavel irá armazenar o valor da altura correta para o layout.


Dim localx As Integer = 0
Dim localy As Integer = 0

If resolucao_altura < 768 Then
MsgBox([Ô] 768 é A ALTURA MINIMA PARA A RESOLUÇÃO DE TELA[Ô], vbCritical)
Exit Sub
End If

If resolucao_largura < 1024 Then
MsgBox([Ô] 1024 é A LARGURA MINIMA PARA A RESOLUÇÃO DE TELA[Ô], vbCritical)
Exit Sub
End If

If formulario_largura < 1360 Then

If formulario_altura < 800 Then z = 700 Else z = 768

painel_tabelaprincipal.Size = New System.Drawing.Size(1024, z)

localx = IIf((formulario_largura - 1024) <= 0, 0, (formulario_largura - 1024) / 2)
localy = IIf((formulario_altura - z) <= 0, 0, (formulario_altura - z) / 2)


Me.txt_valor_taxa.Font = New Font(Me.txt_valor_taxa.Font.Name, 14)
Me.combo_tamanho.Font = New Font(Me.txt_valor_taxa.Font.Name, 12)
Me.txt_ValorTotal.Font = New Font(Me.txt_ValorTotal.Font.Name, 24)

[ô]--------------------------------------
[ô]REDEFINIR COLUNAS DA LISTA DE PRODUTOS
Me.ColumnHeader2.Width = 140
Me.ColumnHeader3.Width = 70
Me.ColumnHeader4.Width = 35
Me.ColumnHeader5.Width = 85
Me.ColumnHeader6.Width = 60
Me.ColumnHeader8.Width = 70
[ô]--------------------------------------

painel_tabelaprincipal.Location = New System.Drawing.Point(localx, localy)

Else

[ô]--------------------------------------
[ô]REDEFINIR COLUNAS DA LISTA DE PRODUTOS
Me.ColumnHeader2.Width = 250
Me.ColumnHeader3.Width = 80
Me.ColumnHeader4.Width = 40
Me.ColumnHeader5.Width = 120
Me.ColumnHeader6.Width = 80
Me.ColumnHeader8.Width = 80
[ô]--------------------------------------

If formulario_altura < 800 Then z = 700 Else z = 768

painel_tabelaprincipal.Size = New System.Drawing.Size(1366, z)

localx = IIf((formulario_largura - 1366) <= 0, 0, (formulario_largura - 1366) / 2)
localy = IIf((formulario_altura - 768) <= 0, 0, (formulario_altura - 768) / 2)

Me.txt_valor.Font = New Font(Me.txt_valor.Font.Name, 30)

If z = 700 Then
Me.txt_valor_taxa.Font = New Font(Me.txt_valor_taxa.Font.Name, 14)
Me.combo_tamanho.Font = New Font(Me.txt_valor_taxa.Font.Name, 12)
Me.txt_ValorTotal.Font = New Font(Me.txt_ValorTotal.Font.Name, 28)
Else
Me.txt_valor_taxa.Font = New Font(Me.txt_valor_taxa.Font.Name, 17)
Me.combo_tamanho.Font = New Font(Me.txt_valor_taxa.Font.Name, 16)
Me.txt_ValorTotal.Font = New Font(Me.txt_ValorTotal.Font.Name, 36)
End If

painel_tabelaprincipal.Location = New System.Drawing.Point(localx, localy)

End If

Me.ResumeLayout()

End Sub
ALANJOVITA 06/10/2016 09:38:52
#467907
Complementando*

Na montagem do formulário, utilizei muitos painéis alem da grande quantidade de controles, não há nenhum controle personalizado, todos são nativos.
o código apresentado está funcionando, mas se alguem tiver alguma sugestão de melhoria eu agradeço

Grato a todos desde já!
XLEGENDARY 06/10/2016 09:53:06
#467908
Resposta escolhida
tem umas coisas que me parecem demais

1- Configurar form de acordo com a resolução quando se tem a propriedade [Ô]Anchor[Ô]
2- Ajustar o form de acordo com a resolução quando você pode fazer justamente ao contrário.

em tempo você tem N opções no que fazer:

1- Criar um Thread
2- Criar um [Ô]WaitForm[Ô] onde todo o seu processo será feito nele antes de abrir o form principal
3- Colocar um simbolo de Loading com Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
4- usar groupbox ao invés de panels.
5- usar A class Timer.
etc

ALANJOVITA 06/10/2016 10:40:43
#467909
Citação:

:
tem umas coisas que me parecem demais

1- Configurar form de acordo com a resolução quando se tem a propriedade [Ô]Anchor[Ô]
2- Ajustar o form de acordo com a resolução quando você pode fazer justamente ao contrário.

em tempo você tem N opções no que fazer:

1- Criar um Thread
2- Criar um [Ô]WaitForm[Ô] onde todo o seu processo será feito nele antes de abrir o form principal
3- Colocar um simbolo de Loading com Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
4- usar groupbox ao invés de panels.
5- usar A class Timer.
etc



XLEGENDARY

Entendi suas observações, a ideia de criar esse SUB para a resolução de tela foi para alterar o tamanho da letra de acordo com a resolução, mas precisa ser revisado pois o código é antigo.

O anchor está sendo usado em praticamente todos controles, mas no exemplo o listview eu preciso redimencionar tambem as colunas.

Como seria a estrutura básica de um [Ô]WaitForm[Ô] ? pensei em chamar o formulário com o visible = false e só exibir após 5 seg. com o Time, seria uma boa ?

Grato pela atenção.
XLEGENDARY 06/10/2016 15:09:25
#467917
Basicamente vc deverá chamar seu metodo em uma thread e mandar abrir o form

coloca no google assim

WaitForm c# ou vb.net ( nao mudara muita coisa )

os primeiros links do stackoverflow e alguns outros já serão o suficiente pra você conseguir criar.

o que vc disse ai não seria tão bom pois um visible = false iria trazer o formulario que está no back end da solução o que daria a impressão de estar travado ( consequentemente o usuario iria ficar clicando e pode acabar travando o processo na arvore de processos)
o que vc deve fazer é thread mesmo onde você pode carregar determinada coisa na memoria e depois [Ô]pegar[Ô] de la

outra coisa que vc pode pesquisar e que tem no macoratti é sobre programação Assincrona e Sincrona, o que basicamente te levará aos threads
ou seja:

você não quer que um processo fique continuo ( sincrono ) e só carregue determinado processo depois que o processador / memoria leia .
você quer um processo Assincrono onde você pode abrir determinada tarefa sem esperar que algo aconteça pra isso e continuar mexendo em outras funções do sistema enquanto carrega aquela thread.

mas se não quiser tanto trabalho, coloque um load e de uma msg de aguarde e pronto, ja sera ao menos uma UI que o usuario saberá que irá carregar

Abraço
ALANJOVITA 09/10/2016 08:22:12
#467958
Citação:

:
Basicamente vc deverá chamar seu metodo em uma thread e mandar abrir o form

coloca no google assim

WaitForm c# ou vb.net ( nao mudara muita coisa )

os primeiros links do stackoverflow e alguns outros já serão o suficiente pra você conseguir criar.

o que vc disse ai não seria tão bom pois um visible = false iria trazer o formulario que está no back end da solução o que daria a impressão de estar travado ( consequentemente o usuario iria ficar clicando e pode acabar travando o processo na arvore de processos)
o que vc deve fazer é thread mesmo onde você pode carregar determinada coisa na memoria e depois [Ô]pegar[Ô] de la

outra coisa que vc pode pesquisar e que tem no macoratti é sobre programação Assincrona e Sincrona, o que basicamente te levará aos threads
ou seja:

você não quer que um processo fique continuo ( sincrono ) e só carregue determinado processo depois que o processador / memoria leia .
você quer um processo Assincrono onde você pode abrir determinada tarefa sem esperar que algo aconteça pra isso e continuar mexendo em outras funções do sistema enquanto carrega aquela thread.

mas se não quiser tanto trabalho, coloque um load e de uma msg de aguarde e pronto, ja sera ao menos uma UI que o muusuario saberá que irá carregar

Abraço




Perfeito XLEGENDARY !

Exatamente o que eu precisava

Forte abraço;
Tópico encerrado , respostas não são mais permitidas