SELECAO NO MSFLEXGRID

DANIKULL 12/08/2007 02:53:32
#230546
Pessaol, estou com o seguinte problema para resolver:
Tenho os dados da tabela carregados em um FlexGrid, até aí tudo bem. Coloco o seguinte código na propriedade Goto_Focus para selecionar uma determinada linha:

With MSFlexGrid
.Col = 0
.Col = .Cols - 1
.BackColorSel = &H8000000D
.HighLight = flexHighlightWithFocus
.SelectionMode = flexSelectionByRow
End With

O meu problema é seguinte:
quando carrego o formulario coloco na propriedade Form_Activate MSFlexGrid.SetFocus para que ao inciar o grid esteja selecionado, mais não acontece, eu só terei a seleção quando clicar no Grid. Outra coisa é que apartir das informações contidas no Grid, eu abro todas as informações do registro selecionado em outro formulario, até aqui blz, mais quando eu encerro o formulario o Grid não aparece selecionado no registro que eu cliquei, o Grid nem aparece seleconado.
Pessoal alguem pode me ajuda, urgente????
Ficarei muito grato a quem puder me dar este help.

Desde ja agradeço a colaboração de todos...
MJAC 12/08/2007 10:56:11
#230559
Amigo vamos lá:

Primeiro o evento Activate só ocorre apartir do segundo formulário aberto ao mesmo tempo (e qunado o usuário clicar no que está desativado, nesse momento o formuláio que foi clicado mudará a cor da barra de título ocorrendo o Evento, já o formulário que perdeu o foco "ficou com a barra mais clara" recebeu o evento Deactivate). Conclusão a rotina não está sendo executada.
Para resolver, no evento Load do formulário acrescente a chamada à rotina ficando assim:

Private Sub Form_Load()
Form_Activate
End Sub


uma dica a linha ".Col = 0" não é necessária já que abaixo vc troca o valor de Col indo para a última coluna. ;-)

Sobre o grid não estar selecionado, bem talvez vc clique em algum botão para abrir o formulário, neste momento o focu sai do grid então a seleção existe mas não é exibida porque não está com focu, para resolver acrecente MSFlexGrid.SetFocus após a última rotina do botão.

Qualquer dúvida estaremos aqui, abraços ...

DANIKULL 13/08/2007 13:18:51
#230696
MJC obrigado pela resposta mais não deu certo.

Deixa eu explicar novamente o que quero.
O objeto ListView tem um propriedade que se marcada com verdadeiro, toda vez que ele perder o foco vai continuar selecionado, tipo assim, quando esta com o foco ele esta selecionado em azul, e após perder o foco ele contina selecionado so que na cor cinza, o que indique qual o registro que foi selecionado para chamar a outra rotina.
Pessoal, só não estou usando o ListView porque não deixa a rotina com visual prossional, deixa a rotina com um visual diferente e também tem algumas funções, digo melhor, resultados, que não consigo aplicar no listview.
Se alguem puder me ajudar ficarei muito grato.
USUARIO.EXCLUIDOS 13/08/2007 13:24:58
#230702
calma... deixa eu ver se entendi...

vc quer selecionar um registro do MSFlexGrid, e mesmo quando este perder o foco o mesmo continue selecionado ??

Somente isto??


Se sim, é só pintar a cor do fundo da linha, me dá um toque que eu monto um exemplo pra vc.
DANIKULL 13/08/2007 13:33:22
#230705
Sim, é isto que preciso, só que quando eu voltar para a torina que está o grid ele deve estar com o foco e a linha que eu selecionei para chamar a outra rotina deva estar selecionada novamente, igualmente no listview.

Desde ja agradeço.
USUARIO.EXCLUIDOS 13/08/2007 14:01:18
#230713
Amigo, fiz o seguinte:

Private Sub Form_Activate()
MSFlexGrid1.SetFocus
End Sub



Simples e funcional... ve se lhe atende...
Aí da pra dar a impressao de selecionado quando o flex perder a o foco, vc pode pintar a cor de fundo da linha, e quando receber o foco vc despinta. Tipo assim:
Private Sub MSFlexGrid1_GotFocus()
For i = 0 To MSFlexGrid1.Cols - 1
MSFlexGrid1.Col = i
MSFlexGrid1.CellBackColor = vbWhite
Next
End Sub

Private Sub MSFlexGrid1_LostFocus()
For i = 0 To MSFlexGrid1.Cols - 1
MSFlexGrid1.Col = i
MSFlexGrid1.CellBackColor = vbBlue
Next

End Sub
DANIKULL 14/08/2007 00:29:40
#230796
Marcelo, obrigado pela tentativa, mais ainda não é o que eu estou precisando, é quase isso.
DANIKULL 16/08/2007 01:24:30
#231119
Pessoal obrigado a todos que com empenho estão tentando me ajudar a chegar a um resultado satisfatório mas após muito persistir ja estou quase terminando o desenvolvimento e assiim que estiver pronto postarei aqui para que todas possam ver. Peço aos Moderadores que ainda não encerrem este tópico pois colocarei em breve, em breve mesmo, o fonte para que todos vejam e também colocarei ele disponível para Download.
Desde ja agradeço a todos.
DANIKULL 17/08/2007 00:58:11
#231281
Pessoal, bom dia....
Consegui, bom pelo menos eu acho que consegui, terminar o que estou procurando e chegar ao resultado que vos mostrarei a seguir. Gostaria que fizessem e me postassem se houver algum bug, ou alguma falha. Então segue:

'x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x
Option Explicit

Dim UltimaLinha As Integer
Dim AtualLinha As Integer
Dim CimaPressed As Boolean
Dim BaixoPressed As Boolean
Dim Clicked As Boolean
Dim I As Integer

Private Sub Form_Load()
Call CabecalhoGrid
Call Preenchegrid
UltimaLinha = 1
AtualLinha = 1
End Sub


Private Sub CabecalhoGrid()
' configuar o grid
With Grid
.GridLines = flexGridFlat
.FixedRows = 1
.FixedCols = 0
.ScrollBars = flexScrollBarBoth
.AllowUserResizing = flexResizeColumns
.Cols = 4 ' Número de colunas(incluindo o cabecalho)
.Rows = 1 ' Número de linhas(com cabecalho)
.ColWidth(0) = 285 ' Largura da coluna 0

.TextArray(1) = "Nr. Linha"
.ColWidth(1) = 1200
.ColAlignment(1) = 2
'
.TextArray(2) = "Secunda Coluna"
.ColWidth(2) = 5275
.ColAlignment(2) = 2
'
.TextArray(3) = "Terceira Coluna"
.ColWidth(3) = 5275
.ColAlignment(3) = 2
'
End With
End Sub


Private Sub Preenchegrid()
Dim Row As Integer
For Row = 1 To 15
Grid.Rows = 16
Grid.Col = 0
Grid.Row = Row
Set Grid.CellPicture = LoadPicture("C:\Documents and Settings\Daniel de Moura\Meus documentos\Meus Programas\Visual Básic 6.0\Programas Comerciais\SGA - System\Pictures\Bol-Ativo.bmp")
Grid.TextMatrix(Row, 1) = Format(Row, "00")
Next
Grid.Row = 1
Grid.Col = 0
End Sub


Private Sub Grid_Click()
AtualLinha = Grid.Row
Clicked = True
txt_Verifica.SetFocus
End Sub


Private Sub Grid_GotFocus()
For I = 0 To Grid.Cols - 1
Grid.Col = I
Grid.Row = Grid.Row
Grid.CellBackColor = &H8000000D ' Linha Azul
Grid.CellForeColor = &H80000005 ' Letras em Branco
Next
Grid.Col = 0
UltimaLinha = Grid.Row

'reset the key states
Call GetAsyncKeyState(0)
Call GetAsyncKeyState(Press_UP)
Call GetAsyncKeyState(Press_DOWN)
' Call GetAsyncKeyState(Press_RIGHT)
' Call GetAsyncKeyState(Press_LEFT)
tmr_1.Enabled = True
End Sub


Private Sub Grid_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
FRM_Form.Show 1
End If
End Sub


Private Sub Grid_LostFocus()
tmr_1.Enabled = False
If CimaPressed = False And BaixoPressed = False And Clicked = False Then
For I = 0 To Grid.Cols - 1
Grid.Col = I
Grid.Row = Grid.Row
Grid.CellBackColor = &H8000000F 'Linha na cor ButtonFace
Grid.CellForeColor = &H0& 'Letras Preto
Next I
End If
End Sub


Private Sub tmr_1_Timer()
If GetAsyncKeyState(Press_UP) Then
'UltimaLinha = Grid.Row + 1
CimaPressed = True
txt_Verifica.SetFocus

ElseIf GetAsyncKeyState(Press_DOWN) Then
'UltimaLinha = Grid.Row - 1
BaixoPressed = True
txt_Verifica.SetFocus

ElseIf GetAsyncKeyState(Press_RIGHT) Or GetAsyncKeyState(Press_LEFT) Then
'as Setas para direita e para esquerda não serão usadas
End If
End Sub


Private Sub txt_Verifica_GotFocus()
If CimaPressed = True Then
If UltimaLinha - 1 <> 0 Then
Grid.Col = 0
Grid.Row = UltimaLinha
If Grid.CellBackColor = &H8000000D Then
For I = 0 To Grid.Cols - 1
Grid.Col = I
Grid.Row = UltimaLinha
Grid.CellBackColor = vbWhite ' Branco
Grid.CellForeColor = vbBlack ' Preto
Next
End If
Grid.Col = 0
Grid.Row = UltimaLinha - 1
If Grid.CellBackColor = vbWhite Or Grid.CellBackColor = 0 Then
For I = 0 To Grid.Cols - 1
Grid.Col = I
Grid.Row = Grid.Row
Grid.CellBackColor = &H8000000D ' Branco
Grid.CellForeColor = vbWhite ' Preto
Next
End If
End If
CimaPressed = False

Grid.Col = 0
Grid.Row = Grid.Row
Grid.SetFocus

ElseIf BaixoPressed = True Then
If UltimaLinha + 1 <> Grid.Rows Then
Grid.Col = 0
Grid.Row = UltimaLinha
If Grid.CellBackColor = &H8000000D Then
For I = 0 To Grid.Cols - 1
Grid.Col = I
Grid.Row = UltimaLinha
Grid.CellBackColor = vbWhite ' Branco
Grid.CellForeColor = vbBlack ' Preto
Next
End If
Grid.Col = 0
Grid.Row = UltimaLinha + 1
If Grid.CellBackColor = vbWhite Or Grid.CellBackColor = 0 Then
For I = 0 To Grid.Cols - 1
Grid.Col = I
Grid.Row = Grid.Row
Grid.CellBackColor = &H8000000D ' Azul
Grid.CellForeColor = &H80000005 ' Branco
Next
End If
End If
BaixoPressed = False

Grid.Col = 0
Grid.Row = Grid.Row
Grid.SetFocus
ElseIf Clicked = True Then
'MsgBox "OK" & vbNewLine & _
"UltimaLinha: " & UltimaLinha & _
"LinhaAtual: " & Grid.Row

For I = 0 To Grid.Cols - 1
Grid.Col = I
Grid.Row = UltimaLinha
Grid.CellBackColor = vbWhite ' Branco
Grid.CellForeColor = vbBlack ' Preto
Next

Grid.Col = 0
Grid.SetFocus
Grid.Row = AtualLinha
Clicked = False
End If
End Sub



'x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x
Agora vou explicar o que eu aprontei...

Primeiro eu criei o cabeçalho do grid e depois o preenchi, só com o número das linhas para ficar mais fácil de vizualizar.
Depois com um código que eu mesmo peguei aqui no site para reconhecer as setas no MSFlexGrid, só que algumas modificações e adptações, que explicarei no final, para me dizer quando foi pressionada as setas para mudar a linha. Jogo o foco após serem pressiondas, uma das duas, ou para cima ou para baixo para uma TextBox que fara toda a verificação. Quando a TextBox recebe o foco ela verificar qual seta foi pressionada e verificar qual foi a ultima linha para pintala de Branco e as Letras em Preto, feito isto ele pega a Linha atual, a que recebeu a mudança e a pinta de Azul e as Letras em Branco. Se pressionada a telca Enter, Keyascii = vbKeyReturn, chamarara um segundo Form aí da-se pra ver que a linha do Grid na qual estava focada ao pressionar o Enter passa a ficar em uma cor mais clara que indica que o grid perdeu o focu. No segungo Form você coloca o seguinte:

Private Sub Form_Click()
Unload Me
End Sub


Private Sub Form_Unload(Cancel As Integer)
MsgBox FRM_GridList.Grid.Row
End Sub


Agora rode o aplicativo e veja como funciona. assim que for libeerado pela equipe do VBMania o arquivo que estou enviando você poderam baixa-lo e verificar o que eu fiz. Para adiantar o nome do arquivo é Listando MSFlexGrid com e sem Foco.

Pessoal até mais....
Tópico encerrado , respostas não são mais permitidas