Pickdate

User avatar
Otto
Posts: 6403
Joined: Fri Oct 07, 2005 7:07 pm
Has thanked: 22 times
Been thanked: 2 times
Contact:

Post by Otto »

Antonio,
thank you. Now painting is professional.

Would you be so kind to explain the difference between a
“control Classes” and a Class.

Thanks in advance
Otto
User avatar
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Post by Antonio Linares »

Doug,

Very nice! :-)

Congratulations!
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Post by Antonio Linares »

Otto,

A Class defines the properties and behaviors of a kind of objects to be created and managed. These objects don't need to be visible, i.e. a "customer", a "sale", a "payment".

A control Class is intended to create "visual" controls that can be placed on a window or a dialog or on top of another control. These controls can be placed in resources (RC files). i.e. a TButton, a TGet, or a TPickDate. These controls "inherit" from FiveWin Class TControl.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Otto
Posts: 6403
Joined: Fri Oct 07, 2005 7:07 pm
Has thanked: 22 times
Been thanked: 2 times
Contact:

Post by Otto »

Hello Antonio,
could you please show how to handle the mouse event.
Thanks in advance
Otto
User avatar
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Post by Antonio Linares »

Otto,

I am currently working on the painting. Mouse behavior will be next step.

Image

Code: Select all | Expand

#include "FiveWin.ch" 

//----------------------------------------------------------------------------//

function Main()

   local oWnd, oPickDate

   DEFINE WINDOW oWnd TITLE "Calendar"

   oPickDate := TPickDate():New( 10, 10,,, oWnd )
   
   oWnd:oClient = oPickDate
   
   ACTIVATE WINDOW oWnd MAXIMIZED

return nil

//----------------------------------------------------------------------------//

CLASS TPickDate FROM TControl

   DATA nStartRow,  nStartCols
   DATA oPlanFont, sy, sx
   DATA ClickRow, syTemp, sxTemp, ClickCol
   DATA StartDay, EndDay, oBrush
   DATA hBru, hPen1, hPen3
   DATA lMove AS LOGIC INIT .F.
   DATA aPlan AS ARRAY INIT {}
   DATA aTemp AS ARRAY INIT {}
   DATA nStartZeile INIT 0
   DATA nVersion
   DATA nYear
   DATA lBorder
   DATA hPen

   CLASSDATA lRegistered AS LOGICAL

   METHOD  New( nTop, nLeft, nWidth, nHeight, oWnd, nYear, lBorder, oPlanFont, nClrFore, nClrBack, nVersion )
   METHOD  Initiate( hDlg ) INLINE Super:Initiate( hDlg ), ::Default()
   METHOD  Paint()
   METHOD  Display() INLINE ::BeginPaint(), ::Paint(), ::EndPaint(), 0
   METHOD  SelectPen( hPen ) INLINE SelectObject( ::hDC, hPen )
   METHOD  End() INLINE ::Destroy()
   METHOD  Destroy()
   METHOD  LButtonUp( nRow, nCol, nKeyFlags )
   METHOD  Ldblclick( nRow, nCol, nKeyFlags )
   // METHOD  MouseMove( nRow, nCol, nKeyFlags )
   METHOD  PreviousYear()
   METHOD  NextYear()
   METHOD  EraseBkGnd( hDC ) INLINE 0

ENDCLASS

//----------------------------------------------------------------------------//

METHOD New( nTop, nLeft, nWidth, nHeight, oWnd, nYear, lBorder, oPlanFont, nClrFore,;
            nClrBack, nVersion ) CLASS TPickDate

   DEFAULT nWidth    := 800,;
           nHeight   := 300,;
           nLeft     := 0,;
           nTop      := 0,;
           nYear     := Year( Date() ),;
           nVersion  := "1.0.0",;
           oWnd      := GetWndDefault(),;
           lBorder   := .T.

   ::nTop       = nTop
   ::nLeft      = nLeft
   ::nBottom    = nTop + nHeight - 1
   ::nRight     = nLeft + nWidth - 1
   
   ::nStartCols := nLeft
   ::nStartRow  := nTop
   ::nYear      := nYear
   ::lBorder    := lBorder

   ::nStyle = nOr( WS_CHILD, WS_VISIBLE, WS_TABSTOP, WS_BORDER )

   ::oWnd := oWnd

   if ::oPlanFont == nil
      DEFINE FONT ::oPlanFont NAME "ARIAL" SIZE  0,-11
   else
      ::oPlanFont := oPlanFont
   endif

   ::nClrText = nClrFore
   ::nClrPane = nClrBack

   ::sy          := 1
   ::sx          := 1
   ::syTemp      := 0
   ::sxTemp      := 0

   ::aPlan       := {}
   ::ClickCol    := 0
   ::ClickRow    := 0
   ::startDay    := ""
   ::endDay      := ""
   ::lMove       := .f.
   ::aTemp       := {}
   ::nStartZeile := 0

   AAdd( ::aTemp, { 0, 0 } )                          // 1
   AAdd( ::aTemp, { 0, 0 } )                          // 2
   AAdd( ::aTemp, { 0, 0 } )                          // 3
   AAdd( ::aTemp, { 0, 0 } )                          // 4
   AAdd( ::aTemp, { 0, 0 } )                          // 5
   AAdd( ::aTemp, { 0, 0 } )                          // 6
   AAdd( ::aTemp, { 0, 0 } )                          // 7
   AAdd( ::aTemp, { 0, 0 } )                          // 8
   AAdd( ::aTemp, { 0, 0 } )                          // 9
   AAdd( ::aTemp, { 0, 0 } )                          // 10
   AAdd( ::aTemp, { 0, 0 } )                          // 11
   AAdd( ::aTemp, { 0, 0 } )                          // 12

   #ifdef __XPP__
      DEFAULT ::lRegistered := .f.
   #endif

   ::Register( nOR( CS_VREDRAW, CS_HREDRAW ) )

   if ! Empty( oWnd:hWnd )
      ::Create()
      oWnd:AddControl( Self )
   else
      oWnd:DefControl( Self )
   endif

return self

//----------------------------------------------------------------------------//

METHOD Paint() CLASS TPickDate

   local aInfo := ::DispBegin(), hPen, hOld, oFont, nRowStep, nColStep, n, dDate
   local hDC := ::hDC, cDay, oBrush, nDay

   FillRect( hDC, GetClientRect( ::hWnd ), ::oBrush:hBrush )
   
   DEFINE BRUSH oBrush COLOR nRGB( 183, 249, 185 )
   
   hPen = CreatePen( PS_SOLID, 1, CLR_BLACK )
   hOld = SelectObject( hDC, hPen )
   
   DEFINE FONT oFont NAME "Tahoma" SIZE 0, -12
   
   nRowStep = ::nHeight / 13 
   for n = 1 to 12
      ::Line( n * nRowStep, 0, n * nRowStep, ::nWidth - 1 )
      ::Say( n * nRowStep + ( nRowStep / 2 ) - ( oFont:nHeight / 2 ), 3, cMonth( CToD( Str( n, 2 ) + "/01/" + Str( Year( Date() ), 4 ) ) ),,, oFont, .T. )
   next   

   dDate = CToD( "06/01/2008" )
   nColStep = ( ::nWidth - 60 ) / 36
   for n = 1 to 35 step 7
      FillRect( hDC, { 0, 60 + ( nColStep * n ), ::nHeight - 1, 60 + ( nColStep * ( n + 1 ) ) }, oBrush:hBrush )
   next   
   for n = 1 to 35
      ::Line( 0, 60 + ( nColStep * n ), ::nHeight - 1, 60 + ( nColStep * n ) )
      cDay = SubStr( CDoW( dDate ), 1, 2 )
      ::Say( nRowStep * 0.5,;
             60 + ( nColStep * n ) + ( nColStep / 2 ) - ( GetTextWidth( hDC, cDay, oFont:hFont ) / 2 ) + 1,;
             cDay, nRGB( 255, 255, 121 ), If( DoW( dDate++ ) == 1, nRGB( 128, 233, 176 ),), oFont, .T. )
   next   
   
   for n = 1 to 12
      dDate = CToD( Str( n ) + "/01/2008" )
      nDay = DoW( dDate )
      while Month( dDate ) == n
         cDay = AllTrim( Str( Day( dDate ) ) )
         ::Say( n * nRowStep + ( nRowStep * 0.5 ),;
                60 + ( nColStep * nDay++ ) + ( nColStep / 2 ) - ( GetTextWidth( hDC, cDay, oFont:hFont ) / 2 ) + 1,;
                cDay, 0, If( DoW( dDate++ ) == 1, nRGB( 128, 233, 176 ),), oFont, .T. )
      end
   next             
   
   SelectObject( hDC, hOld )
   DeleteObject( hPen )
   
   ::DispEnd( aInfo )
   
   oBrush:End()

return 0

//----------------------------------------------------------------------------//

 METHOD LButtonUp( nRow, nCol, nKeyFlags ) CLASS TPickDate

    ::endDay := ::aPlan[::sx,::sy]

   IF ::sy > 0 .AND. ::sx > 0
      if msgYesNo(::startDay + " -- " + ::endDay + "    Tage: " +;
         str( ctod(::endDay)-ctod(::startDay)  +1   ))=.t.

      endif
   ENDIF
   ::lMove:=.f.

return nil

//----------------------------------------------------------------------------//

METHOD Ldblclick( nRow, nCol, nKeyFlags )   CLASS TPickDate

        local ITemp := 0

   ::sx := INT((nRow - ::nStartRow)/::nHeight ) + 1
   ::sy := INT((nCol - ::nStartCols)/::nWidth )

   IF ::sy > 0 .AND. ::sx > 0
      ::startDay    := ::aPlan[::sx,::sy]
      ::nStartZeile := ::sx
      ::ClickRow    := (INT((nRow-::nStartRow)/::nHeight ))*::nHeight + ::nStartRow
      ::ClickCol    :=  ::nStartCols + ::sy * ::nWidth

      FOR ITemp := 1 TO 12
         ::aTemp[ITemp,1]:=0
      NEXT

      sysrefresh()

      ::lMove:=.t.
   ENDIF
       Super:LDblClick( nRow, nCol, nKeyFlags )

return nil

 //----------------------------------------------------------------------------//

 /*
 METHOD MouseMove( nRow, nCol, nKeyFlags ) CLASS TPickDate

    Super:MouseMove( nRow, nCol, nKeyFlags )

  if IsOverWnd( ::hWnd, nRow, nCol )
    if !::lCaptured
       ::Capture()
    endif
 else
    if !::lCaptured
       ReleaseCapture()
    endif
   ENDIF


if ::lMove

 IF ::sx <>  (INT((nRow-::nStartRow)/::nHeight ) + 1) .OR.;
    ::sx <>  (INT((nCol-::nStartCols )/::nHeight ) + 1 )


      ::sx := INT((nRow-::nStartRow)/::nHeight ) + 1
      ::sy := INT((nCol -::nStartCols )/::nWidth )

      IF nRow < ::nStartRow
         ::sx  := 0
         nRow     := 0
      ENDIF

      ::sxTemp :=   ::nStartRow +  ::sx * ::nHeight
      ::syTemp :=   ::nStartCols + ::sy * ::nWidth +  ::nWidth
      ENDIF

    endif
   
return nil
*/

//-----------------------------------------------------------------//

METHOD Destroy() CLASS TPickDate

   RELEASE FONT ::oplanFont

   ::hBru:end()
   ::hPen:end()
   ::hPen1:end()
   ::hPen3:end()

return nil

//-----------------------------------------------------------------//

method PreviousYear() CLASS TPickDate

   ::nYear := ::nYear - 1
   ::Paint()
  *::oWnd:refresh()
   ::oWnd:cTitle := "Kalender [ " + str(::nYear,4) + " ]"

return .T.

//-----------------------------------------------------------------//

method NextYear() CLASS TPickDate

   ::nYear := ::nYear + 1
   ::Paint()
   *::oWnd:refresh()
   ::oWnd:cTitle := "Kalender [ " + str(::nYear,4) + " ]"

return .T.

//-----------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Post by Antonio Linares »

The last column was missing:
Image

Code: Select all | Expand

#include "FiveWin.ch" 

//----------------------------------------------------------------------------//

function Main()

   local oWnd, oPickDate

   DEFINE WINDOW oWnd TITLE "Calendar"

   oPickDate := TPickDate():New( 10, 10,,, oWnd )
   
   oWnd:oClient = oPickDate
   
   ACTIVATE WINDOW oWnd MAXIMIZED

return nil

//----------------------------------------------------------------------------//

CLASS TPickDate FROM TControl

   DATA nStartRow,  nStartCols
   DATA oPlanFont, sy, sx
   DATA ClickRow, syTemp, sxTemp, ClickCol
   DATA StartDay, EndDay, oBrush
   DATA hBru, hPen1, hPen3
   DATA lMove AS LOGIC INIT .F.
   DATA aPlan AS ARRAY INIT {}
   DATA aTemp AS ARRAY INIT {}
   DATA nStartZeile INIT 0
   DATA nVersion
   DATA nYear
   DATA lBorder
   DATA hPen

   CLASSDATA lRegistered AS LOGICAL

   METHOD  New( nTop, nLeft, nWidth, nHeight, oWnd, nYear, lBorder, oPlanFont, nClrFore, nClrBack, nVersion )
   METHOD  Initiate( hDlg ) INLINE Super:Initiate( hDlg ), ::Default()
   METHOD  Paint()
   METHOD  Display() INLINE ::BeginPaint(), ::Paint(), ::EndPaint(), 0
   METHOD  SelectPen( hPen ) INLINE SelectObject( ::hDC, hPen )
   METHOD  End() INLINE ::Destroy()
   METHOD  Destroy()
   METHOD  LButtonUp( nRow, nCol, nKeyFlags )
   METHOD  Ldblclick( nRow, nCol, nKeyFlags )
   // METHOD  MouseMove( nRow, nCol, nKeyFlags )
   METHOD  PreviousYear()
   METHOD  NextYear()
   METHOD  EraseBkGnd( hDC ) INLINE 0

ENDCLASS

//----------------------------------------------------------------------------//

METHOD New( nTop, nLeft, nWidth, nHeight, oWnd, nYear, lBorder, oPlanFont, nClrFore,;
            nClrBack, nVersion ) CLASS TPickDate

   DEFAULT nWidth    := 800,;
           nHeight   := 300,;
           nLeft     := 0,;
           nTop      := 0,;
           nYear     := Year( Date() ),;
           nVersion  := "1.0.0",;
           oWnd      := GetWndDefault(),;
           lBorder   := .T.

   ::nTop       = nTop
   ::nLeft      = nLeft
   ::nBottom    = nTop + nHeight - 1
   ::nRight     = nLeft + nWidth - 1
   
   ::nStartCols := nLeft
   ::nStartRow  := nTop
   ::nYear      := nYear
   ::lBorder    := lBorder

   ::nStyle = nOr( WS_CHILD, WS_VISIBLE, WS_TABSTOP, WS_BORDER )

   ::oWnd := oWnd

   if ::oPlanFont == nil
      DEFINE FONT ::oPlanFont NAME "ARIAL" SIZE  0,-11
   else
      ::oPlanFont := oPlanFont
   endif

   ::nClrText = nClrFore
   ::nClrPane = nClrBack

   ::sy          := 1
   ::sx          := 1
   ::syTemp      := 0
   ::sxTemp      := 0

   ::aPlan       := {}
   ::ClickCol    := 0
   ::ClickRow    := 0
   ::startDay    := ""
   ::endDay      := ""
   ::lMove       := .f.
   ::aTemp       := {}
   ::nStartZeile := 0

   AAdd( ::aTemp, { 0, 0 } )                          // 1
   AAdd( ::aTemp, { 0, 0 } )                          // 2
   AAdd( ::aTemp, { 0, 0 } )                          // 3
   AAdd( ::aTemp, { 0, 0 } )                          // 4
   AAdd( ::aTemp, { 0, 0 } )                          // 5
   AAdd( ::aTemp, { 0, 0 } )                          // 6
   AAdd( ::aTemp, { 0, 0 } )                          // 7
   AAdd( ::aTemp, { 0, 0 } )                          // 8
   AAdd( ::aTemp, { 0, 0 } )                          // 9
   AAdd( ::aTemp, { 0, 0 } )                          // 10
   AAdd( ::aTemp, { 0, 0 } )                          // 11
   AAdd( ::aTemp, { 0, 0 } )                          // 12

   #ifdef __XPP__
      DEFAULT ::lRegistered := .f.
   #endif

   ::Register( nOR( CS_VREDRAW, CS_HREDRAW ) )

   if ! Empty( oWnd:hWnd )
      ::Create()
      oWnd:AddControl( Self )
   else
      oWnd:DefControl( Self )
   endif

return self

//----------------------------------------------------------------------------//

METHOD Paint() CLASS TPickDate

   local aInfo := ::DispBegin(), hPen, hOld, oFont, nRowStep, nColStep, n, dDate
   local hDC := ::hDC, cDay, oBrush, nDay

   FillRect( hDC, GetClientRect( ::hWnd ), ::oBrush:hBrush )
   
   DEFINE BRUSH oBrush COLOR nRGB( 183, 249, 185 )
   
   hPen = CreatePen( PS_SOLID, 1, CLR_BLACK )
   hOld = SelectObject( hDC, hPen )
   
   DEFINE FONT oFont NAME "Tahoma" SIZE 0, -12
   
   nRowStep = ::nHeight / 13 
   for n = 1 to 12
      ::Line( n * nRowStep, 0, n * nRowStep, ::nWidth - 1 )
      ::Say( n * nRowStep + ( nRowStep / 2 ) - ( oFont:nHeight / 2 ), 3, cMonth( CToD( Str( n, 2 ) + "/01/" + Str( Year( Date() ), 4 ) ) ),,, oFont, .T. )
   next   

   dDate = CToD( "06/01/2008" )
   nColStep = ( ::nWidth - 60 ) / 37
   for n = 1 to 36 step 7
      FillRect( hDC, { 0, 60 + ( nColStep * n ), ::nHeight - 1, 60 + ( nColStep * ( n + 1 ) ) }, oBrush:hBrush )
   next   
   for n = 1 to 36
      ::Line( 0, 60 + ( nColStep * n ), ::nHeight - 1, 60 + ( nColStep * n ) )
      cDay = SubStr( CDoW( dDate ), 1, 2 )
      ::Say( nRowStep * 0.5,;
             60 + ( nColStep * n ) + ( nColStep / 2 ) - ( GetTextWidth( hDC, cDay, oFont:hFont ) / 2 ) + 1,;
             cDay, nRGB( 255, 255, 121 ), If( DoW( dDate++ ) == 1, nRGB( 128, 233, 176 ),), oFont, .T. )
   next   
   
   for n = 1 to 12
      dDate = CToD( Str( n ) + "/01/2008" )
      nDay = DoW( dDate )
      while Month( dDate ) == n
         cDay = AllTrim( Str( Day( dDate ) ) )
         ::Say( n * nRowStep + ( nRowStep * 0.4 ),;
                60 + ( nColStep * nDay++ ) + ( nColStep / 2 ) - ( GetTextWidth( hDC, cDay, oFont:hFont ) / 2 ) + 1,;
                cDay, 0, If( DoW( dDate++ ) == 1, nRGB( 128, 233, 176 ),), oFont, .T. )
      end
   next             
   
   SelectObject( hDC, hOld )
   DeleteObject( hPen )
   
   ::DispEnd( aInfo )
   
   oBrush:End()

return 0

//----------------------------------------------------------------------------//

 METHOD LButtonUp( nRow, nCol, nKeyFlags ) CLASS TPickDate

    ::endDay := ::aPlan[::sx,::sy]

   IF ::sy > 0 .AND. ::sx > 0
      if msgYesNo(::startDay + " -- " + ::endDay + "    Tage: " +;
         str( ctod(::endDay)-ctod(::startDay)  +1   ))=.t.

      endif
   ENDIF
   ::lMove:=.f.

return nil

//----------------------------------------------------------------------------//

METHOD Ldblclick( nRow, nCol, nKeyFlags )   CLASS TPickDate

        local ITemp := 0

   ::sx := INT((nRow - ::nStartRow)/::nHeight ) + 1
   ::sy := INT((nCol - ::nStartCols)/::nWidth )

   IF ::sy > 0 .AND. ::sx > 0
      ::startDay    := ::aPlan[::sx,::sy]
      ::nStartZeile := ::sx
      ::ClickRow    := (INT((nRow-::nStartRow)/::nHeight ))*::nHeight + ::nStartRow
      ::ClickCol    :=  ::nStartCols + ::sy * ::nWidth

      FOR ITemp := 1 TO 12
         ::aTemp[ITemp,1]:=0
      NEXT

      sysrefresh()

      ::lMove:=.t.
   ENDIF
       Super:LDblClick( nRow, nCol, nKeyFlags )

return nil

 //----------------------------------------------------------------------------//

 /*
 METHOD MouseMove( nRow, nCol, nKeyFlags ) CLASS TPickDate

    Super:MouseMove( nRow, nCol, nKeyFlags )

  if IsOverWnd( ::hWnd, nRow, nCol )
    if !::lCaptured
       ::Capture()
    endif
 else
    if !::lCaptured
       ReleaseCapture()
    endif
   ENDIF


if ::lMove

 IF ::sx <>  (INT((nRow-::nStartRow)/::nHeight ) + 1) .OR.;
    ::sx <>  (INT((nCol-::nStartCols )/::nHeight ) + 1 )


      ::sx := INT((nRow-::nStartRow)/::nHeight ) + 1
      ::sy := INT((nCol -::nStartCols )/::nWidth )

      IF nRow < ::nStartRow
         ::sx  := 0
         nRow     := 0
      ENDIF

      ::sxTemp :=   ::nStartRow +  ::sx * ::nHeight
      ::syTemp :=   ::nStartCols + ::sy * ::nWidth +  ::nWidth
      ENDIF

    endif
   
return nil
*/

//-----------------------------------------------------------------//

METHOD Destroy() CLASS TPickDate

   RELEASE FONT ::oplanFont

   ::hBru:end()
   ::hPen:end()
   ::hPen1:end()
   ::hPen3:end()

return nil

//-----------------------------------------------------------------//

method PreviousYear() CLASS TPickDate

   ::nYear := ::nYear - 1
   ::Paint()
  *::oWnd:refresh()
   ::oWnd:cTitle := "Kalender [ " + str(::nYear,4) + " ]"

return .T.

//-----------------------------------------------------------------//

method NextYear() CLASS TPickDate

   ::nYear := ::nYear + 1
   ::Paint()
   *::oWnd:refresh()
   ::oWnd:cTitle := "Kalender [ " + str(::nYear,4) + " ]"

return .T.

//-----------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Post by Antonio Linares »

Otto,

Could you please explain me whats the desired mouse behavior ?

1. A single click on a day and then change its color ?

2. To select a range of days and change their colors ?

3. To relate some sort of info with those selected days ?

Thanks,
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Post by Antonio Linares »

Detecting the selected month with the mouse:

Code: Select all | Expand

METHOD LButtonDown( nRow, nCol, nFlags ) CLASS TPickDate

   local nMonth := nRow / ( ::nHeight / 13 )
   
   if nMonth >= 1
      MsgInfo( "Month: " + Str( Int( nMonth ) ) )
   endif   

return nil
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Post by Antonio Linares »

Detecting the clicked date:

Code: Select all | Expand

METHOD LButtonDown( nRow, nCol, nFlags ) CLASS TPickDate

   local nMonth := Int( nRow / ( ::nHeight / 13 ) )
   local nDay   := Int( ( nCol - 60 ) / ( ( ::nWidth - 60 ) / 37 ) ) - ;
                   DoW( CToD( Str( nMonth ) + "/01/2008" ) ) + 1
   local dDate  := CToD( AllTrim( Str( nMonth ) ) + "/" + AllTrim( Str( nDay ) ) + "/2008" )               

   if nMonth > 0 .and. nDay > 0 .and. ! Empty( dDate )
      MsgInfo( "Date: " + DToC( dDate ) )
   endif   

return nil
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Post by Antonio Linares »

Here you have the PRG and the working EXE:

http://www.mediafire.com/?0spjtxnjmmd
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
xProgrammer
Posts: 464
Joined: Tue May 16, 2006 7:47 am
Location: Australia

Calendars

Post by xProgrammer »

Hi all

Its great to see the progress on and interest in Otto's very flash calendar control. I need a somewhat different calendar for my purposes and its certainly not as flash. There was a bit of a preview some posts ago in this thread. I don't want to clog up this thread, and my code is FiveLinux rather than FiveWin (although it wouldn't take much to "translate"). I've developed a bit more (not too much time at present) and have started a thread on it in the FiveLinux forum in case anyone is interested.

Its great to see the level of cooperation here. That can only help us all.

Regards
Doug
(xProgrammer)
User avatar
fraxzi
Posts: 811
Joined: Tue May 06, 2008 4:28 am
Location: Philippines
Contact:

Post by fraxzi »

Hello FW Guru's!


I like the way it painted the screen when you resize the window.....


I love to see it in action with xBrowse.... and perhaps in dialogs too :lol:



2Cents!


Regards,
Kind Regards,
Frances

Fivewin for xHarbour v18.07
xHarbour v1.2.3.x
BCC 7.3 + PellesC8 ( Resource Compiler only)
ADS 10.1 / MariaDB
Crystal Reports 8.5/9.23 DE
xMate v1.15
User avatar
Otto
Posts: 6403
Joined: Fri Oct 07, 2005 7:07 pm
Has thanked: 22 times
Been thanked: 2 times
Contact:

Post by Otto »

Otto,

Could you please explain me whats the desired mouse behavior ?

1. A single click on a day and then change its color ?

2. To select a range of days and change their colors ?

3. To relate some sort of info with those selected days ?
Hello Antonio,

Thank you very much for your work.

I made this picker to select a period of time.

Single click marks the start date.
Then you can move the mouse to the end date.
If you release the left button the period is selected.

Regards,
Otto
User avatar
xProgrammer
Posts: 464
Joined: Tue May 16, 2006 7:47 am
Location: Australia

Desired Mouse Behaviour - A Suggestion

Post by xProgrammer »

My suggestion is:

Single mouse click - select start point
Shift-mouse click - select end point
Leaving Ctl-mouse click as a toggle include/exclude if you ever want to support that.
Possibly more "standard" Windows? (although I have used Windows less than 2 hours in the last 6 months)

Regards
Doug
(xProgrammer)
User avatar
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

Post by Antonio Linares »

In this version you can select a range of dates clicking on a first date and then clicking on a second date. If you don't click on the second date, then only the first one is kept. Also if the second date is an earlier date, then the dates range swap:
Image

Code: Select all | Expand

#include "FiveWin.ch" 

//----------------------------------------------------------------------------//

function Main()

   local oWnd, oPickDate

   DEFINE WINDOW oWnd TITLE "Calendar"

   oPickDate := TPickDate():New( 10, 10,,, oWnd )
   
   oWnd:oClient = oPickDate
   
   ACTIVATE WINDOW oWnd MAXIMIZED

return nil

//----------------------------------------------------------------------------//

CLASS TPickDate FROM TControl

   DATA    dStart, dEnd
   DATA    nYear

   CLASSDATA lRegistered AS LOGICAL

   METHOD  New( nTop, nLeft, nWidth, nHeight, oWnd, nYear, lBorder, oPlanFont, nClrFore, nClrBack, nVersion )
   METHOD  Paint()
   METHOD  Display() INLINE ::BeginPaint(), ::Paint(), ::EndPaint(), 0
   METHOD  LButtonDown( nRow, nCol, nFlags )
   METHOD  PreviousYear() INLINE ::nYear++, ::Refresh()
   METHOD  NextYear() INLINE ::nYear--, ::Refresh()
   METHOD  EraseBkGnd( hDC ) INLINE 0

ENDCLASS

//----------------------------------------------------------------------------//

METHOD New( nTop, nLeft, nWidth, nHeight, oWnd, nYear, lBorder, oPlanFont, nClrFore,;
            nClrBack, nVersion ) CLASS TPickDate

   DEFAULT nWidth    := 800,;
           nHeight   := 300,;
           nLeft     := 0,;
           nTop      := 0,;
           nYear     := Year( Date() ),;
           nVersion  := "1.0.0",;
           oWnd      := GetWndDefault(),;
           lBorder   := .T.

   ::nTop       = nTop
   ::nLeft      = nLeft
   ::nBottom    = nTop + nHeight - 1
   ::nRight     = nLeft + nWidth - 1
   ::nYear      := Year( Date() )

   DEFINE FONT ::oFont NAME "Tahoma" SIZE 0, -12

   ::nStyle = nOr( WS_CHILD, WS_VISIBLE, WS_TABSTOP, WS_BORDER )

   ::oWnd := oWnd

   ::nClrText = nClrFore
   ::nClrPane = nClrBack

   #ifdef __XPP__
      DEFAULT ::lRegistered := .F.
   #endif

   ::Register( nOR( CS_VREDRAW, CS_HREDRAW ) )

   if ! Empty( oWnd:hWnd )
      ::Create()
      oWnd:AddControl( Self )
   else
      oWnd:DefControl( Self )
   endif

return self

//----------------------------------------------------------------------------//

METHOD Paint() CLASS TPickDate

   local aInfo := ::DispBegin(), nRowStep, nColStep, n, dDate
   local hDC := ::hDC, cDay, oBrush, nDay, oFont := ::oFont

   FillRect( hDC, GetClientRect( ::hWnd ), ::oBrush:hBrush )
   
   DEFINE BRUSH oBrush COLOR nRGB( 183, 249, 185 ) // Sundays column green brush
   
   nRowStep = ::nHeight / 13 

   for n = 1 to 12
      ::Line( n * nRowStep, 0, n * nRowStep, ::nWidth - 1 )
      ::Say( n * nRowStep + ( nRowStep / 2 ) - ( oFont:nHeight / 2 ), 3, cMonth( CToD( Str( n, 2 ) + "/01/" + ;
             Str( Year( Date() ), 4 ) ) ),,, oFont, .T. )
   next   

   dDate = CToD( "06/01/" + Str( ::nYear, 4 ) )
   nColStep = ( ::nWidth - 60 ) / 37

   ::Say( ( nRowStep / 2 ) - ( oFont:nHeight / 2 ),;
          ( ( 60 + nColStep ) / 2 ) - ( GetTextWidth( hDC, Str( ::nYear, 4 ), ::oFont:hFont ) / 2 ),;
          Str( ::nYear, 4 ),,, oFont, .T. )

   for n = 1 to 36 step 7
      FillRect( hDC, { 0, 60 + ( nColStep * n ), ::nHeight - 1, 60 + ( nColStep * ( n + 1 ) ) }, oBrush:hBrush )
   next   
   for n = 1 to 36
      ::Line( 0, 60 + ( nColStep * n ), ::nHeight - 1, 60 + ( nColStep * n ) )
      cDay = SubStr( CDoW( dDate ), 1, 2 )
      ::Say( nRowStep * 0.4,;
             60 + ( nColStep * n ) + ( nColStep / 2 ) - ( GetTextWidth( hDC, cDay, oFont:hFont ) / 2 ) + 1,;
             cDay, nRGB( 255, 255, 121 ), If( DoW( dDate++ ) == 1, nRGB( 128, 233, 176 ),), oFont, .T. )
   next   
   
   for n = 1 to 12
      dDate = CToD( Str( n ) + "/01/" + Str( ::nYear, 4 ) )
      nDay = DoW( dDate )
      while Month( dDate ) == n
         cDay = AllTrim( Str( Day( dDate ) ) )
         ::Say( n * nRowStep + ( nRowStep * 0.4 ),;
                60 + ( nColStep * nDay++ ) + ( nColStep / 2 ) - ( GetTextWidth( hDC, cDay, oFont:hFont ) / 2 ) + 1,;
                cDay, 0, If( ! Empty( ::dStart ) .and. dDate >= ::dStart .and. dDate <= ::dEnd, nRGB( 178, 204, 235 ),;
                If( DoW( dDate ) == 1, nRGB( 128, 233, 176 ),) ), oFont, .T. )
         dDate++       
      end
   next             
   
   ::DispEnd( aInfo )
   
   oBrush:End()

return 0

//----------------------------------------------------------------------------//

METHOD LButtonDown( nRow, nCol, nFlags ) CLASS TPickDate

   local nMonth := Int( nRow / ( ::nHeight / 13 ) )
   local nDay   := Int( ( nCol - 60 ) / ( ( ::nWidth - 60 ) / 37 ) ) - ;
                   DoW( CToD( Str( nMonth ) + "/01/" + Str( ::nYear, 4 ) ) ) + 1
   local dDate  := CToD( AllTrim( Str( nMonth ) ) + "/" + AllTrim( Str( nDay ) ) + "/" + Str( ::nYear, 4 ) )               

   if nMonth > 0 .and. nDay > 0 .and. ! Empty( dDate )
      if ::dEnd != ::dStart
         ::dStart = nil
         ::dEnd = nil
      endif     
      if Empty( ::dStart )
         ::dStart = dDate
         ::dEnd = dDate
         ::Refresh()
      endif
      if Empty( ::dEnd ) .or. ::dStart == ::dEnd
         ::dEnd = dDate
         if ::dEnd < ::dStart
            ::dEnd = ::dStart
            ::dStart = dDate
         endif   
         ::Refresh()
      endif     
   endif   

return nil

//-----------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply