Clipper On Line • Ver Tópico - tsbrowse fica bagunçado ao clicar em uma celula

tsbrowse fica bagunçado ao clicar em uma celula

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

tsbrowse fica bagunçado ao clicar em uma celula

Mensagempor Amparo » 02 Mar 2012 08:37

ola amigos,

estou em fase de migração do clipper 5.3 para Harbour MiniGUI Extended Edition 2.0.7 - 2012.02.14
estou enviando alguns arquivos printscreeen do cadastro de clientes, nesta tela tenho funcionando os botoes F5 Filtro, F6 Layout, F7 Ordem, F8 Excel e F10 Propiedades ( esta ultima eu mudo o tamanho das celulas, coloco cor, acrescento uma celula, oculto e outras opçoes que tenho), estando em uma celula qualquer e der um duplo click no mouse ira marcar a linha e se estiver marcada ira desmarcar (aqui tenho problema)

os arquivos que estou passando sao:
BROWSE COM TODOS OS REGISTROS.BMP ( contem todos os registros (51356), nesta situação eu faço filtro, somo um coluna numerica e marco e desmarco um registro

Imagem

BROWSE COM 20 REGISTROS.BMP ( a coluna que esta em azul é a coluna indexada, fiz uma pesquisa para achar todos os clientes começados po 1, resultou em 20 registros, ate aqui tambem esta normal )

Imagem

BROWSE COM 3 REGISTROS.BMP ( fiz nova pesquisa agora com os clientes começados com 11, daqui pra frente vai bagunçar o TSBROWSE )

Imagem

BROWSE COM 3 REGISTROS BAGUNÇADO.BMP ( estando o BROWSE com os 3 registro, se eu der um click semples ou um click duplo para marcar o registro vai bagunçar o TSBROWSE conforme o arquivos anexo, isso desde que nao preencha todos as linhas visiveis na tela, no caso sao visiveis 14 linhas, fiz um teste fazendo aparecer 14 clientes em tela e tudo normal, fui entao deletando registro a registro via DBUCDX e refazendo os indices e quando ficou com 7 registros começou a bagunçar, voltei um registro ficando 8 ai voltou ao normal )

Imagem

abaixo estou passando parte do fonte que monto o TSBROWSE e a function que faço a pesquisa, se nao me enganho isso acontecia em clipper tambem mas acho que era com o debedit quando vc rolava a seta para baixo ou para cima duplicava a linha, mas no caso aqui é um pouco diferente

montando o TSBROWSE
*-------------------------------------------------------------------------------------------------------------------
STATIC FUNCTION TBROWSESGC020101()
LOCAL CABECALHO020101 := ''
LOCAL X := 0
LOCAL W := 0
LOCAL NOMEORDEM020101 := ''
LOCAL NUM := 0
LOCAL NUMCOR := 0

IF _ISCONTROLDEFINED("BROW020101","SGC020101FORM")
   RELEASE CONTROL BROW020101 OF SGC020101FORM
ENDIF

CABECALHO020101 := ''

f := Len( SGC020101FIELDS )

FOR x := 1 TO f STEP 1
  CABECALHO020101 := CABECALHO020101 + "{|| PROPRIEDADE020101( " + ALLTRIM( STR( X ) ) +" ) }"

  IF X < F
     CABECALHO020101 := CABECALHO020101 + " , "
  ENDIF
NEXT

SET( _SET_DELETED, .T. )   //  EXIBE NO BRAOWSE OS REGISTROS DELETADOS .T. = NAO .F. = EXIBE

DEFINE TBROWSE BROW020101 AT 100,005 OF SGC020101FORM ALIAS 'CLIENTES' WIDTH LARGURA020101 - 15 ;
HEIGHT ALTURA020101 - 160 FONT "Arial" SIZE 10 CELL ;
ON CHANGE QTDE_REGISTRO_BROW( 'SGC020101FORM', 'TOTREG' ) ON HEADCLICK { &CABECALHO020101. }

f := Len( SGC020101FIELDS )

IF ALLTRIM( SGC020101NOME_NOVO_LAYOUT ) == 'Layout natural (Ctrl+F6)' .AND. lAdmin
    SET( _SET_DELETED, .F. )
ENDIF

FOR W := 1 TO f STEP 1
   IF ALLTRIM(SGC020101NOME_NOVO_LAYOUT) == 'Layout natural (Ctrl+F6)'
      ADD COLUMN TO BROW020101 HEADER SGC020101TITULO[W] SIZE SGC020101TAMANHO[W] FOOTER "" ;
      3DLOOK TRUE DATA FieldWBlock( SGC020101FIELDS[W],Select( "CLIENTES" ) );
      ALIGN DT_LEFT , nMakeLong( DT_CENTER, 3 )
   ELSE
      IF SGC020101TABELA[W] == 'Calculada'
         NUM := W

         bMacro:=&( "{ || IIF( " + SGC020101FIELDS[NUM]+ "," +SGC020101CONDY[NUM]+ "," +SGC020101CONDZ[NUM]+")}" )

    ADD COLUMN TO BROW020101 HEADER SGC020101TITULO[W] SIZE SGC020101TAMANHO[W] FOOTER "" ;
         PICTURE SGC020101PICTURE[W] 3DLOOK TRUE;
         DATA bMacro ;
         ALIGN IIF(SGC020101TIPO[W] == "C",DT_LEFT , IIF( SGC020101TIPO[W] == "N", DT_RIGHT , DT_CENTER ) ) , ;
         nMakeLong( DT_CENTER, 3 )
      ELSE
    ADD COLUMN TO BROW020101 HEADER SGC020101TITULO[W] SIZE SGC020101TAMANHO[W] FOOTER "" ;
    PICTURE IIF( SGC020101TIPO[W] == "N", SGC020101PICTURE[W], "@!" ) ;
         DATA FieldWBlock( SGC020101FIELDS[W], Select( "CLIENTES" ) ) ;
         ALIGN IIF( SGC020101TIPO[W] == "C", DT_LEFT , IIF( SGC020101TIPO[W] == "N", DT_RIGHT , DT_CENTER ) ) , ;
         nMakeLong( DT_CENTER, 3 )
      ENDIF
   ENDIF

   IF !EMPTY( SGC020101BLOCO[W] )
      IF NUMCOR = 0
         NUMCOR := W
      ENDIF
     
      BROW020101:SetColor( { 1, 2, 5 }, { COR_PRETA, { || IF( &(SGC020101BLOCO[NUMCOR]), ;
      VERCOR( SGC020101CONDD[NUMCOR] ) , VERCOR( SGC020101CONDE[NUMCOR] ) ) }, COR_AZULCLARO }, W )

      BROW020101:Refresh()
   ELSE
      IF SGC020101COR[W] = 'COR_VERDE'
         BROW020101:Setcolor( { 2 }, { COR_VERDE },W )   // COLOCA COR NO FUNDO DAS CELULAS (2)
      ELSEIF SGC020101COR[W] = 'COR_AMARELA'
         BROW020101:Setcolor( { 2 }, { COR_AMARELA },W )   // COLOCA COR NO FUNDO DAS CELULAS (2)
      ELSEIF SGC020101COR[W] = 'COR_VERMELHA'
         BROW020101:Setcolor( { 2 }, { COR_VERMELHA },W )   // COLOCA COR NO FUNDO DAS CELULAS (2)
      ELSE
         BROW020101:Setcolor( { 2 }, { COR_BRANCA },W )   // COLOCA COR NO FUNDO DAS CELULAS (2)
      ENDIF
   ENDIF
NEXT W

BROW020101:Setcolor( { 4 }, { COR_CINZA } )    // COLOCA COR NOS NOMES DAS COLUNAS (4)
BROW020101:nHeightCell = 25    // altura de celula do browse
BROW020101:nHeightHead = 30    // altura do texto das colunas

*aqui é onde dou um click duplo para marcar e desmarcar o registro

BROW020101:SetSelectMode( .T., { | BROW020101, nI, lSel | ;
IF( lSel,AADD( SGC020101LINHA_MARCADAS,LTRIM( STR( nI ) ) ),;
ASIZE( SGC020101LINHA_MARCADAS, LEN( SGC020101LINHA_MARCADAS ) - 1 ) ) ,;
IF( lSel,MARCA_DESMARCA_COLUNA( SGC020101LINHA_MARCADAS,'+' ),;
          MARCA_DESMARCA_COLUNA( SGC020101LINHA_MARCADAS,'-' ) ) },;
SGC020101ABMP[ 2 ], 1, DT_LEFT )

FOR X = 1 TO LEN( SGC020101NOME_ORDEM )
   IF SUBSTR(SGC020101NOME_ORDEM,X,1) == '+'
      EXIT
   ENDIF

   NOMEORDEM020101 += SUBSTR(SGC020101NOME_ORDEM,X,1)
NEXT

FOR X = 1 TO LEN( SGC020101TAMANHO )
   IF ALLTRIM( NOMEORDEM020101 ) = ALLTRIM( SGC020101FIELDS[X] )
      BROW020101:HiliteCell(X)           //POSICIONA O CURSOR NA COLUNA X
      BROW020101:SetColor( { 2,4,14 }, { { COR_AZULCLARO, COR_AZULCLARO }, { COR_AZULCLARO, COR_AZULCLARO }, { COR_AZULCLARO, COR_AZULCLARO } } ,X )        // PINTA O TEXTO E A COLUNA X QUE INDICA UMA ORDEM DE INDICES

      SGC020101COLUNA_PINTADA := X
      SetProperty ( "SGC020101FORM", 'PESQUISA', 'CAPTION' , SGC020101FIELDS[X] + '.:' )
   ENDIF
NEXT

BROW020101:lNoResetPos := .F.          // this is very important when working with the same database
END TBROWSE

SETFOCUS TXTPESQUISA020101 OF SGC020101FORM

RETURN

*------------------------------------------------------------------------------------------------------------------
PROCEDURE MARCA_DESMARCA_COLUNA( LINHA_MARCADAS,SOMA_SUBTRAI )

LOCAL SVREC020101 := RecNo()

IF LEN( LINHA_MARCADAS ) > 0
   IF Alias() == "CONTAS"
      CONTAS->( DBSEEK( LINHA_MARCADAS[ LEN( LINHA_MARCADAS ) ] ) )

      IF SOMA_SUBTRAI = "+"
         n += ( CONTAS->VALDUP + CONTAS->ACRESCIMO + CONTAS->JUROS - CONTAS->DESCONTO )
      ELSE
         n -= ( CONTAS->VALDUP + CONTAS->ACRESCIMO + CONTAS->JUROS - CONTAS->DESCONTO )
      ENDIF

      SetProperty( "Form_0","StatusBar","ITEM",1, "Mensagem: Total das contas selecionadas ( " +;
      STRZERO( LEN( LINHA_MARCADAS ),4 ) + " ) = " + Transform( n, "@E 9,999,999.99" ) )
   ELSE
      SetProperty( "Form_0","StatusBar","ITEM",1, "Mensagem: Qtde Marcada = "+STRZERO( LEN( LINHA_MARCADAS ),4 ) )
   ENDIF
ELSE
   SetProperty( "Form_0","StatusBar","ITEM",1, "Mensagem: " )
ENDIF

( Alias() )->( DBGoTo(  SVREC020101 ) )

RETURN

function para pesquisa no campo indexado
*-------------------------------------------------------------------------------------------------------------------
STATIC FUNCTION PESQUISA020101( PESQUISA_FILTRO, CFILTRO, CTEXTO, RADIOEOU, RADIOACAO )
LOCAL S,C,I,Q, pesq, OFILTRO, cKey1
LOCAL EOU  := IIF( RADIOEOU = 1,' .AND. ',' .OR. ')
LOCAL CAMPOS_TIPO := CLIENTES->( FieldType( FieldPos( SGC020101FIELDS[BROW020101:ncell] ) ) )

DBSELECTAREA("CLIENTES")
CLIENTES->( DBSetOrder( SGC020101NUMORDEM ) )
cKey1 := ALLTRIM( UPPER( GetProperty( 'SGC020101FORM' , 'TXTPESQUISA020101' , 'VALUE') ) )

CLIENTES->( OrdScope( TOPSCOPE, cKey1 ) )
CLIENTES->( OrdScope( BOTTOMSCOPE, cKey1 ) )

IF PESQUISA_FILTRO $ 'A_F'
   IF ALLTRIM( UPPER( ALIAS() ) ) <> ALLTRIM( UPPER ( SGC020101TABELA[ BROW020101:ncell ] ) )
      MSGINFO(PADC('A T E N Ç Ã O',50)+QUEBRA+;
      PADC("",50)+QUEBRA+;
      PADC("A coluna " + SGC020101TITULO[BROW020101:ncell ] + " selecionada, não pertence",50)+QUEBRA+;
      PADC("a tabela de CLIENTES e sim da tabela " + ALLTRIM( UPPER ( SGC020101TABELA[ BROW020101:ncell ] ) ) ,50)+QUEBRA+;
      PADC("relacionada nesta ficha.",50) +QUEBRA+;
      PADC("Impossivél filtrar esta coluna. ",50),MSIST)

      RETURN
   ENDIF

   IF IsWIndowDefined(CRIA_FILTRO)
      RELEASE WINDOW CRIA_FILTRO
   ENDIF

   IF CAMPOS_TIPO = 'N' .AND. PESQUISA_FILTRO = 'A'
      CTEXTO := ALLTRIM( STR( CTEXTO,10,2 ) )
   ENDIF

   IF CFILTRO = 1
      IF CAMPOS_TIPO = 'N'
         OFILTRO :=  'CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' = ' + CTEXTO
      ELSE
    IF PESQUISA_FILTRO = 'A'
       IF EMPTY(CTEXTO)
               OFILTRO := 'EMPTY( CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ')'
            ELSE
          OFILTRO := 'ALLTRIM( UPPER( CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ')) == "' + ALLTRIM( UPPER( CTEXTO ) ) + '"'
       ENDIF
    ELSE
       OFILTRO := 'ALLTRIM( UPPER( CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ')) = "' + ALLTRIM( UPPER( CTEXTO ) ) + '"'
         ENDIF
      ENDIF
   ELSEIF CFILTRO = 2
      IF CAMPOS_TIPO = 'N'
         OFILTRO := 'CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' == ' + CTEXTO
      ELSE
         OFILTRO := 'ALLTRIM( UPPER( CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' ) ) == "' + ALLTRIM( UPPER( CTEXTO ) ) +'"'
      ENDIF
   ELSEIF CFILTRO = 3
      IF CAMPOS_TIPO = 'N'
         OFILTRO := 'CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' <> ' + CTEXTO
      ELSE
         OFILTRO := 'ALLTRIM( UPPER( CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' ) ) <> "' + ALLTRIM( UPPER( CTEXTO ) ) +'"'
      ENDIF
   ELSEIF CFILTRO = 4
      IF CAMPOS_TIPO = 'N'
         OFILTRO := 'CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' > ' + CTEXTO
      ELSE
         OFILTRO := 'ALLTRIM( UPPER( CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' ) ) > "' + ALLTRIM( UPPER( CTEXTO ) ) +'"'
      ENDIF
   ELSEIF CFILTRO = 5
      IF CAMPOS_TIPO = 'N'
         OFILTRO := 'CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' >= ' + CTEXTO
      ELSE
         OFILTRO := 'ALLTRIM( UPPER( CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' ) ) >= "' + ALLTRIM( UPPER( CTEXTO ) ) +'"'
      ENDIF
   ELSEIF CFILTRO = 6
      IF CAMPOS_TIPO = 'N'
         OFILTRO := 'CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' < ' + CTEXTO
      ELSE
         OFILTRO := 'ALLTRIM( UPPER( CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' ) ) < "' + ALLTRIM( UPPER( CTEXTO ) ) +'"'
      ENDIF
   ELSEIF CFILTRO = 7
      IF CAMPOS_TIPO = 'N'
         OFILTRO := 'CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' <= ' + CTEXTO
      ELSE
         OFILTRO := 'ALLTRIM( UPPER( CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' ) ) <= "' + ALLTRIM( UPPER( CTEXTO ) ) +'"'
      ENDIF
   ELSEIF CFILTRO = 8
      IF CAMPOS_TIPO = 'N'
         OFILTRO :=  'CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] + ' = 0'
      ELSE
         OFILTRO := "EMPTY( CLIENTES->" + SGC020101FIELDS[BROW020101:ncell] + ")"     
      ENDIF
   ELSEIF CFILTRO = 9
      IF CAMPOS_TIPO = 'N'
         OFILTRO :=  'FORNECS->' + SGC020101FIELDS[BROW020101:ncell] + ' > 0'
      ELSE
         OFILTRO := "!EMPTY( CLIENTES->" + SGC020101FIELDS[BROW020101:ncell] + ")"
      ENDIF
   ELSEIF CFILTRO = 10
      IF CAMPOS_TIPO = 'N'
          OFILTRO := ''
      ELSE
         OFILTRO := '"' + ALLTRIM( UPPER( CTEXTO ) ) + '" $ ' + 'ALLTRIM( UPPER( CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] +' ) )'
      ENDIF
   ELSE
      IF CAMPOS_TIPO = 'N'
          OFILTRO := ''
      ELSE
         OFILTRO := '!"' + ALLTRIM( UPPER( CTEXTO ) ) + '" $ ' + 'ALLTRIM( UPPER( CLIENTES->' + SGC020101FIELDS[BROW020101:ncell] +' ) )'
      ENDIF
   ENDIF

   IF EMPTY(SGC020101FILTRAR) .OR. RADIOACAO = 2
      SGC020101FILTRAR := OFILTRO
   ELSE
      IF RADIOACAO = 2
         SGC020101FILTRAR := OFILTRO
      ELSE
         SET FILTER TO
         SGC020101FILTRAR += EOU + OFILTRO
      ENDIF
   ENDIF

   IF PESQUISA_FILTRO = 'F'
      SGC020101FORM.FRFILTRA.VISIBLE := .T.
      SGC020101FORM.LBFILTRO.VISIBLE := .T.
      SGC020101FORM.LBFILTRO.VALUE   := 'Aguarde...'
   ENDIF

   DO EVENTS
   SET FILTER TO &SGC020101FILTRAR.

   IF PESQUISA_FILTRO $ 'F'
      SGC020101FORM.LBFILTRO.VISIBLE := .F.
   ENDIF
ENDIF

BROW020101:GODOWN()
BROW020101:GOUP()
BROW020101:REFRESH(.T.)
BROW020101:UPSTABLE( )
BROW020101:lNoResetPos := .t.
BROW020101:SETFOCUS( .T.)
BROW020101:DRAWSELECT( )
BROW020101:lHasChanged := .T.

SetProperty ( 'SGC020101FORM', 'BROW020101', 'VALUE' , CLIENTES->(RECNO()) ) && dispensável

QTDE_REGISTRO_BROW( 'SGC020101FORM', 'TOTREG' )

s := ALLTRIM( GetProperty( 'SGC020101FORM' , 'TXTPESQUISA020101' , 'VALUE') )
c := GetProperty( 'SGC020101FORM' , 'TXTPESQUISA020101' , 'CARETPOS')
q := 0

FOR I := 1 TO C
  IF SUBSTR( S , I , 1 ) == CHR(13)
     SETFOCUS BROW020101 OF SGC020101FORM
     E++
     Q := 0
  ELSE
     Q++
  ENDIF
NEXT I

IF SGC020101TOTAL[BROW020101:ncell]
   SGC020101TOTAL[BROW020101:ncell] := .F.
   PROPACAO020101(SGC020101COLUNA_TOTAL,5)
ENDIF

BROW020101: GOTOP()

IF PESQUISA_FILTRO $ 'A_F'
   IF _ISCONTROLDEFINED("BROW020101","SGC020101FORM")
      SHOW CONTROL BROW020101 OF SGC020101FORM
      SETFOCUS BROW020101 OF SGC020101FORM
   ENDIF
ELSE
   SETFOCUS TXTPESQUISA020101 OF SGC020101FORM
ENDIF

SetProperty ( 'SGC020101FORM', 'TXTPESQUISA020101', 'CARETPOS' , Q )

IF PESQUISA_FILTRO $ 'A_F'
   SGC020101FORM.FRFILTRA.VISIBLE := .T.
   SGC020101FORM.LBFILTRA.VISIBLE := .T.
   SGC020101JAFILTRADO            := 'S'
   SGC020101FORM.LBFILTRA.VALUE   := SGC020101FORM.LBFILTRA.VALUE + " / " + SGC020101TITULO[BROW020101:ncell ]
ENDIF

RETURN

bem é isso ai pessoal, fico grato se alguem puder ajudar
abraço a todos
Nota de Moderação:
Toledo: Tópico editado para colocar as imagens (que estavam em anexo) dentro da mensagem usando a tag IMG.
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 337
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

tsbrowse fica bagunçado ao clicar em uma celula

Mensagempor Amparo » 19 Mar 2012 09:36

ola amigos

meu problema foi resolvido, o colega Mauricio me passou uma funçao para corrigir o problema e que estou compartilhando com o grupo para que se alguem deparar com o mesmo problema nao bata a cabeça como eu.

abraço

Function RefreshBrowse(browse)
Local nRecno    := recno()
Local nSkip     := browse:nRowPos
Local nRowCount := browse:nRowCount
Local nRowPos   := 1
Local nPrevRec
dbSkip(-1)
nPrevRec := if(bof(), 0, recno())
dbGoto(nRecno)

do while nSkip > 1
   dbSkip(-1)

   if bof()
      exit
   endif

   nSkip--
   nRowPos++
enddo

do while nRowPos < nRowCount
   dbSkip(-1)

   if bof()
      exit
   endif

   nRowPos++
enddo

browse:lHitTop    := .f.
browse:lHitBottom := .f.
browse:nRowPos    := nRowPos
browse:nLastPos   := nRecno
browse:nPrevRec   := nPrevRec
browse:refresh(.t., .t.)
browse:resetVScroll()
dbGoto(nRecno)
Return browse
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 337
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 2 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro