Adicionar elementos na rotina

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Adicionar elementos na rotina

Mensagem por Paulo_CPV »

Boa tarde!

Em primeiro lugar quero agradecer aos colegas que me ajudaram a solucionar o meu problema em especial ao Pablo que fez este exemplo do código abaixo, mais agora estou necessitando de alterar um pouco esta rotina tirar os três TEXTBOX e alterar para dois TEXTBOX com a data inicial e data final e do lado um LABEL com o tempo convertido (ano,meses e dias) do período que o usuário digitou e outro LABEL para mostrar o total das entradas e depois inserir na GRID:

Data Inicial Data Final Ano Mês Dia

17/04/1972 07/08/1973 1 3 21

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 / Dia" ; 
      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(val(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 230 ;
      HEIGHT 120 ; 
      HEADERS {'Ano','Mês','Dia'} ; 
      WIDTHS  {75,75,75} ;
      ITEMS aRows ;
      FONT 'Arial' ;
      SIZE 10 ;
      BOLD ;
      EDIT ;
      JUSTIFY {BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER} ;
      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

   @ 252,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}

   DEFINE BUTTON button_1

     ROW 290
     COL 9
     WIDTH 100
     HEIGHT 24
     CAPTION "Nova Soma"
     FONTNAME "Arial"
     FONTSIZE 10
     FONTBOLD .T.
     ACTION {|| Novo()}

   END BUTTON

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

aDia := INT(aSoma[3] / 30)
aMes := INT(aSoma[2] / 12)

aRet[3] := IF(aDia <> 0 , aSoma[3] - (aDia * 30) , aSoma[3])

aRet[2] := IF(aMes = 0 , IF(aMes = 0 ,IF(aSoma[2] + aDia = 12 , 0 , aSoma[2] + aDia) , aSoma[2] + aDia - (aDia * 12)) , IF(aMes = 1 , aSoma[2] + aDia - (aMes * 12) , aSoma[2] + aDia - (aMes * 12)))

aRet[1] := IF(aMes = 0 , IF(aMes = 0 , IF(aSoma[2] + aDia = 12, aSoma[1] + 1 , aSoma[1]) , aSoma[1] + aDia) , IF(aMes = 1 , aSoma[1] + aMes , aSoma[1] + aMes))

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
*********************************************************************
Function Novo()

Form_1.Grid_1.DeleteAllItems
Form_1.Text_Ano.Value := ""
Form_1.Text_Mes.Value := ""
Form_1.Text_Dia.Value := ""
Form_1.Label_1.Value  := ""

aRows := {{0,0,0}}

*InPutAtGrid()

Form_1.Text_Ano.SetFocus

Return Nil

#pragma BEGINDUMP

#include <shlobj.h>
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include <wingdi.h>
#include "hbapi.h"
#include "hbapiitm.h"
#include "hbvm.h"
#include "hbstack.h"
#include "winreg.h"
#include "tchar.h"
#include "Winuser.h"
#include "winbase.h"
#include "item.api"

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 que alguém me ajude a solucionar este problema, pois deu um branco e não estou conseguindo ver a solução e espero que eu tenho sido objetivo.
[]'s
Paulo - Jacareí/SP
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Adicionar elementos na rotina

Mensagem por Pablo César »

Se é isto que eu entendi:
Tela84.PNG
Não e dificil de fazer, apenas um pouco laborioso. Utilizando a IDE você pode fazer a sua tela. Foi o que eu fiz, segue o código fonte alterado:

Código: Selecionar todos

#include <hmg.ch>

Function Main()
Local aRows:={{0,0,0}}

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

   ON KEY ESCAPE ACTION Form_1.Release
   
   DEFINE LABEL Label_1
        ROW    20
        COL    10
        WIDTH  50
        HEIGHT 20
        VALUE "Inicio:"
        FONTNAME "Arial"
        FONTSIZE 12
        TOOLTIP ""
        FONTBOLD .T.
        FONTITALIC .F.
        FONTUNDERLINE .F.
        FONTSTRIKEOUT .F.
        HELPID Nil
        VISIBLE .T.
        TRANSPARENT .F.
        ACTION Nil
        AUTOSIZE .F.
        BACKCOLOR Nil
        FONTCOLOR Nil
        RIGHTALIGN .T. 
    END LABEL
	
    DEFINE DATEPICKER DatePicker_1
	    ROW    16
        COL    70
	    WIDTH  108
	    HEIGHT 24
		FONTNAME "Arial"
		FONTSIZE 12
		VALUE CTOD('')
		TOOLTIP ""
        ONCHANGE Nil
		SHOWNONE .F.
		VISIBLE .T.
	END DATEPICKER

    DEFINE LABEL Label_2
        ROW    54
        COL    10
        WIDTH  50
        HEIGHT 24
        VALUE "Final:"
        FONTNAME "Arial"
        FONTSIZE 12
        TOOLTIP ""
        FONTBOLD .T.
        FONTITALIC .F.
        FONTUNDERLINE .F.
        FONTSTRIKEOUT .F.
        HELPID Nil
        VISIBLE .T.
        TRANSPARENT .F.
        ACTION Nil
        AUTOSIZE .F.
        BACKCOLOR Nil
        FONTCOLOR Nil
        RIGHTALIGN .T. 
    END LABEL
    	
	DEFINE DATEPICKER DatePicker_2
	    ROW    50
        COL    70
	    WIDTH  108
	    HEIGHT 24
		FONTNAME "Arial"
		FONTSIZE 12
		VALUE CTOD('')
		TOOLTIP ""
        ONCHANGE Nil
		SHOWNONE .F.
		VISIBLE .T.
	END DATEPICKER

    DEFINE BUTTON Button_1
        ROW    30
        COL    190
        WIDTH  60
        HEIGHT 28
        ACTION {|| AdiItem()}
        CAPTION "Inserir"
        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

   @ 95,19 GRID grid_1 ;
        WIDTH 230 ;
        HEIGHT 126 ; 
        HEADERS {'Ano','Mês','Dia'} ; 
        WIDTHS  {75,75,75} ;
        ITEMS aRows ;
		FONT 'Arial' ;
		SIZE 10 ;
		EDIT VALUE {1,1} ;
		ON CHANGE Muda() ;
		ON DBLCLICK Nil ;
		CELLNAVIGATION ;
		COLUMNCONTROLS { {'TEXTBOX','NUMERIC','999'} , {'TEXTBOX','NUMERIC','999'} , {'TEXTBOX','NUMERIC','999'} } ;
		COLUMNVALID { { || Muda() }, { || Muda() }, { || Muda() } } ;
        JUSTIFY {BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER}

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

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

END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1

Function Muda()
If IsControlDefined(Label_3,Form_1)
   SetProperty("Form_1","Label_3","Value",SomaRegistro())
   
Endif
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
aDia := INT(aSoma[3] / 30)
aMes := INT(aSoma[2] / 12)
aRet[3] := IF(aDia <> 0 , aSoma[3] - (aDia * 30) , aSoma[3])
aRet[2] := IF(aMes = 0 , IF(aMes = 0 ,IF(aSoma[2] + aDia = 12 , 0 , aSoma[2] + aDia) , aSoma[2] + aDia - (aDia * 12)) , IF(aMes = 1 , aSoma[2] + aDia - (aMes * 12) , aSoma[2] + aDia - (aMes * 12)))
aRet[1] := IF(aMes = 0 , IF(aMes = 0 , IF(aSoma[2] + aDia = 12, aSoma[1] + 1 , aSoma[1]) , aSoma[1] + aDia) , IF(aMes = 1 , aSoma[1] + aMes , aSoma[1] + aMes))
cRet:=hb_ValToExp(aRet[1])+" Anos / "+hb_ValToExp(aRet[2])+" Meses / "+hb_ValToExp(aRet[3])+" Dias"
Form_1.Grid_1.Refresh
Return cRet

Function AdiItem()
Local dDataI:=Form_1.DatePicker_1.Value, dDataF:=Form_1.DatePicker_2.Value
Local a, m, d, nFim, nDias

If dDataF<dDataI
   MsgStop("A data inicial não pode ser mais antigas que a data final")
   Form_1.DatePicker_1.SetFocus
   Return Nil
Endif
nDias:=dDataF-dDataI
a:=Int(nDias/365)
nSobra:=nDias-(a*365)
m:=Int(nSobra/30)
d:=nSobra-(m*30)

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})
If nFim>1
   Form_1.Label_3.Value := SomaRegistro()
Endif
// DoMethod("Form_1","DatePicker_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})
Return Nil
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Adicionar elementos na rotina

Mensagem por Paulo_CPV »

Boa noite!

Pablo, gostei na sua colaboração, mas eu acho que eu não fui objetivo de novo. No seu exemplo só ficou faltando incluir a data de inicio e final dentro da GRID, como imagem abaixo:
Tela Exemplo1.fw.png
Agora eu espero ter sido bem objetivo Pablo, desde já agradeço a sua atenção. A imagem certa é esta.

[]'s
Paulo - Jacareí/SP
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Adicionar elementos na rotina

Mensagem por Pablo César »

Oi Paulo, coincidentemente no fórum oficial da HMG acabaram de postar um exemplo que me pareceu mais acertado, pois conta com os verdadeiros números de dias de acordo cada mês, isto é, não considera como fixo 30 dias como um mês, a tela é esta:
Tela85.PNG
Tela85.PNG (11.71 KiB) Exibido 736 vezes
E o link para baixar é este: http://hmgforum.com/viewtopic.php?p=25470#p25470

Observação: O meu exemplo anterior utiliza o MonthClaendar que dá um ar mais profissional.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder