Claudio Soto escreveu:Por favor postear el código de un ejemplo donde se presenta el problema.
Dr. Soto, pra mim é uma honra tê-lo aqui no meu humilde tópico.
Bom, já postei desde o início deste tópico, mas, para não lhe cansar muito vou postar novamente, e aproveito pra acrescentar outras partes do código deste PRG que ainda "euzinho" não tinha julgado como necessário.
Todas as linhas deste PRG foram aproveitadas de outro PRG que faz a mesma coisa em MODO CONSOLE e que usa o ACHOICE pra fazer o que eu quero. Neste caso fiz modificações nas linhas, comentei muitas, e, eliminei outras partes que percebi não serem necessárias. Ah! pelo que entendi o ACHOICE é substituído pelo GRID, e, é isso que preciso que funcione.
Eis as linhas iniciais - não todas pra não ficar muito grande, deste PRG↓:set cursor on
// set delimiters to DELIMITADORES // eliminado temporariamante por usar HMG em modo GUI 7/12/17W
// set delimiters on // eliminado temporariamante por usar HMG em modo GUI 7/12/17W
// set intensity on // eliminado temporariamante por usar HMG em modo GUI 7/12/17W
// set key TECLA_HELP to HELP_CAMPO // modificado pela linha abaixo 7/12/17w
// on key TECLA_HELP of HELP_CAMPO
// TELA_PADRAO (procname (),'Or‡amento FDL GUI',COR_PADRAO) // esta fun‡ao foi desabilitada e tudo ‚ feito em TELA_ENTRADA_GUI() // 6/11/17w
// setcolor (COR_PADRAO) // eliminado temporariamante por usar HMG em modo GUI 7/12/17W
ABERTURA ()
select ('DCI10016')
INICIALIZA_CAMPOS ()
// MsgInfo('Ap¢s ABERTURA() e INICIALIZA_CAMPOS')
ATUALIZA_CONTEUDO_ANTERIOR ()
// do while .not. (FIM)
// INICIALIZA_CAMPOS ()
// TELA_ENTRADA ()
// TELA_ENTRADA_GUI ()
TELA_ENTRADA_GUI (procname (),'Orçamento FDL GUI',COR_PADRAO)
// MsgInfo('Ap¢s TELA_ENTRADA_GUI')
// TRATA_CAMPOS ()
// EXIT // PROVISŸRIO 14/3/16w.
// TRATA_CAMPOS_GUI () // integrei essa fun‡ao ao TELA_ENTRADA_GUI // 6/11/17w
// MsgInfo('Ap¢s TRATA_CAMPOS_GUI')
// if .not. FIM
// PEDE_OPCAO ()
// endif
// enddo
close all
set (_SET_CURSOR,SALVA_CURSOR)
set (_SET_DELIMITERS,SALVA_DELIMITERS)
set (_SET_INTENSITY,SALVA_INTENSITY)
setcolor (SALVA_COR)
restscreen (0,0,maxrow (),maxcol (),SALVA_TELA)
return
Observe-se acima que comentei ("
//" ou com "
/* */" ou com "
**" ou simplesmente "
*") por entender que em 100% GUI não são necessárias.
As linhas abaixo são da função que cria o formulário:static function TELA_ENTRADA_GUI (PROGRAMA,SUB_TITULO,COR,ELEMENTO)
hb_Default(@ELEMENTO, space(1) )
mCD_VENDED := mCDOPERADO
Private fColor := { || if ( This.CellRowIndex/2 == int(This.CellRowIndex/2) , { 0,0,255 } , { 0,255,0 } ) }
mI := 1 // coloquei pra nao dar erro de limite de array 22/11/17w
DEFINE WINDOW Frm_TELA_ENTRADA ;
AT GetDesktopRealTop(),GetDesktopRealLeft() ;
WIDTH GetDesktopRealWidth() HEIGHT GetDesktopRealHeight() ;
TITLE PROGRAMA + SPACE (7) + SUB_TITULO ;
CHILD ;
ON INTERACTIVECLOSE CONFIRMA4 ('Deseja Cancelar sem Concluir', 6 ,'SiCCA v3.6.04 - Orçamento') // para confirmação
// TITLE 'Or‡amento FDL GUI' ;
// AT 0,0 ;
// WIDTH 800 ;
// HEIGHT 600 ;
// VIRTUAL WIDTH 1300 ;
// VIRTUAL HEIGHT 800 ;
@ 410 , 20 LABEL Label_0 ; // t¡tulo sub-total
VALUE 'SUBTOTAL' ;
AUTOSIZE // ;
@ 495 , 100 LABEL Label_0A ; // Informe o produto para o usu rio digitar
VALUE 'Informe o Produto...' ;
FONTCOLOR { 255, 0, 0 } ;
FONT "Arial" SIZE 24 BOLD ;
AUTOSIZE // ;
@ 250 , 460 LABEL Label_0B ; // nome da MVinfo
VALUE 'MVinfo Sistemas' ;
FONTCOLOR { 255, 0, 0 } ;
FONT "Arial" SIZE 24 BOLD ;
AUTOSIZE // ;
@ 290 , 460 LABEL Label_0C ; // telefone da MVinfo
VALUE 'Fone(31) xxxx-xxxx' ;
AUTOSIZE // ;
// @ 310 , 460 LABEL Label_0D ;
// VALUE 'www.mvinfo.wmx.net.br' ;
// AUTOSIZE // ;
@ 10 , 10 LABEL Label_1 ; // nome do operador do computador/sistema
VALUE 'Operador : ' + transform ( mCDOPERADO , pCDOPERADO ) ;
AUTOSIZE // ;
@ 10 , 150 LABEL Label_2 ; // nome do vendedor
VALUE 'Vendedor : ' + strzero( mCD_VENDED ) ;
AUTOSIZE // ;
@ 10 , 300 LABEL Label_3 ; // no or‡amento anterior
AUTOSIZE ;
VALUE HB_AnsiToOem('Orçamento Anterior : ') + transform ( aNU_VENDA , pNU_VENDA ) // ;
@ 10 , 600 LABEL Label_4 ; // data do or‡amento
AUTOSIZE ;
VALUE HB_AnsiToOem('Data do Orçamento: ') + transform ( mDT_VENDA , pDT_VENDA ) // ;
@ 375, 479 LABEL Label_5 ; // aqui vai o nome do produto mNMPRODUTO 6/11/17w
VALUE '';
FONTCOLOR { 255, 200, 100 } ;
AUTOSIZE // ;
/*FONT "Arial" SIZE 14 BOLD ;*/
@ 375, 670 LABEL Label_6 ; // aqui vai o valor unit rio do produto mVRPRODUTO 6/11/17w
VALUE '';
FONTCOLOR { 255, 100, 200 } ;
AUTOSIZE // ;
/*FONT "Arial" SIZE 14 BOLD ;*/
@ 325, 479 LABEL Label_7 ; // c¢digo do produto
AUTOSIZE ;
VALUE HB_AnsiToOem('Código do Produto') // acrescentado para informar ao usu rio que ‚ pra digitar o CàDIGO do produto
@ 325, 700 LABEL Label_8 ; // quantidade do produto a ser lan‡ado na nota
AUTOSIZE ;
VALUE 'Quant' // acrescentado para informar ao usu rio que ‚ pra digitar o CàDIGO do produto
@ 342 , 650 LABEL Label_11 ; // "x" que representa a multiplica‡ao do produto
VALUE 'X' ;
FONTCOLOR { 255, 0, 0 } ;
FONT "Arial" SIZE 24 BOLD ;
AUTOSIZE // ;
@ 430 , 20 LABEL Label_12 ; // para usar com mVT_MERCAD 14/11/17w
VALUE '' ;
FONT "Arial" SIZE 14 BOLD ;
AUTOSIZE
@ 450 , 20 LABEL LABEL_13 ; // para usar com mVR_DESCON 14/11/17w
AUTOSIZE ;
FONT "Arial" SIZE 14 BOLD ;
VALUE ''
@ 470 , 20 LABEL LABEL_14 ; // para usar com mVT_VENDA 14/11/17w
AUTOSIZE ;
FONT "Arial" SIZE 14 BOLD ;
VALUE ''
define GRID grid_1
row 50
col 08
WIDTH 440
HEIGHT 350
HEADERS {HB_AnsiToOem('Código'),HB_AnsiToOem('Descrição do Produto'),'Gr','Qte','Vr.Unit.','Total'} // codigo=numeric | descri‡ao=textbox | gr=textbox | qte=numeric | vr.unit=numeric | total=numeric
WIDTHS {100,240,30,50,100,120}
ColumnCONTROLS { {'TEXTBOX','NUMERIC', '999999999999'} , 'TEXTBOX' , 'TEXTBOX' , 'TEXTBOX' , 'TEXTBOX' , 'TEXTBOX' }
DYNAMICFORECOLOR { fColor , fColor , fColor , fColor , fColor , fColor }
// VIRTUAL .t.
// ITEMCOUNT 1
// lines .f.
// cellnavigation .t.
// EDITOPTION GRID_EDIT_DEFAULT
// allowedit .t.
end GRID
// EDIT
@ 345 , 470 TEXTBOX txtCDPRODUTO WIDTH 150 HEIGHT 30 FONTCOLOR BLUE BOLD NUMERIC MAXLENGTH 13 FONT "Arial" SIZE 14 ON ENTER { || fCDPRODUTO_GUI () } // INPUTMASK '9999999999999' FORMAT 'E' PARENT Frm_TELA_ENTRADA
@ 345 , 700 TEXTBOX txtQT_VENDA PARENT Frm_TELA_ENTRADA WIDTH 50 HEIGHT 30 FONTCOLOR BLUE BOLD NUMERIC MAXLENGTH 07 FONT "Arial" SIZE 16 ON ENTER { || fQT_VENDA_GUI () } // INPUTMASK pQT_VENDA FORMAT 'E'
// MsgInfo('dentro do CAD_PRODUTOS_GUI() ap¢s do textbox txtQT_VENDA')
DEFINE STATUSBAR PARENT Frm_TELA_ENTRADA
STATUSITEM " MVinfo Sistemas e Automação - www.mvinfo.wmx.net.br | microvolution@hotmail.com | (31) xxxx-xxxx "
STATUSITEM "clock"
END STATUSBAR
DEFINE TIMER tempo PARENT Frm_TELA_ENTRADA ;
INTERVAL 1000 ;
ACTION ShowTime()
// OPCOES_CAMPOS () // eliminado temporariamante por usar HMG em modo GUI 7/12/17W
// TRATA_DADOS_GUI () // substitu¡ para CAD_PRODUTOS_GUI 7/11/17w
// MsgInfo('antes do CAD_PRODUTOS_GUI()') // linha tempor ria 10/11/17w
// CAD_PRODUTOS_GUI()
END WINDOW
Frm_TELA_ENTRADA.txtCDPRODUTO.SetFocus
CENTER WINDOW Frm_TELA_ENTRADA
ACTIVATE WINDOW Frm_TELA_ENTRADA
******** FORMUL†RIO PADRŽO DO WINDOWS PARA HARBOUR 5/3/15W ***********************************
**********************************************************************************************
return
Dr. Soto, esta é a tela do formulário criado e sem nenhum lançamento↓:
- GRID sem nenhum lançamento ainda
Agora a tela abaixo já é no momento em que digito o código do primeiro produto - no caso código
17 pressionado já o
ENTER e digitado a quantidade -
UMA no caso, e, só esperando o
ENTER pra ser enviado o produto para o
GRID↓:
- GRID ainda sem nenhuma informação... mas após o ENTER as informações do produto digitado serão lançadas nele
A próxima tela já mostra o produto transferido para o GRID após o ENTER ↓:
- GRID já com o produto lançado nele
Agora a tela abaixo é exatamente no momento de se clicar com o botão esquerdo (isso mesmo), segurar e arrastar a barra de rolagem pra gente ver mais detalhes do produto. De madrugada, cheguei a pensar que só acontecia após o lançamento do
segundo produto, mas, não, já a partir do primeiro produto, o, GRID some o que já foi lançado e trava o FORMULÁRIO (não por completo, mas, os TEXTBOXs param de funcionar, etc) ↓:
- GRID travado e os dados somem - não importa quantos já tenham sido lançados, todos somem dele
Agora, o código abaixo, pertence à função que trata o TEXTBOX de digitação do CÓDIGO DO PRODUTO↓:static function fCDPRODUTO_GUI ()
local ARQUIVO := select ()
mCDPRODUTO := Frm_TELA_ENTRADA.txtCDPRODUTO.value // mudei para o final da fun‡ao 22/11/17w
if empty(Frm_TELA_ENTRADA.txtCDPRODUTO.value)
MsgExclamation ('Preenchimento obrigat¢rio','Or‡amento FDL GUI - SiCCA v3.6.04')
CONSULTA_ARQUIVO ('','','MCDPRODUTO')
select (ARQUIVO)
return (.f.)
endif
if Frm_TELA_ENTRADA.txtCDPRODUTO.value < 1 .or. Frm_TELA_ENTRADA.txtCDPRODUTO.value > 9999999999999
MsgInfo ('C¢digo do Produto deve estar entre 1 e 9999999999999 inclusive','Or‡amento FDL GUI - SiCCA v3.6.04') // era 3.6.03 em 31/5/16w
select (ARQUIVO)
return (.f.)
endif
select ('DCI10010')
if .not. EXISTE (str (mCDPRODUTO,13))
MsgExclamation ('C¢digo do Produto n„o cadastrado','Or‡amento FDL GUI - SiCCA v3.6.04') // era 3.6.03 em 31/5/16w
CONSULTA_ARQUIVO ('','','MCDPRODUTO')
select (ARQUIVO)
return (.f.)
endif
mDSPRODUTO := left (DSPRODUTO,32) // Modificado p/Walcledson em 09/05/01 p/func. mt, cm, kg, etc.
mVR_UNITAR := VR_PREVEN*(1+(mVR_PERJUR/100))
Frm_TELA_ENTRADA.Label_5.value := mDSPRODUTO
mCD_GRADE := DSUNIDADE // Acrescentado em 27/1/3w para puchar uma grade b sica na venda.
keyboard chr(13)
select (ARQUIVO)
mLINHA[mI,01] := mCDPRODUTO
mLINHA[mI,02] := mDSPRODUTO
mLINHA[mI,03] := mCD_GRADE
Frm_TELA_ENTRADA.txtQT_VENDA.Enabled := .t.
Frm_TELA_ENTRADA.txtQT_VENDA.SetFocus
return (SAIDA_VALIDA ())
Já as linhas abaixo são da função que trata da quantidade de produto na venda ↓:static function fQT_VENDA_GUI ()
select ('DCI10016')
if mQT_ESTOQ2 = nil
mQT_ESTOQ2 := DCI10014->QT_ESTTOT // Esta linha busca do estoque da grade atual. 28/9/2w
endif
mQT_VENDA := Frm_TELA_ENTRADA.txtQT_VENDA.value // mudei para o final da linha 22/11/17w
ON KEY F6 OF Frm_TELA_ENTRADA ACTION ALT_QUANT_ESTOQUE_GUI()
if Frm_TELA_ENTRADA.txtQT_VENDA.value < 0.001 .or. Frm_TELA_ENTRADA.txtQT_VENDA.value > 999.999
MsgInfo ('Quantidade deve estar entre 0.001 e 999.999 inclusive','Or‡amento FDL GUI - SiCCA v3.6.04') // era 3.6.03 em 31/5/16w
return (.f.)
endif
if Frm_TELA_ENTRADA.txtQT_VENDA.value > 0 .and. Frm_TELA_ENTRADA.txtQT_VENDA.value > mQT_ESTOQ2
MsgInfo ('Quantidade de venda n„o pode ser maior que quantidade em estoque!...','Or‡amento FDL GUI - SiCCA v3.6.04') // era 3.6.03 em 31/5/16w
return (.f.)
endif
set key K_F6 to
// release key K_F6 on Frm_TELA_ENTRADA
release mQT_ESTOQ2
mLINHA[mI,04] := mQT_VENDA
mLINHA[mI,05] := mVR_UNITAR
mLINHA[mI,06] := mLINHA[mI,05] * mLINHA[mI,04] // vr.unit rio x qt 22/11/17w
Frm_TELA_ENTRADA.Label_6.value := mVR_UNITAR
Frm_TELA_ENTRADA.txtCDPRODUTO.Value := 0
Frm_TELA_ENTRADA.txtQT_VENDA.Enabled := .f.
Frm_TELA_ENTRADA.txtCDPRODUTO.Enabled := .t.
Frm_TELA_ENTRADA.txtCDPRODUTO.SetFocus
Frm_TELA_ENTRADA.Grid_1.AddItem ( { mLINHA[mI,01] , mLINHA[mI,02] , mLINHA[mI,03], mLINHA[mI,04], mLINHA[mI,05], mLINHA[mI,06] } ) mI += 1 // total de produtos na venda/or‡amento 22/11/17w
keyboard K_ENTER
return (SAIDA_VALIDA ())
Bom, pelo pouco que entendi desse processo do GRID, a única coisa que faz em RUN-TIME para que os produtos aparecem nele é a única linha que está na função fQT_VENDA_GUI acima, que re-escrevo-a aqui pra sua apreciação:
Frm_TELA_ENTRADA.Grid_1.AddItem ( { mLINHA[mI,01] , mLINHA[mI,02] , mLINHA[mI,03], mLINHA[mI,04], mLINHA[mI,05], mLINHA[mI,06] } ) mI += 1 // total de produtos na venda/or‡amento 22/11/17w
Minhas observações que tenho a fazer:
1 - talvez está dando pau, pois, não sei como reagir ao modo GUI que é 100% controlado por EVENTOS - e isso ainda não entrou em minha mente, pois a gente que veio de CLIPPER fica sempre esperando um ENTER, ou ESC ou F1-F12 pra que o processador execute alguma tarefa;
2 - talvez o GRID não seja a solução que eu preciso para substituir o ACHOICE;
3 - talvez a maneira com que a ARRAY mLINHA[X,X] seja a causadora do problema;
4 - talvez as linhas que chamam funções na linguem"C" bem no início é que estão causando a "pane" ou "bug" no GRID, as quais coloco-as abaixo para sua apreciação:
**************************************************************************************************************
** linhas abaixo acrescentadas para funcionar corretamente os BOXES PANEL/BOX 18/6/15w
#xcommand DRAW PANEL IN WINDOW <parent> ;
AT <frow>,<fcol> ;
TO <trow>,<tcol> ;
=>;
DrawWindowBoxRaised( <"parent">, <frow>, <fcol>, <trow>, <tcol> )
#xcommand DRAW BOX IN WINDOW <parent> ;
AT <frow>,<fcol> ;
TO <trow>,<tcol> ;
=>;
DrawWindowBoxIn( <"parent">, <frow>, <fcol>, <trow>, <tcol> )
** linhas acima acrescentadas para funcionar corretamente os BOXES PANEL/BOX 18/6/15w
**************************************************************************************************************
Agora, tirando o GRID, tenho outras observações no geral a fazer que ainda não sei resolver:
1 - o INTERACTIVEONCLOSE do formulário↓:
ON INTERACTIVECLOSE CONFIRMA4 ('Deseja Cancelar sem Concluir', 6 ,'SiCCA v3.6.04 - Orçamento') // para confirmação
até pede confirmação, mas, não aparece em primeiro plano - fica escondido atrás do formulário, sendo necessário um ALT+TAB pra que ele venha para a frente;
2 - Comentei diversas linhas pertencentes à criação do GRID (do exemplo que peguei na pasta SAMPLES), por não entender bem o que elas fazem ↓:
// VIRTUAL .t.
// ITEMCOUNT 1
// lines .f.
// cellnavigation .t.
// EDITOPTION GRID_EDIT_DEFAULT
// allowedit .t.
3 - observer-se que no TEXTBOX também comentei algumas funções pois não sei porque está dando erro de sintaxe ↓:
@ 345 , 470 TEXTBOX txtCDPRODUTO WIDTH 150 HEIGHT 30 FONTCOLOR BLUE BOLD NUMERIC MAXLENGTH 13 FONT "Arial" SIZE 14 ON ENTER { || fCDPRODUTO_GUI () } // INPUTMASK '9999999999999' FORMAT 'E' PARENT Frm_TELA_ENTRADA
no caso acima, são o
INPUTMASK, o
FORMAT e o
PARENT. Já tentei de tudo, mas, eles não dão certo.
4 - Ao final da criação do WINDOW com o END WINDOW e antes do CENTER/ACTIVATE WINDOW, coloco a linha onde dá direciona o SETFOCUS ↓:
END WINDOW
[b] Frm_TELA_ENTRADA.txtCDPRODUTO.SetFocus[/b]
CENTER WINDOW Frm_TELA_ENTRADA
ACTIVATE WINDOW Frm_TELA_ENTRADA
5 - se eu movimentar o mouse (ponteiro) por toda a tela, apresenta o seguinte erro na linha 4013:
ERROR BASE/1070 Erro nos Parâmetros: ==Veja a tela do erro, por favor:
- erro de RUN-TIME
A linha 4013, contém apenas:
ACTIVATE WINDOW Frm_TELA_ENTRADA
6 - Talvez seja este o causador do problema. Um loop de ATIVAÇÃO do
WINDOW Frm_TELA_ENTRADA que não sei donde vem. Só sei que nem sempre ele aparece. Mas, quando aparece é pelo movimento do ponteiro do mouse nalguma parte do WINDOW Frm_TELA_ENTRADA.
Bom, voltando ao GRID, pra facilitar o entendimento da array/matriz mLINHA[X,X] explico-a com mais detalhes:
- ela é no formato n,6 elementos (onde "n" é limitado ao máixmo de 16), representando a quantidade máxima de produtos na venda. Neste caso, 16 produtos. Já o segundo parâmetro dela, são os itens do produto, que são:
- mLINHA[n,01] := "armazena o CÓDIGO DO PRODUTO. No nosso exemplo aqui =
17"
- mLINHA[n,02] := "armazena o NOME DO PRODUTO. No nosso exemplo =
KIT EMBREAGEM- mLINHA[n,03] := "armazena a GRADE - exemplo:
UN, PC, PT etc
- mLINHA[n,04] := "quantidade de itens do produto lançado
- mLINHA[n,05] := "valor unitário do produto - preço de venda"
- mLINHA[n,06] := mLINHA[n,05] * mLINHA[n,04] = "valor total deste produto: VALOR DELE X QUANTIDADE"
Bom, espero que não lhe tenha cansado muito, mas, que o Sr. Dr. Soto, ou demais colegas, possam me dar uma luz no "fim do túnel" e euzinho saia deste problemão de uma coisa que parece ser tão simples.
Meu comentário final!!!
Talvez por ser simples e por estar acostumado com PROCEDURES esperando alguma coisa do TECLADO é que seja a chave pra abrir a porta e ver a luz no fim do túnel.