Prezados boa noite!
Baixei o exemplo do professor Pablo César, (o 2º da 1ª página).
Tentei adaptá-lo ao meu sistema, pois o objeto BROWSE que tenho não funciona na HMG.
- Além dos erros que aconteceram durante a compilação, quero uma forma onde eu mande para a função os dados dos arquivos, pois já estão abertos no momento da pesquisa.
- No lugar de ser um MAIN.PRG criei-o com o nome de ROTINAS6.PRG. Por favor, vejam como ficou:
Código: Selecionar todos
#include <hmg.ch>
FUNCTION CRIABROWSE_GRID(VARIAVEL,NOME_PROGRAMA,NOME_ARQUIVO,CAB_CAMPOS,TAM_CAMPOS,MASC_CAMPOS,NOME_ARQ)
Private bBackColor:={ || IF( THIS.CELLROWINDEX/2==INT(THIS.CELLROWINDEX/2),;
{ 234,244,255 },{ 255,255,255 } ) }, v_getpesqnome
Private aPesq:={"CODIGO", "PRODUTO", "FORNECEDOR"}
Private cProcura
/*
REQUEST DBFCDX
RDDSETDEFAULT( "DBFCDX" )
If !File("sgf97.dbf")
Campos:={ {"NB" ,"C",010,000},;
{"NOME" ,"C",040,000},;
{"NASC" ,"C",008,000},;
{"CPF" ,"C",011,000},;
{"NIT" ,"C",011,000},;
{"ESP" ,"C",002,000},;
{"DER" ,"C",008,000},;
{"DESP" ,"C",002,000},;
{"CONC" ,"C",008,000},;
{"IND" ,"C",008,000},;
{"MOTIND" ,"C",003,000},;
{"MOTINDS" ,"C",003,000},;
{"DTIND" ,"C",008,000},;
{"END" ,"C",040,000},;
{"BAIRRO" ,"C",017,000},;
{"CEP" ,"C",008,000},;
{"MUN" ,"C",024,000},;
{"UF" ,"C",002,000},;
{"DDD" ,"C",004,000},;
{"TEL" ,"C",010,000} }
DbCreate("SGF97.DBF",Campos)
Endif
DBUSEAREA(.T.,,"sgf97.dbf","dbf",,.f.)
If !File("sgf97.cdx")
dbf->(OrdCreate("sgf97.cdx","Beneficio","dbf->nb",{|| dbf->nb } ))
dbf->(OrdCreate("sgf97.cdx","Nome","dbf->nome",{|| dbf->nome } ))
dbf->(OrdCreate("sgf97.cdx","Muncipio","dbf->mun",{|| dbf->mun } ))
Endif
SET INDEX TO "sgf97.cdx"
dbf->( OrdSetFocus(1) )
IF NETERR()
RETURN nil
ENDIF
*/
// TITLE "Pesquisa" + NOME_PROGRAMA ICON NIL MAIN; // linha substituída pela 3 linha abaixo 16/3/16w
DEFINE WINDOW Frm_BROWSE_GRID AT GetDesktopRealTop(),GetDesktopRealLeft() ;
WIDTH GetDesktopRealWidth() HEIGHT GetDesktopRealHeight() ;
TITLE NOME_PROGRAMA ICON NIL MODAL;
ON INIT Frm_BROWSE_GRID_form_oninit() ON RELEASE Nil ;
ON INTERACTIVECLOSE Frm_BROWSE_GRID_form_oninteractiveclose();
ON MOUSECLICK Nil ON MOUSEDRAG Nil ON MOUSEMOVE Nil ;
ON SIZE Nil ON MAXIMIZE Nil ON MINIMIZE Nil ON PAINT Nil ;
BACKCOLOR Nil ON GOTFOCUS Nil ON LOSTFOCUS Nil
ON KEY ESCAPE ACTION Thiswindow.Release()
DEFINE FRAME FramePesq
ROW 10
COL 10
WIDTH 678
HEIGHT 53
FONTNAME "Arial"
FONTSIZE 9
FONTBOLD .T.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
CAPTION "Pesquisar por:"
BACKCOLOR NIL
FONTCOLOR NIL
OPAQUE .T.
END FRAME
DEFINE TEXTBOX GetPesq
ROW 30
COL 190
WIDTH 380
HEIGHT 24
FONTNAME "Arial"
FONTSIZE 9
TOOLTIP ""
ONCHANGE Nil
ONGOTFOCUS Nil
ONLOSTFOCUS Nil
FONTBOLD .F.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
ONENTER (If(Frm_BROWSE_GRID.BotaoPesq.Enabled,Frm_BROWSE_GRID_botaopesq(),))
HELPID Nil
TABSTOP .T.
VISIBLE .T.
READONLY .F.
RIGHTALIGN .F.
DISABLEDBACKCOLOR Nil
DISABLEDFONTCOLOR Nil
CASECONVERT NONE
MAXLENGTH 30
BACKCOLOR NIL
FONTCOLOR NIL
INPUTMASK Replicate("!",40)
FORMAT NIL
VALUE ""
END TEXTBOX
DEFINE COMBOBOX ComboPesq
ROW 30
COL 20
WIDTH 160
HEIGHT 100
ITEMS aPesq
VALUE 0
FONTNAME "Arial"
FONTSIZE 9
TOOLTIP ""
ONCHANGE Muda_Chave(This.Value)
ONGOTFOCUS Nil
ONLOSTFOCUS Nil
FONTBOLD .F.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
HELPID Nil
TABSTOP .T.
VISIBLE .T.
SORT .F.
ONENTER Nil
ONDISPLAYCHANGE Nil
DISPLAYEDIT .F.
IMAGE Nil
DROPPEDWIDTH 0
ONDROPDOWN Nil
ONCLOSEUP Nil
END COMBOBOX
DEFINE BUTTON BotaoPesq
ROW 20
COL 700
WIDTH 120
HEIGHT 40
ACTION Frm_BROWSE_GRID_botaopesq()
CAPTION "Pesquisa"
FONTNAME "Arial"
FONTSIZE 9
TOOLTIP ""
FONTBOLD .T.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
ONGOTFOCUS Nil
ONLOSTFOCUS Nil
HELPID Nil
FLAT .F.
TABSTOP .T.
VISIBLE .T.
TRANSPARENT .F.
MULTILINE .F.
PICTURE Nil
PICTALIGNMENT TOP
END BUTTON
DEFINE CHECKBOX Check_1
ROW 30
COL 585
WIDTH 100
HEIGHT 28
CAPTION "Busca Parcial"
VALUE .F.
FONTNAME "Arial"
FONTSIZE 9
TOOLTIP ""
ONCHANGE cProcura:=""
ONGOTFOCUS Nil
ONLOSTFOCUS Nil
FONTBOLD .F.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
BACKCOLOR Nil
HELPID Nil
TABSTOP .T.
VISIBLE .T.
TRANSPARENT .F.
END CHECKBOX
DEFINE GRID Grid_Data
ROW 70
COL 10
WIDTH GetDesktopRealWidth()-30
HEIGHT GetDesktopRealHeight()-116
ITEMS Nil
VALUE Nil
WIDTHS grid_data_widths()
HEADERS grid_data_headers()
FONTNAME "Courier"
FONTSIZE 9
TOOLTIP ""
ONCHANGE Nil
ONGOTFOCUS Nil
ONLOSTFOCUS Nil
FONTBOLD .F.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
ONDBLCLICK Nil
ONHEADCLICK Nil
ONQUERYDATA Nil
MULTISELECT .F.
ALLOWEDIT .T.
VIRTUAL .F.
DYNAMICBACKCOLOR grid_data_dynamicbackcolor()
DYNAMICFORECOLOR Nil
COLUMNWHEN Nil
COLUMNVALID Nil
COLUMNCONTROLS grid_data_columncontrols()
SHOWHEADERS .T.
CELLNAVIGATION .F.
NOLINES .F.
HELPID Nil
IMAGE Nil
JUSTIFY grid_data_justify()
ITEMCOUNT Nil
BACKCOLOR NIL
FONTCOLOR NIL
HEADERIMAGES Nil
ROWSOURCE "dbf"
COLUMNFIELDS grid_data_columnfields()
ALLOWAPPEND .T.
ALLOWDELETE .T.
BUFFERED .F.
DYNAMICDISPLAY Nil
ONSAVE Nil
LOCKCOLUMNS 0
END GRID
END WINDOW
Frm_BROWSE_GRID.BotaoPesq.Enabled:=.F.
Frm_BROWSE_GRID.Center
Frm_BROWSE_GRID.Activate
RETURN nil
FUNCTION grid_data_columnwhen()
LOCAL aColumnWhen
// { || .T. } PERMITE A EDICAO
// { || .F. } NAO PERMITE A EDICAO
aColumnWhen := { { || .F. },;
{ || .F. },;
{ || .F. },;
{ || .F. },;
{ || .F. },;
{ || .F. },;
{ || .F. },;
{ || .F. },;
{ || .F. },;
{ || .F. },;
{ || .F. } }
RETURN aColumnWhen
FUNCTION grid_data_columncontrols()
LOCAL aColumnControls
aColumnControls := { { "TEXTBOX","CHARACTER" },;
{ "TEXTBOX","CHARACTER" },;
{ "TEXTBOX","CHARACTER" },;
{ "TEXTBOX","CHARACTER" },;
{ "TEXTBOX","CHARACTER" },;
{ "TEXTBOX","CHARACTER" },;
{ "TEXTBOX","CHARACTER" },;
{ "TEXTBOX","CHARACTER" },;
{ "TEXTBOX","CHARACTER" },;
{ "TEXTBOX","CHARACTER" },;
{ "TEXTBOX","CHARACTER" } }
RETURN aColumnControls
FUNCTION grid_data_columnfields()
LOCAL aColumnFields
aColumnFields := {'&NOME_ARQ.->CDPRODUTO',;
'&NOME_ARQ.->DSPRODUTO',;
'&NOME_ARQ.->DSUNIDADE',;
'&NOME_ARQ.->CDFORNECE',;
'&NOME_ARQ.->CD_SECAO' ,;
'&NOME_ARQ.->CDGRUPO' ,;
'&NOME_ARQ.->VR_UNITAR',; // no original era "9,2" 20/2/16w
'&NOME_ARQ.->VR_PRECUS',; // no original era "9,2" 20/2/16w
'&NOME_ARQ.->VP_MARLUC',;
'&NOME_ARQ.->VR_PREVEN',;
'&NOME_ARQ.->DT_ULTCOM',;
'&NOME_ARQ.->DT_ULTVEN',;
'&NOME_ARQ.->QT_ESTMIN',;
'&NOME_ARQ.->QT_ESTMAX',;
'&NOME_ARQ.->QT_ESTTOT'}
/* aColumnFields := { "dbf->nb",;
"dbf->nome",;
"dbf->mun",;
"dbf->cpf",;
"dbf->nasc",;
"dbf->nit",;
"dbf->esp",;
"dbf->der",;
"dbf->desp",;
"dbf->conc",;
"dbf->tel"}
*/
RETURN aColumnFields
FUNCTION grid_data_headers()
LOCAL aheaders
aheaders := CAB_CAMPOS
/*
aheaders := { "Beneficio",;
"Nome",;
"Municipio",;
"CPF",;
"Nascimento",;
"NIT",;
"Esp",;
"Der",;
"Desp",;
"Conc",;
"Tel"}
*/
RETURN aheaders
FUNCTION grid_data_widths()
LOCAL awidths := {}
awidths := { 85, 280, 180, 100, 100, 100, 50, 100, 50, 100, 100 }
RETURN awidths
FUNCTION grid_data_justify()
LOCAL ajustify := {}
ajustify := { GRID_JTFY_CENTER,;
GRID_JTFY_LEFT,;
GRID_JTFY_LEFT,;
GRID_JTFY_CENTER,;
GRID_JTFY_CENTER,;
GRID_JTFY_CENTER,;
GRID_JTFY_CENTER,;
GRID_JTFY_CENTER,;
GRID_JTFY_CENTER,;
GRID_JTFY_CENTER,;
GRID_JTFY_CENTER }
RETURN ajustify
FUNCTION grid_data_DynamicBackColor()
LOCAL aDynamicBackColor := {}
aDynamicBackColor := { bBackColor,;
bBackColor,;
bBackColor,;
bBackColor,;
bBackColor,;
bBackColor,;
bBackColor,;
bBackColor,;
bBackColor,;
bBackColor,;
bBackColor }
RETURN aDynamicBackColor
Function Muda_Chave(nVal)
cProcura:=""
Frm_BROWSE_GRID.Grid_Data.Refresh
Frm_BROWSE_GRID.BotaoPesq.Enabled:=.T.
Frm_BROWSE_GRID.GetPesq.SetFocus
Return Nil
Function Frm_BROWSE_GRID_form_oninit()
Return Nil
Function Frm_BROWSE_GRID_form_oninteractiveclose()
Return Nil
Function Frm_BROWSE_GRID_botaopesq()
Local nVal:=GetProperty("Frm_BROWSE_GRID","ComboPesq","Value")
Local lVal:=GetProperty("Frm_BROWSE_GRID","Check_1","Value")
Local nRec:=dbf->( Recno() )
Local lContinua:=.F.
cNewProcura:=AllTrim(GetProperty("Frm_BROWSE_GRID","GetPesq","Value"))
If cNewProcura==cProcura
lContinua:=.T.
Else
cProcura:=cNewProcura
Endif
dbf->( OrdSetFocus( nVal ) )
If lVal
Do Case
Case nVal=1
If lContinua
Skip
If Eof()
Goto Top
Endif
Locate Rest for cProcura $ Nb
Else
Locate for cProcura $ Nb
Endif
Case nVal=2
If lContinua
Skip
If Eof()
Goto Top
Endif
Locate Rest for cProcura $ Nome
Else
Locate for cProcura $ Nome
Endif
Case nVal=3
If lContinua
Skip
If Eof()
Goto Top
Endif
Locate Rest for cProcura $ Mun
Else
Locate for cProcura $ Mun
Endif
EndCase
Else
dbf->(DBSeek( cProcura ))
Endif
If !Found()
MsgStop(Chr(34)+cProcura+Chr(34)+Chr(13)+Chr(10)+"não encontrado em "+aPesq[nVal]+" !")
dbf->( OrdSetFocus( 0 ) )
Goto nRec
Frm_BROWSE_GRID.Grid_Data.Refresh
Else
dbf->( OrdSetFocus( 0 ) )
Frm_BROWSE_GRID.Grid_Data.Value := {dbf->(Recno()),nVal}
Endif
Frm_BROWSE_GRID.Grid_Data.SetFocus
Return Nil
*********************************************************************************************************
************************** códigos da linguagem C/C++ ***************************************************
#pragma BEGINDUMP
#define HB_OS_WIN_USED
#define _WIN32_WINNT 0x0400
#include <windows.h>
#include "hbapi.h"
HB_FUNC (GETDESKTOPREALTOP)
{
RECT rect;
SystemParametersInfo( SPI_GETWORKAREA, 1, &rect, 0 );
hb_retni(rect.top);
}
HB_FUNC (GETDESKTOPREALLEFT)
{
RECT rect;
SystemParametersInfo( SPI_GETWORKAREA, 1, &rect, 0 );
hb_retni(rect.left);
}
HB_FUNC (GETDESKTOPREALWIDTH)
{
RECT rect;
SystemParametersInfo( SPI_GETWORKAREA, 1, &rect, 0 );
hb_retni(rect.right - rect.left);
}
HB_FUNC (GETDESKTOPREALHEIGHT)
{
RECT rect;
SystemParametersInfo( SPI_GETWORKAREA, 1, &rect, 0 );
hb_retni(rect.bottom - rect.top);
}
#pragma ENDDUMP
************************** códigos da linguagem C/C++ ***************************************************
*********************************************************************************************************
OBS: 1 - No início do meu sistema é criado diversas matrizes com o nome, conteúdo dos campos, indexes de todos os arquivos. No caso aqui, o arquivo é o DCI10010 (produtos), mas, quero mandar para a função também esta matriz.
2 - Estou usando HMG 3.4.2.
3 - A chamada a esta função é:
Código: Selecionar todos
CRIABROWSE_GRID (VARIAVEL,'PCI10011',NOME_ARQUIVO,CABEC_CAMPOS,TAM_MEMO,MASCARAS,ARQUIVO)
Na sequência, o conteúdo e explicação de cada elemento passado é:
VARIAVEL = variável do antigo GET onde foi pressionado a tecla F4 (ah! esta tecla aciona este CRIABROWSE_GRID);
PCI10011 = nome do módulo que está chamando a função;
NOME_ARQUIVO = nome do arquivo na linguagem do usuário, no exemplo acima: "Produtos";
CABEC_CAMPOS = matriz contendo todos os cabeçalhos (nome dos campos para o usuário interpretar/visualizar);
TAM_MEM = matriz contendo campos memo, caso existam. No exemplo = nil (cada elemento da matriz);
MASCARAS = Picture (do clipper @say/get) para formatação do visual dos campos;
ARQUIVO = conteúdo do select() atual, ou seja, o nome do arquivo aberto.
Vou acrescentar ainda a matriz contendo todos os dados completos do arquivo, mas, ainda não consegui pensar como fazer isso de uma forma geral.
No caso do arquivo de produtos, vejam, por obséquio, o conteúdo da matriz PRODUTOS:
Código: Selecionar todos
private DCI10010 := {{{'PRODUTOS',;
'Produtos',;
'&DIR\PRODUTOS.DBF'},;
{'ICI10010',;
'str (CDPRODUTO,13)',;
'&DIR\DCI10010.NTX'},;
{'ICI10700',;
'DSPRODUTO',;
'&DIR\ICI10700.NTX'},;
{'ICI10701',;
'str (CDGRUPO,02) + DSPRODUTO',;
'&DIR\ICI10701.NTX'},;
{'ICI10702',;
'str (CDFORNECE,04) + str (CDGRUPO,02) + DSPRODUTO',;
'&DIR\ICI10702.NTX'}},;
{'CDPRODUTO' ,'N', 13, 0},;
{'DSPRODUTO' ,'C', 40, 0},;
{'DSUNIDADE' ,'C', 2, 0},;
{'CDFORNECE' ,'N', 4, 0},;
{'CD_SECAO' ,'N', 1, 0},;
{'CDGRUPO' ,'N', 2, 0},;
{'VR_UNITAR' ,'N', 10, 4},; // no original era "9,2" 20/2/16w
{'VR_PRECUS' ,'N', 10, 4},; // no original era "9,2" 20/2/16w
{'VP_MARLUC' ,'N', 6, 2},;
{'VR_PREVEN' ,'N', 9, 2},;
{'DT_ULTCOM' ,'D', 8, 0},;
{'DT_ULTVEN' ,'D', 8, 0},;
{'QT_ESTMIN' ,'N', 6, 2},;
{'QT_ESTMAX' ,'N', 6, 2},;
{'QT_ESTTOT' ,'N', 8, 3}}
Bom, agora voltando ao exemplo que o professor postou e, que modifiquei para o meu exemplo, mudei algumas coisas para ficar o mais próximo da minha realidade, mas, a mais drástica delas, foi trocar o formulário de MAIN para MODAL, pois já tenho um MAIN em aberto.
Infelizmente, as mensagens de erros foram muitas, vejam por favor:
Código: Selecionar todos
Harbour 3.2.0dev (r1509031202)
Copyright (c) 1999-2015, http://harbour-project.org/
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(54) Error E0030 Syntax error "syntax error at 'WINDOW'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(72) Error E0030 Syntax error "syntax error at '.T.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(90) Error E0030 Syntax error "syntax error at '.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(157) Error E0030 Syntax error "syntax error at '.F.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(184) Error E0030 Syntax error "syntax error at '.F.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(238) Error E0030 Syntax error "syntax error at '.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(239) Error E0030 Syntax error "syntax error at '.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(240) Error E0030 Syntax error "syntax error at '.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(383) Error E0030 Syntax error "syntax error at '.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(384) Error E0030 Syntax error "syntax error at '.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(385) Error E0030 Syntax error "syntax error at '.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(447) Error E0030 Syntax error "syntax error at '.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(450) Error E0030 Syntax error "syntax error at '.'"
C:\MVinfo\MIGRAR\SiCCA\SiCCA3603hmg\sci10000\rotinas6.prg(452) Error E0030 Syntax error "syntax error at '.'"
14 errors
No code generated.
As linhas acima são as seguintes:
54 (linha) - Esta não está só, pois trata-se de uma linha com (;):
DEFINE WINDOW Frm_BROWSE_GRID AT GetDesktopRealTop(),GetDesktopRealLeft() ;
WIDTH GetDesktopRealWidth() HEIGHT GetDesktopRealHeight() ;
TITLE NOME_PROGRAMA ICON NIL MODAL;
ON INIT Frm_BROWSE_GRID_form_oninit() ON RELEASE Nil ;
ON INTERACTIVECLOSE Frm_BROWSE_GRID_form_oninteractiveclose();
ON MOUSECLICK Nil ON MOUSEDRAG Nil ON MOUSEMOVE Nil ;
ON SIZE Nil ON MAXIMIZE Nil ON MINIMIZE Nil ON PAINT Nil ;
BACKCOLOR Nil ON GOTFOCUS Nil ON LOSTFOCUS Nil
As demais linhas dos erros são:
72 - OPAQUE .T.
90 - ONENTER (If(Frm_BROWSE_GRID.BotaoPesq.Enabled,Frm_BROWSE_GRID_botaopesq(),))
157 - 184 TRANSPARENT .F.
238-240
Frm_BROWSE_GRID.BotaoPesq.Enabled:=.F.
Frm_BROWSE_GRID.Center
Frm_BROWSE_GRID.Activate
383 - 385
Frm_BROWSE_GRID.Grid_Data.Refresh
Frm_BROWSE_GRID.BotaoPesq.Enabled:=.T.
Frm_BROWSE_GRID.GetPesq.SetFocus
447 - Frm_BROWSE_GRID.Grid_Data.Refresh
450 - Frm_BROWSE_GRID.Grid_Data.Value := {dbf->(Recno()),nVal}
452 - Frm_BROWSE_GRID.Grid_Data.SetFocus
Bom, acho que a única linha que sei resolver (acho) é a 450, pois troquei o "alias" dbf pelo nome do meu que é NOME_ARQ, mas, é só acho, não tenho certeza.
Um última informação: Meu sistema ainda é DBFNTX, então, a pesquisa será em torno disso. Não me perguntem "como?", pois não sei.
Portanto, se alguns dos professores puderem nos ajudar a clarear a mente, pois esse universo gráfico, já tinha até desistido (temporariamente) de dezembro/2015 até março/2016, usando a GTWVG. Mas, percebi que em alguns casos não tenho como escapar. É no
caso de um Frente de Loja, sem muitas informações gráficas, fica até difícil de se vender um sistema nesse mercado tão competitivo.