Using DTP:IsNone

Public support forum for peer to peer support with related to the Visual Objects and Vulcan.NET products
Anonymous

Using DTP:IsNone

Post by Anonymous »

Hi, how do I SET the IsNone value on a TIME DateTimePicker please? I've set the IsNone property in the IDE, and can determine whether or not it is set, but how can I set it? For example:

IF self:oDCDateTimePicker1:IsNone == .t.
self:oDCDateTimePicker1:Value := null_date
else
self:oDCDateTimePicker1:Value := self:server:FIELDGET(#JOBTIME)
endif

Basically I want the code to detect a null_date, and if found set IsNone to TRUE, otherwise FALSE. I can see no obvious way to do it. I've searched the old NG, and here, and of course the VO help files, and IsNone doesn't return anything anywhere that I can see.

Thanks again.
User avatar
lumberjack
Posts: 727
Joined: Fri Sep 25, 2015 3:11 pm
Location: South Africa

Using DTP:IsNone

Post by lumberjack »

Jeff,
BiggyRat wrote:Hi, how do I SET the IsNone value on a TIME DateTimePicker please? I've set the IsNone property in the IDE, and can determine whether or not it is set, but how can I set it? For example:

Code: Select all

if  self:oDCDateTimePicker1:IsNone == .t.
		self:oDCDateTimePicker1:Value := null_date
 	else
	   self:oDCDateTimePicker1:Value := self:server:FIELDGET(#JOBTIME)
endif
Basically I want the code to detect a null_date, and if found set IsNone to TRUE, otherwise FALSE. I can see no obvious way to do it. I've searched the old NG, and here, and of course the VO help files, and IsNone doesn't return anything anywhere that I can see.
Ok, long time ago that I worked with VO, but from a .NET perspective, which I believe is similar. There is no such thing as a NULL_DATE in Windows/.NET, the way you do it is to set the Is None style on a DTP, which then have a CheckBox next to it, so by default it will populate the "NowTime", but you need then to check if the CheckBox is ticked to determine if you want to use the DT value or store a NULL/NIL. IsNone is a "ACCESS" property so you cannot assign it.

Maybe somebody with more experience with the VO DTP should jump in if I am off-track on this one.
______________________
Johan Nel
Boshof, South Africa
BiggyRat

Using DTP:IsNone

Post by BiggyRat »

Gotcha Wolfgang. thank you, but I can't seem to access any "checkbox like" methods in the DTP... The null_date idea actually came from the old NG... It seems once the user clicks on the "checkbox" it stays true for all records, even if a time has been assigned.. that's what I'm trying to fix.I need to have IsNone true if a null date, or False if there is a value in the JOBTIME field.
User avatar
lumberjack
Posts: 727
Joined: Fri Sep 25, 2015 3:11 pm
Location: South Africa

Using DTP:IsNone

Post by lumberjack »

Hi Jeff,
BiggyRat wrote:Gotcha Wolfgang. thank you, but I can't seem to access any "checkbox like" methods in the DTP... The null_date idea actually came from the old NG... It seems once the user clicks on the "checkbox" it stays true for all records, even if a time has been assigned.. that's what I'm trying to fix.I need to have IsNone true if a null date, or False if there is a value in the JOBTIME field.
From the MicroSoft Win32 docs...

Code: Select all

DTS_SHOWNONE
It is possible to have no date currently selected in the control. With this style, the control displays a check box that is automatically selected whenever a date is picked or entered. If the check box is subsequently deselected, the application cannot retrieve the date from the control because, in essence, the control has no date. The state of the check box can be set with the DTM_SETSYSTEMTIME message or queried with the DTM_GETSYSTEMTIME message.
IsNone indicates if you have have set the CheckBox to show.

Try retrieving SelectedDate and SelectedTime with the CheckBox Checked/Unchecked. So if it returns a NIL from my reasoning it means the CheckBox is not ticked, otherwise it will always return a value.

I think you confusing IsNone with "IsEmptyDate". IsNone is to control the visibility of the CheckBox and nothing else. If IsNone is true the CheckBox is shown.
______________________
Johan Nel
Boshof, South Africa
Jamal
Posts: 315
Joined: Mon Jul 03, 2017 7:02 pm

Using DTP:IsNone

Post by Jamal »

I am not sure what you want to achieve, is this on initial form (window) load? If so, why not set the DTP to whatever date value you want in the DataWindow PostInit() or Show() method.

Anyway, even though the following does not make sense in a real application, you can use the data window CommonControl Events properties window, then click the DateTimeSelChanged event which is triggered when the checkbox is clicked.

The DTP becomes grayed out but its value is still visible when unchecked. The oDateTimeSelectionEvent:SelectedDate:SelectedDate will be NULL_DATE.

Code: Select all

method DateTimeSelectionChanged(oDateTimeSelectionEvent) class YourDataWindow
	super:DateTimeSelectionChanged(oDateTimeSelectionEvent)
	//Put your changes here    
	if oDateTimeSelectionEvent:SelectedDate = null_date
		InfoBox{, "NULL_DATE", "Date: " + DToC(oDateTimeSelectionEvent:SelectedDate) }:show()   
	ELSE
		self:oDCDateTimePicker1:Value := self:server:FIELDGET(#JOBTIME)
	ENDIF		
	
return NIL


Jamal
BiggyRat

Using DTP:IsNone

Post by BiggyRat »

Hi Jamal, the exact scenario is this:

I have a dtp on my form. When I use SKIP(1) or SKIP(-1) to move through the records, the DTP stays at whatever it was set to previously. So, what I mean by that is say I set the DTP to "None" i.e. checkbox is UNCHECKED and I skip to the next record, the unchecked status doesn't change with the next record even if there is a time in that field. The time changes with the record, but the "checked" status does not.

The purpose is not all jobs have times. Those that do, great show the time, but those that don't need to show NONE.
Jamal
Posts: 315
Joined: Mon Jul 03, 2017 7:02 pm

Using DTP:IsNone

Post by Jamal »

I was expecting this thread to drag on like the other threads! But you are in luck! I found a post at
https://groups.google.com/forum/?nomobi ... mVZzJRKSMJ.

I adjusted the class to avoid WORD conversion issues. Don't change the class if you are not comfortable with win32 stuff.

Just let your datetimepicker control inherit from MyDatePicker class and set the SelectedDate based on your condition and the checkbox will change automatically. Sample at bottom.

Code: Select all

CLASS MyDatePicker INHERIT DateTimePicker

ACCESS SelectedDate CLASS MyDatePicker
 LOCAL lpSysTime is _WINSYSTEMTIME
 LOCAL dResult  as date

 MemClear( @lpSysTime , _sizeof( _WINSYSTEMTIME ) )
 IF DateTime_GetSystemTime( self:handle() , @lpSysTime ) == GDT_VALID
  dResult := ConDate( lpSysTime.wYear, lpSysTime.wMonth, lpSysTime.wDay )
 ELSE
  dResult := null_date
 ENDIF
RETURN dResult

ASSIGN SelectedDate( dNewDate ) CLASS MyDatePicker
 LOCAL lpSysTime is _WINSYSTEMTIME
 LOCAL dwFlag  as DWORD
 MemClear( @lpSysTime , _sizeof( _WINSYSTEMTIME ) )
 IF dNewDate = null_date
  dwFlag := GDT_NONE
 ELSE
  lpSysTime.wYear  := word(Year( dNewDate ))
  lpSysTime.wMonth := word(Month( dNewDate ))
  lpSysTime.wDay  := word(Day( dNewDate ))
  dwFlag      := GDT_VALID
 ENDIF
 DateTime_SetSystemTime( self:Handle() , dwFlag , @lpSysTime )
RETURN dNewDate

FUNCTION DateTime_GetSystemtime( hdp as ptr , pst as _WINSYSTEMTIME ) as DWORD PASCAL
 RETURN DWORD( _cast , SendMessage( hdp , DTM_GETSYSTEMTIME ,  0 ,  LONG( _cast , pst ) ) )

FUNCTION DateTime_SetSystemtime( hdp as ptr , gd as DWORD , pst as _WINSYSTEMTIME ) as LOGIC PASCAL
 RETURN LOGIC( _cast , SendMessage( hdp , DTM_SETSYSTEMTIME ,  DWORD( _cast , gd ) , LONG( _cast , pst ) ) )
  
Sample call:

Code: Select all

 // SAMPLE calls 
METHOD BlankDateButton( ) CLASS MyForm      
        // the checkbox will be unchecked and control is dimmed.
	 self:oDCDateTimePicker2:SelectedDate := null_date   
RETURN NIL


METHOD SetDatesButton( ) CLASS MyForm     
         // the DTP checkbox will be enabled and DTP will be active	
	 self:oDCDateTimePicker2:SelectedDate := Today() + 1     
RETURN NIL
BiggyRat

Using DTP:IsNone

Post by BiggyRat »

I found that code before I posted here Jamal, and it didn't work, just as it doesn't work now. I may be wrong (I usually am it seems) but the above code seems to be fixing DATE problems, not TIME, which is my problem. This seems to be borne out by the debugger where the assigning of null_date returns an error (it's wanting a null_STRING)
Attachments
DTP Crash.JPG
DTP Crash.JPG (44.21 KiB) Viewed 685 times
Jamal
Posts: 315
Joined: Mon Jul 03, 2017 7:02 pm

Using DTP:IsNone

Post by Jamal »

Here the modified class to handle TIME. Just inherit from MyTimePicker. See attached video.

Code: Select all

CLASS MyTimePicker INHERIT DateTimePicker
  
ASSIGN SelectedTime( cNewTime ) CLASS MyTimePicker
 LOCAL lpSysTime is _WINSYSTEMTIME
 LOCAL dwFlag  as DWORD 
 local dToday := Today() as date
 MemClear( @lpSysTime , _sizeof( _WINSYSTEMTIME ) )
 IF cNewTime == null_string
    dwFlag := GDT_NONE
 ELSE    
 
  lpSysTime.wYear  := word(Year( dToday ))
  lpSysTime.wMonth := word(Month( dToday))
  lpSysTime.wDay  := word(Day( dToday )) 	

  // the following assumes a time format hh:mm:ss for example: 05:20:00 in 24 hour format
  //  assign example: 
  // self:oDCDateTimePicker3:SelectedTime := "23:20:00"

  lpSysTime.wHour  := word(Val(Left(cNewTime,2)))                  // adjust your parsing code here
  lpSysTime.wMinute := word(Val(SubStr(cNewTime, 4,2)))       // adjust your parsing code here
  lpSysTime.wSecond  := 0
  lpSysTime.wMilliseconds := 0   
  
  dwFlag      := GDT_VALID
 ENDIF
 DateTime_SetSystemtime( self:Handle() , dwFlag , @lpSysTime )
RETURN cNewTime


ACCESS SelectedTime CLASS MyTimePicker
 LOCAL lpSysTime is _WINSYSTEMTIME
 LOCAL cResult  as string
 MemClear( @lpSysTime , _sizeof( _WINSYSTEMTIME ) )

// must pad 0 to time portions to proper 24 hour time format.  Jamal

 IF DateTime_GetSystemtime( self:handle() , @lpSysTime ) == GDT_VALID
   cResult := PadL(NTrim(lpSysTime.wHour),2,"0") + ":" +  PadL(NTrim(lpSysTime.wMinute),2,"0") + ":" + PadR(NTrim(lpSysTime.wSecond),2, "0")   
 ELSE
   cResult := null_string
 ENDIF 

RETURN cResult

FUNCTION DateTime_GetSystemtime( hdp as ptr , pst as _WINSYSTEMTIME ) as DWORD PASCAL
 RETURN DWORD( _cast , SendMessage( hdp , DTM_GETSYSTEMTIME, 0, LONG( _cast , pst ) ) )
FUNCTION DateTime_SetSystemtime( hdp as ptr , gd as DWORD , pst as _WINSYSTEMTIME ) as LOGIC PASCAL
 RETURN LOGIC( _cast , SendMessage( hdp , DTM_SETSYSTEMTIME, DWORD( _cast , gd ), LONG( _cast , pst ) ) ) [attachment=0]datetimepicker.gif[/attachment]
Attachments
datetimepicker.gif
datetimepicker.gif (382.19 KiB) Viewed 685 times
BiggyRat

Using DTP:IsNone

Post by BiggyRat »

Thanks Jamal, I can get it to work as you've shown, but that's not really my problem. Here's a link to a video:

https://cl.ly/2283012461df
Post Reply