Página 1 de 1

Grid/Browse Condicional

Enviado: 01 Mar 2014 08:32
por Cavalo Marinho
Olá amigos do forum, estou reescrevendo meu sistema em harbour/minigui, já fiz algumas telas, com browse, navego chamo formulário de digitação etc, agora quero resolver algo e não consigo, ja pesquisei e nao encontrei. é o seguinte: Quero criar um browse condicional, explicando melhor, na minha rotina de orçamentos em tenho uma tabela onde registro todos os orçamentos que estão sendo realizado na loja, eu quero que o meu browse mostre somente os itens de uma determinada venda, ou seja se eu estiver fazendo o orçamento numero 100, o itens no browse tem que ser do orçamento numero 100, não quero usar set filter pois acho muito lento, quando se instancia o set filter ele demora na filtragem da tabela, especialmente se esta estiver muito populada, queria dar um seek no numero da tabela e dair mostrar no no browse os itens deste orçamento e um campo totalizando o mesmo.
Não sei se fui claro, desde já agradeço

Grid/Browse Condicional

Enviado: 01 Mar 2014 09:08
por Toledo
Amigo, se você estiver usando a MiniGui Extended, dê uma olhada neste exemplo da pasta samples:

\MiniGUI_2_3\SAMPLES\BASIC\Browse_4

Código: Selecionar todos

/*
 * MINIGUI - Harbour Win32 GUI library Demo
 *
 * Copyright 2002 Roberto Lopez <harbourminigui@gmail.com>
 * http://harbourminigui.googlepages.com/
*/

#include "minigui.ch"

Function Main

	SET BROWSESYNC ON	

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 800 HEIGHT 480 ;
		TITLE 'MiniGUI Browse Demo' ;
		MAIN NOMAXIMIZE ;
		ON INIT OpenTables() ;
		ON RELEASE CloseTables()

		@ 10,10 LABEL Label_1 VALUE 'Pedidos'

		@ 10,400 LABEL Label_2 VALUE 'Items'

		@ 40,10 BROWSE Pedidos	;
			WIDTH 380 ;
			HEIGHT 370 ;
			HEADERS { 'Pedido' , 'Cliente' , 'Endereco' , 'Cidade' } ;
			WIDTHS { 100 , 250 , 250 , 150 } ;
			WORKAREA Pedidos ;
			FIELDS { 'Pedidos->Pedido' , 'Clientes->Nome' , 'Clientes->Endereco' , 'Clientes->Cidade' } ;
			ON CHANGE UpdateItems() ;
			EDIT INPLACE ;
			READONLY { .T. , .F. , .F. , .F. } LOCK

		@ 40,400 BROWSE Items ;
			WIDTH 380 ;
			HEIGHT 370 ;
			HEADERS { 'Pedido' , 'Produto' , 'Quant' , 'Valor' , 'Sum' } ;
			WIDTHS { 99 , 120 , 60 , 80 , 90 } ;
			WORKAREA Items ;
			FIELDS { 'Items->Pedido' , 'Items->Produto' , 'Items->Quant' , 'Items->Valor', 'Quant*Valor' } ;
			JUSTIFY { BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_RIGHT } ;
			EDIT INPLACE ;
			READONLY { .T. , .F. , .F. , .F. , .T. } LOCK


	END WINDOW

	CENTER WINDOW Form_1

	ACTIVATE WINDOW Form_1

Return Nil

Procedure OpenTables()
Local aProduto := {}

	Use Clientes Shared New
        Index On Field->Codigo To Clientes

	Use Produtos Shared New
        Index On Field->Produto To Produtos
        dbeval( { || aadd( aProduto, {Nome, Produto} ) } )

	Use Items Shared New
        Index On Field->Pedido To Items

	Use Pedidos Shared New
	Set Relation To Field->Cliente Into Clientes

	Form_1.Pedidos.Value := RecNo()
	UpdateItems()
	
        Form_1.Items.InputItems := { Nil , aProduto , Nil , Nil , Nil }

        Form_1.Items.DisplayItems := { Nil , aProduto , Nil , Nil , Nil }

Return

Procedure CloseTables()

	Close DataBases
	AEval( Directory( '*.ntx' ), { |file| Ferase( file[1] ) } )

Return

Procedure UpdateItems()
Local nArea := Select()

	Select Items
	OrdScope(0,Pedidos->Pedido)
	OrdScope(1,Pedidos->Pedido)
	Go Top
	Form_1.Items.Value := RecNo()
	Select(nArea)

Return 
Abraços,

Grid/Browse Condicional

Enviado: 10 Jul 2015 13:14
por microvolution
Aproveitando este tópico - não sei se é o mais apropriado; pois são 21 páginas que encontrei, e a mais apropriada é esta.
Gostaria da ajuda dos colegas a compreender melhor os exemplos da pasta MINIGUI\BASIC\browse, pois nenhum deles (sendo muito bonitos e atraentes), é da mesma funcionalidade do meu atual que está em MODO CONSOLE e estou já migrando meu sistema para modo GRÁFICO e CONSOLE JUNTOS (ao mesmo tempo) até eliminar totalmente o CONSOLE.

No meu sistema em MODO CONSOLE, dentro de um determinado GET (por exemplo se esteou fazendo uma venda para o determinado cliente) eu pressiono a tecla F4 que imediatamente aciona o browse com todos os clientes disponíveis. Então, entendam as seguintes situações:
1 - para mudar a ordem de pesquisa (por NOME, CPF, ENDEREÇO, FILIAÇÃO, etc) eu uso no teclado ALT+P (a cada pressionada a ordem vai mudando sequencialmente até o local desejado ou volta para início novamente da pesquiesa)e;
2 - para realizar a consulta eu uso ALT+C (isso é muito dinâmico, pois a cada letra digitada vai sendo filtrado o nome até chegar no que eu preciso - usando o inkey() ). Ao encontrar o dito cliente, é só pressionar ENTER sobre o resultado que o GET é preenchido automaticamente com o código do cliente e os demais SAYs/GETs referentes a esse cliente como DATA nascimento, endereço, cpf, também são preenchidos.

Então, no MODO CONSOLE é o SET KEY e na HMG/GUI é o ON KEY F4.
A princípio a troca de SET KEY para ON KEY Tá dando certo... só que não sei o que mudar no meu antigo BROWSE para ser adaptado para o MODO GRÁFICO.
Vejam o meu código do BROWSE atualmente e me digam o que fazer (se puderem; por favor):
=========== função de criação do browse parte 1

Código: Selecionar todos

static function CONSULTA_ARQUIVO (PROGRAMA,LINHA,VARIAVEL)
     local CABEC_CAMPOS := {},;
           MASCARAS     := {},;
           TAM_MEMO     := {},;
           TECLAS       := {},;
           ARQUIVO      := select (),;
           POSICAO      := recno (),;
           SALVA_COR    := setcolor (),;
           OPCOES       := {},;
           DESCRICAO    := {},;
           NOME_ARQUIVO := ''

	     setcursor (SC_NONE)
	     setcolor (COR_BROWSE)
	     set key TECLA_HELP to TECLAS_BROWSE
	     set key TECLA_CONT_ANT to
	     set key TECLA_CONSULTA to
	     set key ALT_TECLA_CONSULTA to
	     aadd (TECLAS,{'Esc','Retorna'})
	     aadd (TECLAS,{'F1','Help'})
	     aadd (TECLAS,{'F2','Util'})
	     aadd (TECLAS,{'Alt F2','Consulta'})
	     aadd (TECLAS,{'Alt F3','Gr fico'})
	     do case
	          case VARIAVEL == 'MCDCLIENTE' .and. lastkey () <> K_ALT_F4
	               set key TECLA_PROG_CHAMA to CADASTRA_ARQUIVO
	               aadd (TECLAS,{'F5','Cadastra'})
	               select ('DCI10000')
	               NOME_ARQUIVO := 'Clientes'
	               aadd (CABEC_CAMPOS,'COD.CLI.')
	               aadd (MASCARAS,pCDCLIENTE)
	               aadd (TAM_MEMO,nil)
	               aadd (CABEC_CAMPOS,'NOME')
	               aadd (MASCARAS,pNMCLIENTE)
        	       aadd (TAM_MEMO,nil)
	               aadd (CABEC_CAMPOS,'CPF/CIC')
        	       aadd (MASCARAS,pNUCPF)
	               aadd (TAM_MEMO,nil)
// aqui abaixo vai o restante do CASE com isso tudo para cada GET (muitas linhas) que achei muito grande para colocar aqui e //cansar o vosso raciocínio. 
// abaixo o encerramento do DO CASE:
	          otherwise
        	       NOME_ARQUIVO := 'Ordem Servi‡o Veicular'
	               //aadd (CABEC_CAMPOS,'No.VENDA')
	               aadd (CABEC_CAMPOS,'No.OSV')
        	       aadd (MASCARAS,pNU_VENDA)
	               aadd (TAM_MEMO,nil)
        	       aadd (CABEC_CAMPOS,'COD.CLI.')
	               aadd (MASCARAS,pCDCLIENTE)
        	       aadd (TAM_MEMO,nil)
// aqui abaixo vai o restante do CASE OTHERWISE com isso tudo para cada GET (muitas linhas) que achei muito grande para colocar aqui e //cansar o vosso raciocínio. 
// abaixo o encerramento do DO CASE:
	     endcase
	     TECLAS_FUNCAO (TECLAS)
	     ATUALIZA_BROWSE := .t.
	     do while ATUALIZA_BROWSE
	          ATUALIZA_BROWSE := .f.
        	  CRIABROWSE (VARIAVEL,'PCI10048',NOME_ARQUIVO,CABEC_CAMPOS,TAM_MEMO,MASCARAS)
	     enddo
   select (ARQUIVO)
	     OPCOES_CAMPOS ()
	     setcolor (SALVA_COR)
	     setcursor (SC_NORMAL)
	     set key TECLA_HELP to HELP_CAMPO
	     set key TECLA_CONT_ANT to CONTEUDO_ANTERIOR
	     set key TECLA_CONSULTA to CONSULTA_ARQUIVO
	     set key ALT_TECLA_CONSULTA to CONSULTA_ARQUIVO
	     set key TECLA_PROG_CHAMA to
	     set filter to
	     go POSICAO
	     if CAN_TECLA_F3				
	          set key TECLA_CONT_ANT to		
	     endif					
return	  
=========== fim da primeira parte do browse

=========== função de criação do browse parte 2 - o código é muito grande e esse sim é todo o responsável pelo meu BROWSE. Vejam:

Código: Selecionar todos

function CRIABROWSE (VARIAVEL,NOME_PROGRAMA,NOME_ARQUIVO,CAB_CAMPOS,TAM_CAMPOS,MASC_CAMPOS)
     memvar COD_ACESSO,;
            TEM_SENHA,;
            LIN_MENSAGEM
     local I           := 0,;
           N_REGISTROS := 16,;
           TECLA       := nil,;
           VALOR       := nil,;
           SALVA_FILT  := dbfilter (),;
           SALVA_IND   := len (&(alias ()) [1]) - 1,;
           SALVA_ORD   := indexord (),;
           TEL_AUX     := '',;
           ARQ_AUX     := '',;
           oTBCOLUMN   := nil,;
           TENTATIVAS  := 5,;
           COMPARTILHADO   := .t.,;
           EXISTE_ARQ  := .t.,;
           TENTAT,;
           TELA_AUX,;
           NOME_CAMPO,;
           BLOCO

     private iCAMPO      := {},;
             fCAMPO      := {},;
             cCAMPO      := {},;
             COLUNA      := {},;
             ESTRUTURA   := {},;
             CABEC_CAMPOS:= CAB_CAMPOS,; // Cabecalho da colunas do browse
             POS_REAL    := {},; // indica a posicao real do coluna do browse no arquivo de dados
                               ; // mapeamento:  Posicao Coluna --> Posicao Estrutura Fisca
             ORDEM_ELIM  := {{},{}},; // indica a ordem das colunas eliminadas
             FILT_AUX    := dbfilter (),;
             FIM_LOOP    := .f.,;
             FIM_BROW    := .f.,;
             POS_COL     := 1,; // posicao da coluna corrente no browse ativo
             POS_LIN     := 1,; // posicao da linha corrente no browse ativo
             N_CONGEL    := 0,;
             C_VARIAVEL  := 0,; // posicao da varivel a ser retornada
             CONT        := len (&(alias ()) [1]) - 1,;
             AREA_ARQ    := alias(),;
             TAM         := 0,;
             CONTROLE    := .F.,;
             TITULO_BROW := alltrim(substr(NOME_ARQUIVO,1,30)),; // titulo do browse corrente,;
             SALVA_TELA  := nil,;
             LINHA1      := 2,;  // linha superior do browse
             COLUNA1     := 1,;  // coluna mais a esquerada do browse
             LINHA2      := 21,; // linha inferior do browse
             COLUNA2     := 76,; // coluna mais a direita do browse
             oTBROWSE,;
                      ;  // variaveis utilizadas pelo modulo de grafico:
             VET_LIN     := {},; // Vetor com posicao das linhas.
             COL_VAL     := {},; // Vetor com colunas de valor.
             COL_LEG     := 0,;  // Coluna da legenda.
             TITULO     := space (65),;
             SUB_TITULO := space (65),;
             TITULO_Y   := space (50)

     Private ARQ_BROW    := {{{'BROWSE',;
                               'Arquivo de Browse do Sistema',;
                               'BROWSE.DBF'},;
                              {'BROWSE',;
                               'BROWARQ+BROWTITULO',;
                               'BROW001.NTX'},;
                              {'BROWSE',;
                               'BROWARQ+BROWTIPO+STR(BROWCODACE,6)',; // era ',5' mudei p/ ',6' para poder equiparar com a variável COD_ACESSO q tb era 5 e foi mudada p/ 6. 01-11-11w.
                               'BROW002.NTX'}},;
                             {'BROWARQ',     'C',   8,0},;
                             {'BROWTITULO',  'C',  30,0},;
                             {'BROWFILCOL',  'C',  60,0},;
                             {'BROWFILINI',  'C', 256,0},;
                             {'BROWFILFIN',  'C', 256,0},;
                             {'BROWFILCON',  'C', 256,0},;
                             {'BROWSETORD',  'N',   2,0},;
                             {'BROWCOLATV',  'C', 200,0},;
                             {'BROWCOLELM',  'C', 200,0},;
                             {'BROWCOLCOR',  'N',   2,0},;
                             {'BROWFIXA',    'N',   2,0},;
                             {'BROWTIPO',    'C',   1,0},;
                             {'BROWL1',      'N',   2,0},;
                             {'BROWC1',      'N',   2,0},;
                             {'BROWL2',      'N',   2,0},;
                             {'BROWC2',      'N',   2,0},;
                             {'BROWREGCOR',  'N',   9,0},;
                             {'BROWCODACE',  'N',   6,0}} // era ',5' mudei p/ ',6' para poder equiparar com a variável COD_ACESSO q tb era 5 e foi mudada p/ 6. 01-11-11w.


     ESTRUTURA := dbstruct ()
//     POS_REAL := array(fcount())  // substituída pelas 4 linhas abaixo pelo Sr. Eolo q conheci pelo fórum pctoledo e me ajudou a resolver o erro base/1068 das matrizes MASC_CAMPOS e POS_REAL. 22/9/11w
     pos_real:={}
     for x=1 to fcount()
          aadd(pos_real,x)
     next

     //criando arquivo BROWSE.DBF
     if !file(ARQ_BROW[1,1,3])
        EXISTE_ARQ:=.f.
        ARQ_AUX:=aclone(ARQ_BROW)
        ARQ_AUX := adel (ARQ_AUX,1)
        ARQ_AUX := asize (ARQ_AUX,len (ARQ_AUX) - 1)
        dbcreate (ARQ_BROW[1,1,3],ARQ_AUX)
     endif
     
     //criando indices do arquivo BROWSE.DBF
     for I:=2 to len(ARQ_BROW[1])
        if !file(ARQ_BROW[1,I,3]) .or. !EXISTE_ARQ
           use (ARQ_BROW[1,1,3]) alias (ARQ_BROW[1,1,1]) new
           if neterr ()
              TELA_AUX := savescreen(LIN_MENSAGEM,0,LIN_MENSAGEM,79)
              MENSAGEM('Sobrecarga na rede. N„o foi poss¡vel acessar a consulta.')
              inkey(0)
              restscreen(LIN_MENSAGEM,0,LIN_MENSAGEM,79,TELA_AUX)
              return nil
           endif
           index on &(ARQ_BROW[1,I,2]) to (ARQ_BROW[1,I,3])
           close
        endif
     next

     ABRE_ARQUIVO (ARQ_BROW,'TODOS',COMPARTILHADO,TENTATIVAS)

     //>> Restaurando configuracao do browse
     
     select(ARQ_BROW[1,1,1])
     set order to 1
     
     if TEM_SENHA
       set filter to BROWSE->BROWTIPO == "F" .AND. BROWSE->BROWCODACE == COD_ACESSO
     else
         set filter to BROWSE->BROWTIPO == "F"
     endif
     seek(MASC(AREA_ARQ,8)+NOME_PROGRAMA+VARIAVEL)
     if !(alltrim(BROWSE->BROWTITULO) == alltrim(NOME_PROGRAMA+VARIAVEL))
        if INCLUI (TENTATIVAS) .AND. TRAVADO (TENTATIVAS)
           select(AREA_ARQ)
           BROWSE->BROWARQ := AREA_ARQ
           BROWSE->BROWTIPO := "F"
           BROWSE->BROWTITULO := NOME_PROGRAMA+VARIAVEL
           BROWSE->BROWSETORD := indexord()
           BROWSE->BROWCOLCOR := 1
           BROWSE->BROWFIXA   := 0
           BROWSE->BROWREGCOR := 1
           for I := 1 to fcount ()
                TAM := TAM + max (len (CABEC_CAMPOS [I]),ESTRUTURA [I,3])
                BROWSE->BROWCOLATV := alltrim(BROWSE->BROWCOLATV)+;
                                   alltrim(str(I)) +";"
           next I
      
           //>> Faz o calculo de onde sera posicionado o browse
           if TAM < (COLUNA2 - COLUNA1 + 1)
              if TAM < len (TITULO_BROW) + 3
                TAM := len (TITULO_BROW) + 3
             endif
              COLUNA1 := COLUNA2 - TAM
           endif

           go top
           N_REGISTROS := AVANCA_REGISTROS (16)
           if N_REGISTROS < (LINHA2 - LINHA1 - 4)
              LINHA1 := LINHA2 - N_REGISTROS - 5
           endif

           BROWSE->BROWL1     := LINHA1
           BROWSE->BROWC1     := COLUNA1
           BROWSE->BROWL2     := LINHA2
           BROWSE->BROWC2     := COLUNA2

           if TEM_SENHA
               // ?"sim, TEM_SENHA",TEM_SENHA		// linhas colocadas provisórias, foi resolvido, tendo em vista q no arquivo BROWSE o campo BROWCODACE estava com 5 e mudei p/ 6 o tamanho. 01-11-11w
               // ? valtype(BROWSE->BROWCODACE),valtype(COD_ACESSO)		// linhas colocadas provisórias, foi resolvido, tendo em vista q no arquivo BROWSE o campo BROWCODACE estava com 5 e mudei p/ 6 o tamanho. 01-11-11w
               // ? BROWSE->BROWCODACE,COD_ACESSO		// linhas colocadas provisórias, foi resolvido, tendo em vista q no arquivo BROWSE o campo BROWCODACE estava com 5 e mudei p/ 6 o tamanho. 01-11-11w
               // inkey(0)		// linhas colocadas provisórias, foi resolvido, tendo em vista q no arquivo BROWSE o campo BROWCODACE estava com 5 e mudei p/ 6 o tamanho. 01-11-11w
              BROWSE->BROWCODACE := COD_ACESSO
           else
              BROWSE->BROWCODACE := 0
              // ?"não TEM_SENHA",TEM_SENHA		// linhas colocadas provisórias, foi resolvido, tendo em vista q no arquivo BROWSE o campo BROWCODACE estava com 5 e mudei p/ 6 o tamanho. 01-11-11w
              // inkey(0)		// linhas colocadas provisórias, foi resolvido, tendo em vista q no arquivo BROWSE o campo BROWCODACE estava com 5 e mudei p/ 6 o tamanho. 01-11-11w
           endif

           select(ARQ_BROW[1,1,1])
           unlock
           select(AREA_ARQ)
           go top
        else
           TELA_AUX := savescreen(LIN_MENSAGEM,0,LIN_MENSAGEM,79)
           MENSAGEM('Sobrecarga na rede. N„o foi poss¡vel acessar a consulta.')
           inkey(0)
           restscreen(LIN_MENSAGEM,0,LIN_MENSAGEM,79,TELA_AUX)
           return nil
        endif
     endif
     //<<

     TITULO_BROW := alltrim(substr(NOME_ARQUIVO,1,30))
     
     CARREGA_BROWSE()

     //>>calculando altura da janela do browse
     SELECT(AREA_ARQ) 
     go top
     N_REGISTROS := AVANCA_REGISTROS (16)
     if N_REGISTROS < (LINHA2 - LINHA1 - 4)
        LINHA1 := LINHA2 - N_REGISTROS - 5
     endif
     //<<

     select(ARQ_BROW[1,1,1]) 
     
     COLUNA1 := BROWSE->BROWC1
     COLUNA2 := BROWSE->BROWC2

     select(AREA_ARQ)
     go top
     
     for I := 1 to fcount ()
        if ESTRUTURA[I,1] == substr(VARIAVEL,2)
           C_VARIAVEL := I
        endif
     next

     do while .not. (FIM_LOOP)

          SALVA_TELA := savescreen (LINHA1 - 1,COLUNA1 - 1,LINHA2 + 1,COLUNA2 + 2)
          MOLDURA (LINHA1,COLUNA1,LINHA2,COLUNA2,.f.,TITULO_BROW)

          // Monta o objeto TBrowse
          oTBROWSE := tbrowsedb (LINHA1 + 1,COLUNA1 + 1,LINHA2 - 1,COLUNA2 - 1)
          oTBROWSE:colorspec += ',' + COR_FUNDO (N_COR (2)) + '+/' + COR_FUNDO (N_COR (1)) +;
                                ',' + COR_FUNDO (N_COR (2)) + '+/' + COR_FUNDO (N_COR (2))
          oTBROWSE:headsep := chr (196) + chr (194) + chr (196)
          oTBROWSE:colsep  := chr (32) + chr (179) + chr (32)
          oTBROWSE:footsep := chr (196) + chr (193) + chr (196)
          FIM_BROW := .f.

                     if empty(MASC_CAMPOS[POS_REAL[I]])
                        oTBROWSE:addcolumn (tbcolumnnew (CABEC_CAMPOS [POS_REAL[I]],fieldblock (fieldname (POS_REAL[I]) )))
                     else
                        NOME_CAMPO := fieldname (POS_REAL[I])
                        BLOCO := "{|XX|transform(if(XX==NIL,"+NOME_CAMPO+","+NOME_CAMPO+":= XX),'"+MASC_CAMPOS[POS_REAL[I]]+"')}"
                        oTBROWSE:addcolumn (tbcolumnnew (CABEC_CAMPOS [POS_REAL[I]],&(BLOCO) ))
                     endif
                 else
                     oTBROWSE:addcolumn (tbcolumnnew (CABEC_CAMPOS [POS_REAL[I]],{|| '<MEMO>'}))
                 endif
                 oTBCOLUMN := oTBROWSE:getcolumn (oTBROWSE:colcount)
                 oTBCOLUMN:cargo := array (3)

                 oTBCOLUMN:Cargo[COL_TAMREL] := TAM_CAMPOS[POS_REAL[I]]
                 oTBCOLUMN:Cargo[COL_MASC  ] := MASC_CAMPOS[POS_REAL[I]]

                 oTBCOLUMN:Cargo[COL_EXP   ] := fieldname (POS_REAL[I])

          next I

          for I := 1 to len(ORDEM_ELIM[1])
                if ESTRUTURA [ORDEM_ELIM[1,I],2] <> 'M'
                   if empty(MASC_CAMPOS[ORDEM_ELIM[1,I]])
                        oTBCOLUMN := tbcolumnnew (CABEC_CAMPOS [ORDEM_ELIM[1,I]],fieldblock (fieldname (ORDEM_ELIM[1,I]) ))
                     else
                        NOME_CAMPO := fieldname (ORDEM_ELIM[1,I])
                        BLOCO := "{|XX|transform(if(XX==NIL,"+NOME_CAMPO+","+NOME_CAMPO+":= XX),'"+MASC_CAMPOS[ORDEM_ELIM[1,I]]+"')}"
                        oTBCOLUMN := tbcolumnnew (CABEC_CAMPOS [ORDEM_ELIM[1,I]],&(BLOCO) )
                     endif
                 else
                    oTBCOLUMN := tbcolumnnew (CABEC_CAMPOS [ORDEM_ELIM[1,I]],{|| '<MEMO>'})
                 endif
                 aadd(ORDEM_ELIM[2],oTBCOLUMN)
                 oTBCOLUMN:cargo := array (3)
                 oTBCOLUMN:footsep := chr (196) + chr (193) + chr (196)

                 oTBCOLUMN:Cargo[COL_TAMREL] := TAM_CAMPOS[ORDEM_ELIM[1,I]]
                 oTBCOLUMN:Cargo[COL_MASC  ] := MASC_CAMPOS[ORDEM_ELIM[1,I]]

                 oTBCOLUMN:Cargo[COL_EXP   ] := fieldname (ORDEM_ELIM[1,I])

          next I

          oTBROWSE:freeze := N_CONGEL
          oTBROWSE:colpos := POS_COL
          oTBROWSE:rowpos := POS_LIN

          STATUS_RODAPE()

          //>> Exibicao e ativacao do browse
          do while .not. (FIM_BROW)
               do while .not. oTBROWSE:stabilize ()  // O Objeto deve ser Estabilizado
               enddo
               TECLA   := inkey (0)
               POS_COL := oTBROWSE:colpos
               POS_LIN := oTBROWSE:rowpos
               do case
               case TECLA = K_ESC
                    FIM_BROW := .t.
                    FIM_LOOP := .t.
               case TECLA = K_ENTER
                    if ESTRUTURA [POS_REAL [oTBROWSE:colpos],2] <> 'M'
                         if C_VARIAVEL = 0
                             C_VARIAVEL = POS_REAL [oTBROWSE:colpos]
                         endif
                         VALOR := eval (fieldblock (fieldname (C_VARIAVEL)))
                         FIM_BROW := .t.
                         FIM_LOOP := .t.
                         do case
                         case valtype (VALOR) = 'D'
                              VALOR := dtos (VALOR)
                              if len (dtoc(date())) = 10
                                   VALOR := substr (VALOR,7) + substr (VALOR,5,2) + substr (VALOR,1,4)
                              else
                                   VALOR := substr (VALOR,7) + substr (VALOR,5,2) + substr (VALOR,3,2)
                              endif
                              if set (_SET_CONFIRM)
                                   keyboard VALOR + chr (K_ENTER)
                              else
                                   keyboard VALOR
                              endif
                         case valtype (VALOR) = 'N'
                              if set (_SET_CONFIRM)
                                   keyboard strtran (str (VALOR),' ','0') + chr (K_ENTER)
                              else
                                   keyboard strtran (str (VALOR),' ','0')
                              endif
                         case valtype (VALOR) = 'C'
                              if set (_SET_CONFIRM)

                                   if alias()='DCI10024'                   // Linhas acrescentadas por
                                        mEDTIPO   :=DCI10024->EDTIPO       // Walcledson em 09/07/2001
                                        mEDLOGRADO:=DCI10024->EDLOGRADO    // para que o BROWSE pudes-
                                        mEDBAIRRO :=DCI10024->EDBAIRRO     // atualizar o Endere‡o  do
                                        mNUCEP    :=DCI10024->NUCEP        // Cliente, se a rua/ave de
                                        mEDCIDADE :=DCI10024->EDCIDADE     // sua residˆncia tiver   +
                                        mEDUF     :=DCI10024->EDUF         // de um CEP/BAIRRO/etc.,  
                                   endif                                   // sem essas linhas nÆo funciona corretamente o cadastro de endere‡os.

                                   keyboard VALOR + chr (K_ENTER)
                             else
                                   if alias()='DCI10024'                   // Linhas acrescentadas por
                                        mEDTIPO   :=DCI10024->EDTIPO       // Walcledson em 09/07/2001
                                        mEDLOGRADO:=DCI10024->EDLOGRADO    // para que o BROWSE pudes-
                                        mEDBAIRRO :=DCI10024->EDBAIRRO     // atualizar o Endere‡o  do
                                        mNUCEP    :=DCI10024->NUCEP        // Cliente, se a rua/ave de
                                        mEDCIDADE :=DCI10024->EDCIDADE     // sua residˆncia tiver   +
                                        mEDUF     :=DCI10024->EDUF         // de um CEP/BAIRRO/etc.,  
                                   endif                                   // sem essas linhas nÆo funciona corretamente o cadastro de endere‡os.

                                   keyboard padr (VALOR,ESTRUTURA [fieldpos (fieldname (C_VARIAVEL)),3])
                              endif
                         endcase
                    else
                         VALOR := eval (fieldblock (fieldname (POS_REAL [oTBROWSE:colpos])))
                         TEL_AUX := savescreen (02,01,23,79)
                         MOLDURA (02,01,22,77,.f.,'')
                         VALOR := memoedit (VALOR,03,02,21,76,.f.)
                         restscreen (02,01,23,79,TEL_AUX)
                    endif
               otherwise
                    TESTATECLA (TECLA)
               endcase
          enddo
     enddo
     
     //>>Salvar Browse

     select(ARQ_BROW[1,1,1])
     set order to 1
     if TEM_SENHA
        set filter to BROWSE->BROWTIPO == "F" .AND. BROWSE->BROWCODACE == COD_ACESSO
     else
        set filter to BROWSE->BROWTIPO == "F"
     endif

     if TRAVADO(TENTATIVAS)
        SALVA_BROWSE()
        unlock
     else
        TELA_AUX := savescreen(LIN_MENSAGEM,0,LIN_MENSAGEM,79)
        MENSAGEM('Sobrecarga na rede. N„o foi poss¡vel salvar a consulta.')
        inkey(0)
        restscreen(LIN_MENSAGEM,0,LIN_MENSAGEM,79,TELA_AUX)
     endif

     select(ARQ_BROW[1,1,1])
     CLOSE
     //<<

     select(AREA_ARQ)
     set filter to &(SALVA_FILT)
     close index
     for I := SALVA_IND + 1 to CONT
          ARQ_AUX := '$$$$$0' + alltrim (str (I,2,0)) + '.NTX'
          delete file (ARQ_AUX)
     next I
     asize (&(alias ()) [1],SALVA_IND + 1)
     ATIVA_INDICE (SALVA_IND)
     set order to SALVA_ORD
     restscreen (LINHA1 - 1,COLUNA1 - 1,LINHA2 + 1,COLUNA2 + 2,SALVA_TELA)
return nil
============ fim da função CRIABROWSE - parte 2.

Bom, se puderem, favor me darem uma ideia de como transferir isso tudo aí para modo gráfico. Lembrando que uso a HMG 3.0.xx.

vlw!
MICROVOLUTION / W de Paula - Microvolution. A Evolução da Informática - microvolution@hotmail.com - www.mvinfo.wmx.net.br