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
|