USUÁRIO:      SENHA:        SALVAR LOGIN ?    Adicione o VBWEB na sua lista de favoritos   Fale conosco 

 

  Fórum

  Visual Basic
Voltar
Autor Assunto:  Seleção de Dados no msflexgrid
Álvaro
Pontos: 2843
GUARULHOS
SP - BRASIL
Postada em 24/10/2007 11:24 hs            
Galera bom dia !!!
Estou com um probleminha na hora de selecionar uma linha no meu msflexgrid para poder editar os dados, ele é difícil não por causa do comando e sim por causa do sistema

Deixa eu explicar rápido como funciona o programa
Trabalho com um sistema de testes em motor de carro,barco,caminhão e nesse sistema tenho um controle de limites, onde são colocados alguns limites onde o motor pode chegar, por ex: a temperatura da água do motor não pode passar 90º, e quando chega nesse limite o sistema é configurado para parar o motor ou colocar em ponto morto, seleção essa que é feita pelo usuário no grid de limites e nele possuem vários limites controlados pelo sistema, as vezes possuem 4 limites, as vezes 7, etc, não tem existe um nº limite de canal a ser controlado pelo sistema, se o usuário quiser pode colocar todos os canais disponíveis para ser controlado pelo sistema e cada canal ele pode escolher em parar o motor ou colocar em ponto motor e escolher a temperatura ou pressão limite que o canal pode alcançar sem prejudicar o motor e o quando o canal ultrapassa o limite além dele fazer o que está programado, como comentei acima, ele deixa a linha do grid em vermelho
Resumidamente é isso.

Em uma versão antiga de busca de valor nos módulos de leitura, o grid funciona muito bem, independente do nº de canais abilitados para o controle, agora gerei uma nova versão onde a busca ficou muitas vezes mais rápido, o grid não está trazendo mais as informações corretas da linha que estou selecionando
Quando eu clico no grid na linha desejada para fazer a alteração, ele não puxa a linha correta e sim uma linha que não tem nada a haver com a selecionada, por ex: meu grid tem 7 linhas, clico na segunda linha e ele me puxa a linha 6, pois nessa linha 6 está com o limite alcançado. Más independente do limite ter sido ou não alcançado eu tenho que selecionar a linha para fazer a mudança que desejo, e como falei após a nova versão o sistema não funciona mais corretamente nesse ponto.

Não sei se consegui explicar, pois esse sistema é complicado, más abaixo coloquei o comando que uso quando clico no grid.
O status tem que ser manual, para que seja feito a alteração pelo usuário
O form5 é o formulário abilitado para fazer a alteração dos valores dos limites e também para selecionar se o motor deve parar ou entrar em ponto morto

O bo_ok é o botão ok do form5, após a alteração, cheguei a tentar colocar um contador de tempo para tentar diminuir o tempo de atualização do grid, para ver se da para selecionar a linha correta, más não foi totalmente em vão, más não posso deixar muito tempo, nesse exemplo comecei com 3 segundos e depois passei para 10 segundos, e quando coloquei esses 10 seg a cada 10 vezes que tentava selecionar ele me trazia 3 a 4 vezes a linha correta

O atualiza_valor_canais é o comando dados para pegar os dados dos módulos e atualizar o grid de limites com eles, e verificar se o limite foi ou não atingido

Sei que é meio complicado, más espero que vocês consigam me entender e me ajudar

If Lb_STATUS.Caption = "MANUAL" Then
    grid_linha_aux = MSFlexGrid1.Row
    MSFlexGrid1.Col = 0
    Form5.lb_normname = MSFlexGrid1.Text
    MSFlexGrid1.Col = 1
    Form5.cp_lalarm = MSFlexGrid1.Text
    MSFlexGrid1.Col = 2
    Form5.cp_lwarn = MSFlexGrid1.Text
    MSFlexGrid1.Col = 4
    Form5.cp_uwarn = MSFlexGrid1.Text
    MSFlexGrid1.Col = 5
    Form5.cp_ualarm = MSFlexGrid1.Text
    MSFlexGrid1.Col = 7
    If MSFlexGrid1.Text = "X" Then Form5.Ch_control = 1 Else Form5.Ch_control = 0
    MSFlexGrid1.Col = 8
    Form5.lb_sist = MSFlexGrid1.Text
    MSFlexGrid1.Col = 9
    If MSFlexGrid1.Text = "M" Then
        Form5.ch_reacao_m.value = True
    Else
        Form5.ch_reacao_p.value = True
    End If
    
    Form5.Show
    Form5.Top = 4000
    Form5.Left = 5500
    LIMITE.Enabled = False
End If

Private Sub BO_OK_Click()
    LIMITE.MSFlexGrid1.Row = grid_linha_aux
    LIMITE.MSFlexGrid1.Col = 1
    LIMITE.MSFlexGrid1.Text = cp_lalarm.Text
    LIMITE.MSFlexGrid1.Col = 2
    LIMITE.MSFlexGrid1.Text = cp_lwarn.Text
    LIMITE.MSFlexGrid1.Col = 4
    LIMITE.MSFlexGrid1.Text = cp_uwarn.Text
    LIMITE.MSFlexGrid1.Col = 5
    LIMITE.MSFlexGrid1.Text = cp_ualarm.Text
    LIMITE.MSFlexGrid1.Col = 7
    If Ch_control = 1 Then
        'MSFlexGrid1.Text = "X"
        limite_grid(grid_linha_aux) = "X"
    Else
        'MSFlexGrid1.Text = ""
        limite_grid(grid_linha_aux) = ""
    End If
    LIMITE.MSFlexGrid1.Col = 9
    If ch_reacao_m.value = True Then
        LIMITE.MSFlexGrid1.Text = "M"
    Else
        LIMITE.MSFlexGrid1.Text = "P"
    End If
    
    LIMITE.atualiz_dados
    LIMITE.Show
    LIMITE.Enabled = True
    Form5.Hide
    LIMITE.MSFlexGrid1.Refresh
    contador_tempo_ax3 = DateAdd("s", 10, Time) 'coloca um tempo de 10 segundos para atualizar o grid de limites
End Sub

Sub atualiza_valor_canais()
    emerg = "nao": reacao_aux = ""
    For Y = 1 To MSFlexGrid1.Rows - 1
        nome_alarm = MSFlexGrid1.TextMatrix(Y, 0)
        l_alarm_aux = CCur(MSFlexGrid1.TextMatrix(Y, 1))
        l_warn_aux = CCur(MSFlexGrid1.TextMatrix(Y, 2))
        u_warn_aux = CCur(MSFlexGrid1.TextMatrix(Y, 4))
        u_alarm_aux = CCur(MSFlexGrid1.TextMatrix(Y, 5))
        sist_name_aux = MSFlexGrid1.TextMatrix(Y, 8)
        reacao_aux = MSFlexGrid1.TextMatrix(Y, 9)
        
        If sist_name_aux = "TPJ1(2)" Or sist_name_aux = "TPJ1(1)" Or sist_name_aux = "TPJ1(4)" Or sist_name_aux = "AI1(3)" Then limite_grid(Y) = "X"
        
        tam = Len(sist_name_aux)
        val1 = InStr(sist_name_aux, "(")
        tx1 = Mid(sist_name_aux, 1, val1 - 1)
        val2 = InStr(sist_name_aux, ")")
        tx2 = Mid(sist_name_aux, val1 + 1, val2 - val1 - 1)
        Select Case tx1
            Case "TPJ1"
                    CAN_VALOR = tpj1(tx2)
            Case "TPJ2"
                    CAN_VALOR = tpj2(tx2)
            Case "TPK3"
                    CAN_VALOR = tpk3(tx2)
            Case "TPK4"
                    CAN_VALOR = tpk4(tx2)
            Case "AI1"
                    CAN_VALOR = ai1(tx2)
            Case "AI2"
                    CAN_VALOR = ai2(tx2)
            Case "AI3"
                    CAN_VALOR = ai3(tx2)
            Case "AI4"
                    CAN_VALOR = ai4(tx2)
            Case "FQ1"
                    CAN_VALOR = fq1(tx2)
            Case Else
                    CAN_VALOR = 0
        End Select
        
        LIMITE.MSFlexGrid1.TextMatrix(Y, 3) = Format(CAN_VALOR, "#,##0.0; -#,##0.0")
        can_limite = limite_grid(Y)
        LIMITE.MSFlexGrid1.TextMatrix(Y, 7) = can_limite

        If limite_grid(Y) = "X" And CAN_VALOR > u_warn_aux Then
            emergencia_aux = 2
            MENS_ERR = "LIMITE SONORO SUPERIOR ACIONADO: " & nome_alarm
        End If
        If limite_grid(Y) = "X" And CAN_VALOR > u_alarm_aux Then
            emergencia_aux = 1
            MENS_ERR = "LIMITE SUPERIOR ACIONADO: " & nome_alarm
        End If
        If limite_grid(Y) = "X" And CAN_VALOR < l_warn_aux Then
            emergencia_aux = 3
            MENS_ERR = "LIMITE SONORO INFERIOR ACIONADO: " & nome_alarm
        End If
        If limite_grid(Y) = "X" And CAN_VALOR < l_alarm_aux Then
            emergencia_aux = 4
            MENS_ERR = "LIMITE INFERIOR ACIONADO: " & nome_alarm
        End If
        If limite_grid(Y) = "X" And CAN_VALOR < u_warn_aux And CAN_VALOR > l_warn_aux Then emergencia_aux = 5
        If limite_grid(Y) = "" Then emergencia_aux = 5
        
   If emergencia_aux < 5 Then
    If operacao.Op_ign1.value = False Or operacao.Op_STAR1.value = True Or CCur(rotacao_atual) < paramet_rotacao_partida Then  'rot=0/ig desl/part. lig
        If (sist_name_aux = "AI4(29)" Or sist_name_aux = "FQ1(0)") And contador_tempo_ax4 <> 0 Then
        Else
            emergencia_aux = 5 'ok
        End If
    Else
        If contador_tempo_ax4 = 0 Or DateDiff("s", Time, contador_tempo_ax4) > Val(paramet_tempo_limite) Then
            contador_tempo_ax4 = DateAdd("s", Val(paramet_tempo_limite), Time)
        End If
        If contador_tempo_ax4 > Time Then
            emergencia_aux = 5 'ok
        End If
    End If
   End If
        
    LIMITE.MSFlexGrid1.Col = 3
    If Lb_STATUS.Caption = "MANUAL" Then
        controlar = "s"
    Else
        If contador_tempo_estabilizacao < Time Or sist_name_aux = "TPJ1(2)" Or sist_name_aux = "TPJ1(1)" Or sist_name_aux = "TPJ1(4)" Or sist_name_aux = "AI1(3)" Then
            If contador_tempo_estabilizacao > Time Then
                operacao.informativo 2
            Else
                If operacao.Lb_inform.Caption = "ESTABILIZAÇÃO" Then operacao.informativo 1
            End If
            controlar = "s"
        Else
            controlar = "n"
            operacao.informativo 2
        End If
    End If
    If emergencia_aux < 5 And controlar = "s" Then
        emerg = "sim"
        If emergencia_aux = 1 Or emergencia_aux = 4 Then
            operacao.LB_MENSAGEM.Caption = MENS_ERR
            operacao.LB_MENSAGEM.ForeColor = &HFF& 'verm
        End If
        If emergencia_aux = 2 Or emergencia_aux = 3 Then
            If LIMITE.MSFlexGrid1.CellForeColor <> &HFF& Then
                operacao.LB_MENSAGEM.Caption = MENS_ERR
                operacao.LB_MENSAGEM.ForeColor = &H8080& 'amarel.
            End If
        End If
        If (emergencia_aux = 2 Or emergencia_aux = 3) And (emergencia_sistema = 5) Then  ' <> 2 And emergencia_sistema <> 3) Then
            BUZINA_ALARM = True
            operacao.controle_emergencia emergencia_aux, ""
            emergencia_sistema = emergencia_aux
        End If
        If (emergencia_aux = 1 Or emergencia_aux = 4) And (emergencia_sistema <> 1 And emergencia_sistema <> 4) Then
            BUZINA_ALARM = True
            operacao.controle_emergencia emergencia_aux, reacao_aux
            emergencia_sistema = emergencia_aux
            If Data2.DatabaseName <> "" Then
                If emergencia_aux = 1 Then
                    vl_limite_ating = u_alarm_aux
                Else
                    vl_limite_ating = l_alarm_aux
                End If
                        
                Data2.Recordset.AddNew
                Data2.Recordset("canal") = nome_alarm
                Data2.Recordset("valor_limite") = vl_limite_ating
                Data2.Recordset("valor_atingido") = Format(CAN_VALOR, "#,##0.00; -#,##0.00")
                Data2.Recordset("data") = Date
                Data2.Recordset("hora") = Time
                Data2.Recordset("OPERADOR") = Operad
                Data2.Recordset.Update
                        
                If PostMortem_Gravado = False Then
                    PostMortem_Gravado = True
                    operacao.grava_postmortem
                    Controle_Postmortem = True
                End If
            End If
                LIMITE.Show
            End If
        Else
            If emergencia_sistema <> 1 And emergencia_sistema <> 4 And LIMITE.MSFlexGrid1.CellForeColor <> &H0& Then
                For w = 0 To LIMITE.MSFlexGrid1.Cols - 1
                    LIMITE.MSFlexGrid1.Col = w
                    LIMITE.MSFlexGrid1.CellForeColor = &H0& 'preto
                Next
            End If
        End If
    Next
End Sub


Desde já agradeço

Abraço a Todos
     
João Carlos jr.
RIBEIRÃO PRETO
SP - BRASIL
Postada em 24/10/2007 18:22 hs            
Alvaro pelo que eu estava vendo o seu código, eu não vi nenhuma linha de comando onde vc clica no msflexgrid e ele seleciona a linha. Possa ser que isso resolva o seu problema, tenta aí.
 
No evento click do msflexgrid coloque esse codigo
 
Dim Posit As Single
Posit = MSFlexGrid1.Row
vCodigo = MSFlexGrid1.TextMatrix(Posit, 1)
Com esse código vc vai pegar a primeira coluna da linha selecionada.
 
Flw.
 
T+
 
 
 

João Carlos Junior

Administrador de Redes - Windows 2003 Srv, Linux

    Desenvolvedor Visual Basic 6.0 com Access, SQL Server, VB .Net e Crystal Reports X

Iniciante em C# e ASP .NET

     
Álvaro
Pontos: 2843
GUARULHOS
SP - BRASIL
Postada em 25/10/2007 08:26 hs            
João talvez você não tenha reparado, más ele existe sim o comando para selecionar a linha, a linha é selecionada automaticamente quando se clica no grid e com isso através do comando MSFlexGrid1.Col eu monto o meu form5 para que eu possa estar fazendo a edição dos dados. Isso o sistema faz perfeitamente, más o problema é que independente da linha que eu clique, quase sempre ele traz a linha 6 que é onde está o valor negativo

O código que você passou, está fazendo a mesma coisa que o MSFlexGrid1.Col e como comentei a montagem do form5 está perfeita, o problema é que ele não está trazendo a linha que selecionei

Abaixo está o código que está no meu grid

Private Sub MSFlexGrid1_Click()

If Lb_STATUS.Caption = "MANUAL" Then
    grid_linha_aux = MSFlexGrid1.Row
    MSFlexGrid1.Col = 0 ' monta o form5
    Form5.lb_normname = MSFlexGrid1.Text
    MSFlexGrid1.Col = 1
    Form5.cp_lalarm = MSFlexGrid1.Text  ' monta o form5
    MSFlexGrid1.Col = 2
    Form5.cp_lwarn = MSFlexGrid1.Text
    MSFlexGrid1.Col = 4
    Form5.cp_uwarn = MSFlexGrid1.Text
    MSFlexGrid1.Col = 5
    Form5.cp_ualarm = MSFlexGrid1.Text
    MSFlexGrid1.Col = 7
    If MSFlexGrid1.Text = "X" Then Form5.Ch_control = 1 Else Form5.Ch_control = 0
    MSFlexGrid1.Col = 8
    Form5.lb_sist = MSFlexGrid1.Text
    MSFlexGrid1.Col = 9
    If MSFlexGrid1.Text = "M" Then
        Form5.ch_reacao_m.value = True
    Else
        Form5.ch_reacao_p.value = True
    End If
    
    Form5.Show ' chama o form5 já montado
    Form5.Top = 4000
    Form5.Left = 5500
    LIMITE.Enabled = False 'desabilita o grid para que somente o form5 seja usado
End If
End Sub
     
Álvaro
Pontos: 2843
GUARULHOS
SP - BRASIL
Postada em 25/10/2007 14:32 hs            
Consegui resolver da seguinte maneira, o grid de limite era atualizado constante pelo menu principal, o que eu fiz foi colocar um timer na tela de limite e colocar uma atualização com um tempo maior que o timer da tela principal que está em 40,coloquei na tela de limite o valor de 100 no interval, após isso o grid funcionou como deveria funcionar.
     
Página(s): 1/1    

CyberWEB Network Ltda.    © Copyright 2000-2025   -   Todos os direitos reservados.
Powered by HostingZone - A melhor hospedagem para seu site
Topo da página