Página 2 de 3

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 09:28
por Pablo César
Paulo_CPV escreveu:se você tiver alguma ideia de como resolver o meu problema, desde já agradeço a sua atenção.
Ué o meu segundo exemplo, não serviu ei ??? Você não viu ainda ??? Veja o anexo.

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 10:14
por Paulo_CPV
Bom dia!
Pablo, me desculpe já estou testando o seu exemplo e quando eu tiver uma resposta sobre a rotina te respondo.

[]'s
Paulo - Jacareí/SP

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 14:58
por Paulo_CPV
Boa tarde!

Pablo, fiz umas modificações em seu código, mas não estou identificando o por que do erro:

Date: 03/08/13 Time: 13:16:09
Error BASE/1068 Argument error: array access

Called from SOMAREGISTRO(115)
Called from GRIDCHANGE(110)
Called from (b)MAIN(76)
Called from _DOCONTROLEVENTPROCEDURE(1582)
Called from EVENTS(2570)
Called from LISTVIEW_SETCURSEL(0)
Called from _SETVALUE(500)
Called from SETPROPERTY(3653)
Called from ADIITEM(140)
Called from (b)MAIN(62)
Called from _DOCONTROLEVENTPROCEDURE(1582)
Called from EVENTS(1939)
Called from _DOMESSAGELOOP(0)
Called from _ACTIVATEWINDOW(1307)
Called from MAIN(107)

A rotina é a seguinte:

Código: Selecionar todos

#include "minigui.ch"


Function Main()

LOCAL aRows

DEFINE WINDOW Form_1 ; 
AT 126,66 WIDTH 271 HEIGHT 410 ; 
TITLE 'Teste de Função' ; 
ICON '' ; 
NOMAXIMIZE ;
NOSIZE ;
MAIN ;
BACKCOLOR {236,233,216} ; 
FONT 'Arial' SIZE 10 ;

ON KEY ESCAPE ACTION Form_1.Release
aRows:={{0,0,0}}

@ 21,11 FRAME frame_1 ; 
CAPTION "Ano / Mês / Ano" ; 
WIDTH 116 ; 
HEIGHT 52 ; 
OPAQUE  ; 

Form_1.frame_1.fontbold:=.T.
Form_1.frame_1.fontcolor:={  0,  0,  0}
Form_1.frame_1.backcolor:={236,233,216}
Form_1.frame_1.fontname:='Arial'
Form_1.frame_1.fontsize:=  9

@ 40,20 TEXTBOX Text_ano ; 
HEIGHT 24 ; 
WIDTH 25 ; 
Font 'Arial' ; 
size 10 ; 
MAXLENGTH 2 ; 

Form_1.Text_ano.fontbold:=.T.
Form_1.Text_ano.fontcolor:={  0,  0,  0}
Form_1.Text_ano.backcolor:={255,255,255}

@ 40,56 TEXTBOX Text_mes ; 
HEIGHT 24 ; 
WIDTH 25 ; 
Font 'Arial' ; 
size 10 ; 
MAXLENGTH 2 ; 

Form_1.Text_mes.fontbold:=.T.
Form_1.Text_mes.fontcolor:={  0,  0,  0}
Form_1.Text_mes.backcolor:={255,255,255}

@ 40,94 TEXTBOX Text_dia ; 
HEIGHT 24 ; 
WIDTH 25 ; 
Font 'Arial' ; 
size 10 ; 
MAXLENGTH 2 ;
ON ENTER {|| AdiItem()} ; 

Form_1.Text_dia.fontbold:=.T.
Form_1.Text_dia.fontcolor:={  0,  0,  0}
Form_1.Text_dia.backcolor:={255,255,255}

@ 85,9 GRID grid_1 ;
WIDTH 240 ;
HEIGHT 120 ; 
HEADERS {'Ano','Mês','Ano'} ; 
WIDTHS  {60,60,60} ;
ITEMS aRows ;
FONT 'Arial' ;
SIZE 10 ;
ON CHANGE GridChange(This.Value) ;

Form_1.grid_1.fontcolor:={0,0,0}
Form_1.grid_1.backcolor:={255,255,255}

@ 231,9 FRAME frame_2 ; 
CAPTION "Total" ; 
WIDTH 239 ; 
HEIGHT 52 ; 
OPAQUE  ; 

Form_1.frame_2.fontbold:=.T.
Form_1.frame_2.fontcolor:={  0,  0,  0}
Form_1.frame_2.backcolor:={236,233,216}
Form_1.frame_2.fontname:='Arial'
Form_1.frame_2.fontsize:=  9

@ 249,19 LABEL label_1 ; 
WIDTH 150 ; 
HEIGHT 24 ; 
FONT 'Arial' ; 
SIZE 10 ;
BACKCOLOR {236,233,216} ; 
BOLD ;
CENTERALIGN  ;

Form_1.label_1.fontbold:=.T.
Form_1.label_1.fontcolor:={  0,  0,  0}

END WINDOW

CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
*********************************************************************
Function GridChange(aRec)
   Form_1.label_1.Value := PadC(SomaRegistro(aRec),54)
Return Nil
*********************************************************************
Function SomaRegistro(aRec)
Local nCount1, nCount2, cRet, nFim:=Form_1.Grid_1.ItemCount
Local aRet:={0,0,0}, nRec:=aRec[1], aTupla, aSoma:={0,0,0}, nSobra

For nCount=1 To nFim
    aTupla:=Form_1.Grid_1.Item( nCount )
    For nCount2=1 To 3
        aSoma[nCount2]:=aSoma[nCount2]+aTupla[nCount2]
    Next
Next
aRet[3] := Int( (( aSoma[3] / 30 ) - Int( aSoma[3] / 30 )) * 30 )
nSobra  := Int( aSoma[3] / 30 )

aRet[2] := Int((((aSoma[2] + nSobra) / 12 ) - Int( (aSoma[2] + nSobra) / 12 )) * 12 )
nSobra  := Int( ((aSoma[2] + nSobra) / 12 ) )

aRet[1] := aSoma[1]+nSobra

cRet:=hb_ValToExp(aRet[1])+" Anos / "+hb_ValToExp(aRet[2])+" Meses / "+hb_ValToExp(aRet[3])+" Dias"
Form_1.Grid_1.SetFocus

Return cRet
*********************************************************************
Function AdiItem()
Local nFim
Form_1.Grid_1.AddItem({0,0,0})
nFim:=Form_1.Grid_1.ItemCount
SetProperty("Form_1","Grid_1","Value",{nFim,1})
Form_1.Grid_1.SetFocus
Return Nil
*********************************************************************
Function DelItem(aRec)
Local nFim, nRec:=aRec[1]

Form_1.Grid_1.DeleteItem(nRec)
nFim:=Form_1.Grid_1.ItemCount
SetProperty("Form_1","Grid_1","Value",{If(nRec>nFim,nFim,nRec),1})
Form_1.Grid_1.SetFocus
Return Nil
Estarei esperando uma resposta sua para me dizer o que é que eu estou errando.

[]'s
Paulo - Jacareí/SP

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 18:20
por Pablo César
Eu estou usando HMG e não Minigui. Pelo que pude ver sobre o seu include no inicio do programa, você estaria tentando compilar com Minigui, se você é novato com Minigui/Hmg, faça em HMG mesmo (muito mais prático). Eu carreguei aqui na IDE da HMG e compilei sem erro algum. E esta é a tela:
Tela82.PNG
Seria assim mesmo Ano / Mes /Ano ??

Pelo que parece não é exatamente o que eu e nem o Alexandre estávamos presumindo qual era a sua questão. Eis uma terceira versão... OMG !!!!

Se tivesse começado a fazer e postado o seu código desde um início, tudo seria muito mais prático...

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 18:55
por alxsts
Olá!

Isso é tão comum...

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 20:32
por Paulo_CPV
Boa noite!

Pablo, você poderia me disponibilizar o fonte deste último exemplo, desde já agradeço a sua ajuda que você me esta dando para o desenvolvimento desta minha rotina.

[]'s
Paulo - Jacareí/SP

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 20:39
por Pablo César
Você não respondeu a minha pergunta: Seria assim mesmo Ano / Mes /Ano ?? e também sobre qual lib gráfica está usando Minigui ou HMG ?
Paulo_CPV escreveu:você poderia me disponibilizar o fonte deste último exemplo
Paulo, o que apresenta na tela é o mesmíssimo código que você postou... o que eu fiz foi compilar com HMG.

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 20:47
por Paulo_CPV
Pablo é assim que eu quero, estou utilizando a Minigui Extend 2.20.

[]'s
Paulo - Jacareí/SP

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 20:51
por Paulo_CPV
Ah! Pablo, a fonte que eu digo é da última imagem que você postou.

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 20:55
por Pablo César
Paulo_CPV escreveu:é assim que eu quero
Então você tinha mencionado errado ?
Gostaria de uma ajuda de vocês para resolver o meu problema. É o seguinte eu
tenho um TEXTBOX que o usuário entra com o seguinte dado: 00 00 00 (estes dadps
são anos meses e dias separados por espaço)
Ah! Pablo, a fonte que eu digo é da última imagem que você postou.
Você não entendeu ? A ultima imagem que postei corresponde ao mesmíssimo código fonte que você chegou a postar. Sem erro de compilação, Só falta implementar e na minha opinião ainda não está claro pois seria ANO / MES / DIA e você colocou ANO / MES / ANO ainda perguntei e você diz que é assim que quer ?

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 20:59
por Pablo César
Outra coisa... você diz que deu erro:
Date: 03/08/13 Time: 13:16:09
Error BASE/1068 Argument error: array access

Called from SOMAREGISTRO(115)
Você esqueceu de mencionar qual seria a linha 115. Aqui pelo que mostra a tela essa linha está vazia...

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 21:18
por Paulo_CPV
Pablo, a linha certa é a de 114...
Pablo na sua mensagem escreveu:É assim que você deveria complementar, mencionando a linha toda:
Local aRet:={0,0,0}, nRec:=aRec[1], aTupla, aSoma:={0,0,0}, nSobra

Aqui não há erro nenhum !

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 21:43
por Pablo César
Já vi que comunicação não é o nosso forte... agora percebi o erro. O erro não é de compilação e sim de execução (RunTime) quando clica no grid. Eu ainda não entendi o por quê você insiste com os TEXTBOXes... Pois bem, você criou um novo grid com @ GRID... e acabou esquecendo um detalhe importante. Se você não declara o CELLNAVIGATION o grid irá assumir como Standard, isto é, o This.Value desse GRID irá vir como Numerico (Linha Selecionada) e com CELLNAVIGATION irá ter o valor de Vetor Numerico (Linha e coluna selecionada). Entendeu o erro ? Então você precisa colocar no seu GRID antes do "ON CHANGE" coloque CELLNAVIGATION ;
Só que mesmo assim está apresentando outro erro por causa da implementação inadequada do inserir dados no GRID. Na minha opinião, ao lado desse TEXTBOXes você deveria colocar um botão para adicionar no GRID os valores desses TEXTBOXes. Mas não da forma que eu tinha feito, pois essa forma servia só para adicionar registros no próprio GRID.

Posso te perguntar ? O por quê não gostou do Grid que apresentei por ultimo ??? Acho inviável o adicionar registro pelo item de menu ? Se for isso, bastaria colocar um botão logo embaixo do grid para fazer a mesma função.

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 22:34
por Paulo_CPV
Pablo, mais uma vez muito obrigado pelas suas dicas e ajuda para resolver o meu problema, o por que da colocação dos TEXTBOX é para dar uma maior agilidade para o usuário, pois quanto mais fácil a entrada de dados para o usuário será melhor, mas vou adotar o segundo exemplo e depois veremos o que vamos fazer.

[]'s
Paulo - Jacareí/SP

Ajuda sobre total de matrizes (ARRAY)

Enviado: 08 Mar 2013 23:10
por Pablo César
Espero que desta vez tenha acertado. Mas confesso que foi difícil a comunicação. Pois não tem nada melhor do que apresentar o código fonte questionando algum erro ou dúvidas, porque é fundamental para o melhor desempenho da ajuda e do resultado final. Por esse motivo, exigirei o código fonte ou em formato de exemplo. Senão temos que virar adivinhos... (eita canseira que você me deu... rs)

Código: Selecionar todos

#include <hmg.ch>

Function Main()
LOCAL aRows

DEFINE WINDOW Form_1 ; 
	AT 126,66 WIDTH 271 HEIGHT 410 ; 
	TITLE 'Teste de Função' ; 
	ICON '' ; 
	NOMAXIMIZE ;
	NOSIZE ;
	MAIN ;
	BACKCOLOR {236,233,216} ; 
	FONT 'Arial' SIZE 10

	ON KEY ESCAPE ACTION Form_1.Release
	aRows:={{0,0,0}}

	@ 21,11 FRAME frame_1 ; 
		CAPTION "Ano / Mês / Ano" ; 
		WIDTH 116 ; 
		HEIGHT 52 ; 
		OPAQUE

	Form_1.frame_1.fontbold:=.T.
	Form_1.frame_1.fontcolor:={  0,  0,  0}
	Form_1.frame_1.backcolor:={236,233,216}
	Form_1.frame_1.fontname:='Arial'
	Form_1.frame_1.fontsize:=  9

	@ 40,20 TEXTBOX Text_ano ; 
		HEIGHT 24 ; 
		WIDTH 25 ; 
		Font 'Arial' ; 
		BOLD ;
		size 10 ; 
		MAXLENGTH 2 ;
		ON ENTER {||Keybd_TAB()}

	// Form_1.Text_ano.fontbold:=.T.
	// Form_1.Text_ano.fontcolor:={  0,  0,  0}
	// Form_1.Text_ano.backcolor:={255,255,255}

	@ 40,56 TEXTBOX Text_mes ; 
		HEIGHT 24 ; 
		WIDTH 25 ; 
		Font 'Arial' ; 
		size 10 ; 
		BOLD ;
		MAXLENGTH 2 ;
		ON ENTER {||Keybd_TAB()}

	// Form_1.Text_mes.fontbold:=.T.
	// Form_1.Text_mes.fontcolor:={  0,  0,  0}
	// Form_1.Text_mes.backcolor:={255,255,255}

	@ 40,94 TEXTBOX Text_dia ; 
		HEIGHT 24 ; 
		WIDTH 25 ; 
		Font 'Arial' ;
		BOLD ;
		size 10 ; 
		MAXLENGTH 2 ;
		ON ENTER {|| AdiItem((Form_1.Text_ano.Value),Val(Form_1.Text_mes.Value),Val(Form_1.Text_dia.Value)),InputAtGrid()}

	// Form_1.Text_dia.fontbold:=.T.
	// Form_1.Text_dia.fontcolor:={  0,  0,  0}
	// Form_1.Text_dia.backcolor:={255,255,255}

	@ 85,9 GRID grid_1 ;
		WIDTH 240 ;
		HEIGHT 120 ; 
		HEADERS {'Ano','Mês','Ano'} ; 
		WIDTHS  {60,60,60} ;
		ITEMS aRows ;
		FONT 'Arial' ;
		SIZE 10 ;
		EDIT ;
		CELLNAVIGATION ;
		COLUMNCONTROLS { {'TEXTBOX','NUMERIC','999'} , {'TEXTBOX','NUMERIC','999'} , {'TEXTBOX','NUMERIC','999'} } 
		// ON CHANGE GridChange(This.Value)

	// Form_1.grid_1.fontcolor:={0,0,0}
	// Form_1.grid_1.backcolor:={255,255,255}

	@ 231,9 FRAME frame_2 ; 
		CAPTION "Total" ; 
		WIDTH 239 ; 
		HEIGHT 52 ; 
		OPAQUE

	Form_1.frame_2.fontbold:=.T.
	Form_1.frame_2.fontcolor:={  0,  0,  0}
	Form_1.frame_2.backcolor:={236,233,216}
	Form_1.frame_2.fontname:='Arial'
	Form_1.frame_2.fontsize:=  9

	@ 249,19 LABEL label_1 ; 
		WIDTH 220 ; 
		HEIGHT 24 ; 
		FONT 'Arial' ; 
		SIZE 10 ;
		FONTCOLOR {204,0,0} ;
		BACKCOLOR {236,233,216} ;
		BOLD ;
		CENTERALIGN

	// Form_1.label_1.fontbold:=.T.
	// Form_1.label_1.fontcolor:={  0,  0,  0}  

END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1

*********************************************************************
Function InPutAtGrid()
Form_1.label_1.Value := SomaRegistro()
Return Nil
*********************************************************************
Function SomaRegistro()
Local nCount1, nCount2, cRet, nFim:=Form_1.Grid_1.ItemCount
Local aRet:={0,0,0}, aTupla, aSoma:={0,0,0}, nSobra

For nCount1=1 To nFim
    aTupla:=Form_1.Grid_1.Item( nCount1 )
    For nCount2=1 To 3
        aSoma[nCount2]:=aSoma[nCount2]+aTupla[nCount2]
    Next
Next
aRet[3] := Int( (( aSoma[3] / 30 ) - Int( aSoma[3] / 30 )) * 30 )
nSobra  := Int( aSoma[3] / 30 )

aRet[2] := Int((((aSoma[2] + nSobra) / 12 ) - Int( (aSoma[2] + nSobra) / 12 )) * 12 )
nSobra  := Int( ((aSoma[2] + nSobra) / 12 ) )

aRet[1] := aSoma[1]+nSobra

cRet:=hb_ValToExp(aRet[1])+" Anos / "+hb_ValToExp(aRet[2])+" Meses / "+hb_ValToExp(aRet[3])+" Dias"
Form_1.Text_ano.SetFocus
Return cRet
*********************************************************************
Function AdiItem(a,m,d)
Local nFim

nFim:=Form_1.Grid_1.ItemCount
aTupla:=Form_1.Grid_1.Item( nFim )
If aTupla[1]=0 .and. aTupla[2]=0 .and. aTupla[3]=0
   Form_1.Grid_1.DeleteItem(nFim)
EnDif
Form_1.Grid_1.AddItem({a,m,d})
nFim:=Form_1.Grid_1.ItemCount
SetProperty("Form_1","Grid_1","Value",{nFim,1})
// Form_1.Text_ano.SetFocus
Return Nil
*********************************************************************
Function DelItem(aRec)
Local nFim, nRec:=aRec[1]

Form_1.Grid_1.DeleteItem(nRec)
nFim:=Form_1.Grid_1.ItemCount
SetProperty("Form_1","Grid_1","Value",{If(nRec>nFim,nFim,nRec),1})
// Form_1.Text_ano.SetFocus
Return Nil

#pragma BEGINDUMP

#include <windows.h>
#include "hbapi.h"

HB_FUNC( KEYBD_TAB )
{
	keybd_event(
		VK_TAB,	// virtual-key code
		0,		// hardware scan code
		0,		// flags specifying various function options
		0		// additional data associated with keystroke
	);
}

#pragma ENDDUMP
Espero eu agora ter acertado de vez.
Tela83.PNG
Paulo_CPV escreveu:o por que da colocação dos TEXTBOX é para dar uma maior agilidade para o usuário, pois quanto mais fácil a entrada de dados para o usuário será melhor
Gostei da sua resposta, apesar de que podia ter feito apenas um botão para adicionar os dados ou até mesmo definindo a tecla de setinha pra baixo para acionar o AdiItem. Eu também penso que o programa deve trabalhar para o usuário e não o usuário para o programa... (lamentavelmente, nem todos pensam assim).

Adicionei um truquesinho para navegar entre os TEXTBOXes através do ENTER. E o grid permite ser alterado também.