Форум » GUI » Работа со временем в МиниГуи » Ответить

Работа со временем в МиниГуи

Andrey: В МиниГуи есть хороший объект DATEPICKER. А похожий объект есть для работы с Датой+Время ? Типа такого - datetimepicker ? Или хотя бы объект для времени есть ?

Ответов - 25, стр: 1 2 All

Haz: Andrey пишет: А похожий объект есть для работы с Датой+Время ? Типа такого - datetimepicker ? Вроде нет, лепил из двух контролов бутерброд для этого. Согласен что необходимость назрела

Andrey: Haz пишет: Вроде нет, лепил из двух контролов бутерброд для этого. А картинку покажи как у тебя получилось ?

Haz: Andrey пишет: А картинку покажи как у тебя получилось ? слева до входа в режим редактирования, справа во время редакции. Переход между контролами по tab


Andrey: Понял. Спасибо !

Andrey: Сделал заготовку для создания строки фильтра. [pre2]ANNOUNCE RDDSYS #define _HMG_OUTLOG #include "minigui.ch" Function Main Local nFSize := 16, cFName := "Arial" Local nWDate, nWTime, nCol, nRow, nG, nCol2 nWDate := 290 nWTime := 100 nG := 20 DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 600 ; HEIGHT 460 ; TITLE "MiniGUI Date + Time Demo" ; MAIN ; FONT cFName SIZE nFSize nRow := 50 nCol := nG @ nRow, nCol DATEPICKER Date_1 VALUE DATE() WIDTH nWDate HEIGHT nFSize*3 ; DATEFORMAT "dd'.'MMMM' 'yyyy" SHOWNONE nCol2 := Form_1.Date_1.Col + Form_1.Date_1.Width + nG @ nRow, nCol2 GETBOX Time_1 VALUE '000000' PICTURE "@R 99:99:99" ; WIDTH nWTime HEIGHT nFSize*3 nRow += Form_1.Date_1.Height + nG @ nRow, nCol DATEPICKER Date_2 VALUE DATE()+2 WIDTH nWDate HEIGHT nFSize*3 ; DATEFORMAT "dd'.'MMMM' 'yyyy" SHOWNONE @ nRow, nCol2 GETBOX Time_2 VALUE '235959' PICTURE "@R 99:99:99" ; WIDTH nWTime HEIGHT nFSize*3 nRow += Form_1.Date_2.Height + nG @ nRow, nCol BUTTON Button_1 CAPTION "Get search bar" ; WIDTH nWDate + nWTime + nG HEIGHT 35 ; ACTION ( Form_1.Label_1.Value := mySearchString() ) nRow += Form_1.Button_1.Height + nG * 2 @ nRow, nCol LABEL Label_1 VALUE "Search line:" WIDTH Form_1.Width - 40 ; HEIGHT 80 TOOLTIP "Search line" FONTCOLOR RED END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil Function mySearchString() Local cDate1, cDate2, cTime1, cTime2, cRet := "" cDate1 := HB_DTOC( Form_1.Date_1.Value, 'YYYY-MM-DD') cDate2 := HB_DTOC( Form_1.Date_2.Value, 'YYYY-MM-DD') cTime1 := Form_1.Time_1.Value cTime2 := Form_1.Time_2.Value cRet += '( HB_TSTOSTR(SKLAD->TSZ) >= "'+cDate1+'" .AND. ' cRet += 'HB_TSTOSTR(SKLAD->TSZ) <= "'+cDate2+'" )' cRet += ' ???? ' + cTime1 + ' ???? ' + cTime2 cRet += ' .AND. !DELETED()' Return cRet [/pre2] Возникли вопросы по вводу: 1) Как сделать по центру вертикально GETBOX Time_1 и Time_2 ? Почему то прижато к верхнему краю, некрасиво выглядит. 2) Как сделать ввод времени правильно ? Т.е. как в GETBOX проверять ввод до значений 23:59:59 ?

Петр: Andrey пишет: Возникли вопросы по вводу У Вас тема называется "Работа со временем в МиниГуи". Так вот, для времени в МиниГуи есть хороший объект элемент управления TIMEPICKER и пример есть соответствующий. Изучите, может и вопросы одни отпадут, а другие появятся..

Andrey: Петр пишет: для времени в МиниГуи есть хороший объект элемент управления TIMEPICKER Спасибо большое ! А то мой поиск Far'ом по примерам "datetime" не дал этого элемента. А я тут велосипед изобретаю...

Dima: Andrey пишет: А то мой поиск Far'ом по примерам "datetime" не дал этого элемента. Это смотря как искать А как же вот такой ? C:\MiniGUI\SAMPLES\BASIC\datetime\ Там живет TIMEPICKER

Andrey: Dima пишет: Это смотря как искать Поиск по содержимому файлов *.prg, строка поиска - "datetime" Вот и не нашёл сходу. Из-за этого и написал здесь, есть ли такой компонент. Начал свой компонент - время делать через GETBOX... Изобретать свой велосипед.

Петр: Andrey пишет: Сделал заготовку для создания строки фильтра. С TIMEPICKER заготовка, м.б., выглядела бы так [pre2]ANNOUNCE RDDSYS #define _HMG_OUTLOG #include "minigui.ch" Function Main Local nFSize := 16, cFName := "Arial" Local nWDate, nWTime, nCol, nRow, nG, nCol2 Local dDate, dDateTime, cTime dDateTime := hb_DateTime() dDate := hb_TToD( dDateTime, @cTime, "hh:mm:ss" ) nWDate := 290 nWTime := 110 nG := 20 DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 600 ; HEIGHT 460 ; TITLE "MiniGUI Date + Time Demo" ; MAIN ; FONT cFName SIZE nFSize nRow := 50 nCol := nG @ nRow, nCol DATEPICKER Date_1 VALUE dDate WIDTH nWDate HEIGHT nFSize*3 ; DATEFORMAT "dd' 'MMMM' 'yyyy" SHOWNONE UPDOWN nCol2 := Form_1.Date_1.Col + Form_1.Date_1.Width + nG @ nRow, nCol2 TIMEPICKER Time_1 WIDTH nWTime HEIGHT nFSize*3 ; TIMEFORMAT "HH:mm:ss" VALUE cTime nRow += Form_1.Date_1.Height + nG @ nRow, nCol DATEPICKER Date_2 VALUE dDate+2 WIDTH nWDate HEIGHT nFSize*3 ; DATEFORMAT "dd' 'MMMM' 'yyyy" SHOWNONE UPDOWN @ nRow, nCol2 TIMEPICKER Time_2 WIDTH nWTime HEIGHT nFSize*3 ; TIMEFORMAT "HH:mm:ss" VALUE "23:59:59" nRow += Form_1.Date_2.Height + nG @ nRow, nCol BUTTON Button_1 CAPTION "Get search bar" ; WIDTH nWDate + nWTime + nG HEIGHT 35 ; ACTION ( Form_1.Label_1.Value := mySearchString() ) nRow += Form_1.Button_1.Height + nG * 2 @ nRow, nCol LABEL Label_1 VALUE "Search line:" WIDTH Form_1.Width - 40 ; HEIGHT 80 TOOLTIP "Search line" FONTCOLOR RED END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil Function mySearchString() Local cDate1, cDate2, cTime1, cTime2 Local cRet := '(SKLAD->TSZ >= t"%s %s" .AND. SKLAD->TSZ <= t"%s %s") .AND. !DELETED()' cDate1 := hb_DToC( Form_1.Date_1.Value, 'YYYY-MM-DD') cDate2 := hb_DToC( Form_1.Date_2.Value, 'YYYY-MM-DD') cTime1 := Form_1.Time_1.Value cTime2 := Form_1.Time_2.Value Return hb_StrFormat(cRet, cDate1, cTime1, cDate2, cTime2) [/pre2]

SergKis: Петр Можно ли в TIMEPCKER из примера сбросить сразу все значения в 0, типа очистить поле, а в представленном варианте DATAPICKER вызвать MONTHCALENDAR или очистить значения - пустая дата, т.е. за все периоды по дате запрос, могу не знать, какие даты в базе есть ? Не праздный вопрос, еще ~ 2012 году клиенты плевались от этих контролов, пришлось заменить их на GETBOX-ы, с тех пор не использую их PS Вопрос с MONTHCALENDAR отпал, нашелся вызов и клавиша F4

Andrey: Петр пишет: С TIMEPICKER заготовка, м.б., выглядела бы так Спасибо БОЛЬШОЕ ! SergKis пишет: Не праздный вопрос, еще ~ 2012 году клиенты плевались от этих контролов, пришлось заменить их на GETBOX-ы, с тех пор не использую их Да, управление этого элемента фиговая. Но у меня юзера ооочень редко будут это использовать, сделал это скорее для себя на всякий случай.

Петр: SergKis пишет: Можно ли в TIMEPCKER из примера сбросить сразу все значения в 0, типа очистить поле Да, можно сразу указать свойство VALUE "00:00:00". Можно программно сбросить - Form_1.Time_2.Value := "00:00:00" или так SetTimePick( Form_1.Time_1.Handle, 0, 0, 0 )

SergKis: Петр пишет Можно программно сбросить - Form_1.Time_2.Value := "00:00:00" или так SetTimePick( Form_1.Time_1.Handle, 0, 0, 0 ) Это да, но требуется контрол, с которого придет такая команда. Если TIMEPICKER исп. в ячейке TsBrowse, то получается только руками, пройдя по всем элементам. С GetBox почти так же, но чуть проще (правда есть блок на VALID) [pre2] @ y, x2 GETBOX Time_1 OBJ oGet VALUE space(6) WIDTH nWTime HEIGHT nFSize*3 ; PICTURE "@R 99:99:99" VALID {|og| bValid( og ) } ; ON GOTFOCUS {|| SendMessage(This.Handle, 177 /*EM_SETSEL*/, 0, Len( This.Value )) } ; ON INIT {|| _SetAlign ( This.Name, ThisWindow.Name, "CENTER" ) } ... * ----------------------------------------------------------------------------------- * STATIC FUNCTION bValid( oGet ) // проверка правильности времени в GetBox * ----------------------------------------------------------------------------------- * LOCAL lRet, lVl1, lVl2, lVl3, nVal LOCAL cVal := oGet:VarGet() lVl1 := lVl2 := lVl3 := .F. nVal := Val(left(cVal, 2)) IF nVal >= 0 .and. nVal < 24 ; lVl1 := .T. ENDIF nVal := Val(subs(cVal, 3, 2)) IF nVal >= 0 .and. nVal < 60 ; lVl2 := .T. ENDIF nVal := Val(subs(cVal, 5, 2)) IF nVal >= 0 .and. nVal < 60 ; lVl3 := .T. ENDIF lRet := lVl1 .and. lVl2 .and. lVl3 RETURN lRet [/pre2] bValid() можно усиливать, если надо, до управления кареткой cTime := left(trim(This.Time_1.Value)+repl('0',6), 6) позволяет вводить в такой getbox только левую часть времени, например 10 => 100000

Петр: SergKis пишет: Это да, но требуется контрол, с которого придет такая команда. Если TIMEPICKER исп. в ячейке TsBrowse, то получается только руками, пройдя по всем элементам. TIMEPICKER, как и DATEPICKER, построен на стандартном для Windows элементе управления DTP (date and time picker), соответственно и поведение его предопределено возможностями DTP. Если он не устраивает - какие проблемы, ищем адекватную замену. Но вот для заготовки Андрея (и не только) его возможностей, ИМХО, хватает. Еще один вариант [pre2]ANNOUNCE RDDSYS #define _HMG_OUTLOG #include "minigui.ch" Function Main Local nFSize := 16, cFName := "Arial" Local nWDate := 290, nWTime := 160, nRow := 40, nCol := nG := 20, nCol2 Local dDate, dDateTime, cTime dDateTime := hb_DateTime() dDate := hb_TToD( dDateTime, @cTime, "hh:mm:ss" ) DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 600 ; HEIGHT 500 ; TITLE "MiniGUI Date + Time Demo" ; MAIN ; FONT cFName SIZE nFSize @ nRow, nCol DATEPICKER Date_1 /*VALUE dDate*/ WIDTH nWDate HEIGHT nFSize*3 ; DATEFORMAT "dd' 'MMMM' 'yyyy" SHOWNONE nCol2 := Form_1.Date_1.Col + Form_1.Date_1.Width + nG @ nRow, nCol2 TIMEPICKER Time_1 WIDTH nWTime HEIGHT nFSize*3 ; TIMEFORMAT "HH:mm:ss" /*VALUE cTime*/ SHOWNONE ; ON GOTFOCUS {|| SendMessage(This.Handle, 177 /*EM_SETSEL*/, 0, Len( This.Value )) } nRow += Form_1.Date_1.Height + nG @ nRow, nCol DATEPICKER Date_2 VALUE dDate+2 WIDTH nWDate HEIGHT nFSize*3 ; DATEFORMAT "dd' 'MMMM' 'yyyy" SHOWNONE @ nRow, nCol2 TIMEPICKER Time_2 WIDTH nWTime HEIGHT nFSize*3 ; TIMEFORMAT "HH:mm:ss" VALUE "23:59:59" SHOWNONE nRow += Form_1.Date_2.Height + nG * 2 @ nRow, nCol BUTTON Button_1 CAPTION "Get a FILTER condition" ; WIDTH nWDate + nWTime + nG HEIGHT 35 ; ACTION ( Form_1.Label_1.Value := mySearchString() ) nRow += Form_1.Button_1.Height + 5 @ nRow, nCol BUTTON Button_2 CAPTION "UnCheck DATEPICKUPs (Set to Null)" ; WIDTH nWDate + nWTime + nG HEIGHT 35 ; ACTION ( SetDatePickNull( Form_1.Date_1.Handle ), SetDatePickNull( Form_1.Date_2.Handle ) ) nRow += Form_1.Button_1.Height + 5 @ nRow, nCol BUTTON Button_3 CAPTION "UnCheck TIMEPICKUPs (Set to Null)" ; WIDTH nWDate + nWTime + nG HEIGHT 35 ; ACTION ( SetDatePickNull( Form_1.Time_1.Handle ), SetDatePickNull( Form_1.Time_2.Handle ) ) nRow += Form_1.Button_1.Height + 5 @ nRow, nCol BUTTON Button_4 CAPTION "Set TIMEPICKUPs to '00:00:00'" ; WIDTH nWDate + nWTime + nG HEIGHT 35 ; ACTION (Form_1.Time_1.Value := "00:00:00", Form_1.Time_2.Value := "00:00:00") //ACTION ( SetTimePick( Form_1.Time_1.Handle, 0, 0, 0 ), SetTimePick( Form_1.Time_2.Handle, 0, 0, 0 ) ) nRow += Form_1.Button_4.Height + nG * 2 @ nRow, nCol LABEL Label_1 VALUE "Search line:" WIDTH Form_1.Width - 40 ; HEIGHT 80 TOOLTIP "Search line" FONTCOLOR RED END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil Function mySearchString() Local dDate1, dDate2 Local cTime1, cTime2 Local cRet := "" dDate1 := Form_1.Date_1.Value dDate2 := Form_1.Date_2.Value //cTime1 := iif(GetDatePickHour(Form_1.Time_1.Handle) != -1, Form_1.Time_1.Value, "00:00:00") //cTime2 := iif(GetDatePickHour(Form_1.Time_2.Handle) != -1, Form_1.Time_2.Value, "00:00:00") cTime1 := Form_1.Time_1.Value cTime2 := Form_1.Time_2.Value IF (Empty(dDate1) .AND. Empty(dDate2)) // Ничего не делаем, как вариант - выдаем предупреждение пользователю ELSEIF (Empty(dDate1) .AND. !Empty(dDate2)) IF Empty(cTime2) cRet := 'SKLAD->TSZ <= 0d' + DtoS(dDate2) ELSE cRet := 'SKLAD->TSZ <= t"' + hb_DToC(dDate2, 'YYYY-MM-DD') + cTime2 + ' .AND. !DELETED()' ENDIF ELSEIF (Empty(dDate2) .AND. !Empty(dDate1)) IF Empty(cTime1) cRet := 'SKLAD->TSZ >= 0d' + DtoS(dDate1) ELSE cRet := 'SKLAD->TSZ >= t"' + hb_DToC(dDate1, 'YYYY-MM-DD') + cTime1 + ' .AND. !DELETED()' ENDIF ELSE IF (Empty(cTime1) .OR. Empty(cTime2)) cRet := '(SKLAD->TSZ >= 0d%s .AND. SKLAD->TSZ <= 0d%s") .AND. !DELETED()' cRet := hb_StrFormat(cRet, hb_DToC( dDate1, 'YYYY-MM-DD'), hb_DToC( dDate2, 'YYYY-MM-DD')) ELSE cRet := '(SKLAD->TSZ >= t"%s %s" .AND. SKLAD->TSZ <= t"%s %s") .AND. !DELETED()' cRet := hb_StrFormat(cRet, hb_DToC( dDate1, 'YYYY-MM-DD'), cTime1, hb_DToC( dDate2, 'YYYY-MM-DD'), cTime2) ENDIF ENDIF Return cRet [/pre2]

Петр: Петр пишет: Еще один вариант Что здесь можно улучшить (лень ) 1) UI 2) Нормализация dDate1 и dDate2 (dDate1 < dDate2) 3) RANGE (RANGEMIN, RANGEMAX) например Form_1.Date_1.RangeMin := DBORDERINFO(DBOI_SCOPETOP) Form_1.Date_2.RangeMax := DBORDERINFO(DBOI_SCOPEBOTTOM)

Петр: Еще один вариант [pre2]ANNOUNCE RDDSYS #define _HMG_OUTLOG #include "minigui.ch" Function Main() Local nFSize := 16, cFName := "Arial" Local nWDate := 360, nRow := 30, nCol := nG := 20 Local dDateTime, dDate DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 420 ; HEIGHT 300 ; TITLE "MiniGUI DateTime Demo" ; MAIN ; FONT cFName SIZE nFSize dDateTime := hb_DateTime() dDate := hb_TToD(dDateTime) @ nRow, nCol DATEPICKER Date_1 /*VALUE dDate*/ WIDTH nWDate HEIGHT nFSize*3 ; SHOWNONE UPDOWN DATEFORMAT "dd MMMM yyyy' | 'HH:mm:ss" // important dtp_SetDT(Form_1.Date_1.Handle, dDateTime) nRow += Form_1.Date_1.Height + nG @ nRow, nCol DATEPICKER Date_2 VALUE (dDate += 2) WIDTH nWDate HEIGHT nFSize*3 ; SHOWNONE UPDOWN DATEFORMAT "dd MMMM yyyy' | 'HH:mm:ss" // important dtp_SetDT(Form_1.Date_2.Handle, Year(dDate), Month(dDate), Day(dDate), 23, 59, 59) nRow += Form_1.Date_2.Height + nG @ nRow, nCol BUTTON Button_1 CAPTION "Get a FILTER condition" ; WIDTH nWDate HEIGHT 35 ; ACTION MsgInfo( mySearchString() ) nRow += Form_1.Button_1.Height + 5 @ nRow, nCol BUTTON Button_2 CAPTION "UnCheck DATEPICKUPs (Set to Null)" ; WIDTH nWDate HEIGHT 35 ; ACTION ( SetDatePickNull( Form_1.Date_1.Handle ), SetDatePickNull( Form_1.Date_2.Handle ) ) END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil Function mySearchString() Local nHandle1, nHandle2 Local tDateTime1, tDateTime2 Local cCondition := "" nHandle1 := Form_1.Date_1.Handle nHandle2 := Form_1.Date_2.Handle IF (dtp_IsChecked(nHandle1) .AND. dtp_IsChecked(nHandle2)) tDateTime1 := dtp_GetDT(nHandle1) tDateTime2 := dtp_GetDT(nHandle2) cCondition := hb_StrFormat( 'SKLAD->TSZ >= t"%s" .AND. SKLAD->TSZ <= t"%s"', ; hb_TToC(tDateTime1, "YYYY-MM-DD", "hh:mm:ss.fff"), ; hb_TToC(tDateTime2, "YYYY-MM-DD", "hh:mm:ss.fff")) ELSEIF dtp_IsChecked(nHandle1) tDateTime1 := dtp_GetDT(nHandle1) cCondition := 'SKLAD->TSZ >= t"' + hb_TToC(tDateTime1, "YYYY-MM-DD", "hh:mm:ss.fff") + '"' ELSEIF dtp_IsChecked(nHandle2) tDateTime2 := dtp_GetDT(nHandle2) cCondition := 'SKLAD->TSZ <= t"' + hb_TToC(tDateTime2, "YYYY-MM-DD", "hh:mm:ss.fff") + '"' ELSE cCondition := "No condition" ENDIF Return cCondition #pragma BEGINDUMP #include <mgdefs.h> #include <commctrl.h> #include "hbdate.h" HB_FUNC( DTP_SETDT ) { HWND hwnd; SYSTEMTIME sysTime; hwnd = ( HWND ) HB_PARNL( 1 ); if( HB_ISDATETIME( 2 ) ) { int iYear, iMonth, iDay, iHour, iMinute, iSecond, iMSec; hb_timeStampUnpack( hb_partd( 2 ), &iYear, &iMonth, &iDay, &iHour, &iMinute, &iSecond, &iMSec ); sysTime.wYear = ( WORD ) iYear; sysTime.wMonth = ( WORD ) iMonth; sysTime.wDay = ( WORD ) iDay; sysTime.wDayOfWeek = 0; sysTime.wHour = ( WORD ) iHour; sysTime.wMinute = ( WORD ) iMinute; sysTime.wSecond = ( WORD ) iSecond; sysTime.wMilliseconds = ( WORD ) iMSec; } else if( HB_ISDATE( 2 ) ) { //TODO } else { sysTime.wYear = ( WORD ) hb_parnidef( 2, 2005 ); sysTime.wMonth = ( WORD ) hb_parnidef( 3, 1 ); sysTime.wDay = ( WORD ) hb_parnidef( 4, 1 ); sysTime.wDayOfWeek = 0; if( hb_pcount() >= 7 ) { sysTime.wHour = ( WORD ) hb_parni( 5 ); sysTime.wMinute = ( WORD ) hb_parni( 6 ); sysTime.wSecond = ( WORD ) hb_parni( 7 ); sysTime.wMilliseconds = ( WORD ) hb_parni( 8 ); } else { sysTime.wHour = 0; sysTime.wMinute = 0; sysTime.wSecond = 0; sysTime.wMilliseconds = 0; } } SendMessage( hwnd, DTM_SETSYSTEMTIME, GDT_VALID, ( LPARAM ) &sysTime ); } extern HB_EXPORT double hb_timeStampPack( int iYear, int iMonth, int iDay, int iHour, int iMinutes, int iSeconds, int iMSec ); HB_FUNC( DTP_GETDT ) { SYSTEMTIME st; double dTimeStamp; SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ); dTimeStamp = hb_timeStampPack( st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds ); hb_rettd( dTimeStamp ); } HB_FUNC( DTP_ISCHECKED ) { SYSTEMTIME st; if( SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ) == GDT_VALID ) hb_retl( HB_TRUE ); else hb_retl( HB_FALSE ); } #pragma ENDDUMP[/pre2] Базируется на возможностях DATEPICKER. В связи с ограничениями, накладываемыми существующими встроенными MiniGUI функциями, добавлены несколько новых C-level функций. Enjoy

Andrey: Петр пишет: Еще один вариант Отличный вариант ! А как можно сделать доп.кнопку для смены времени на 00:00:00 ?

Andrey: Вот заготовка ! [pre2]/* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2021 Петр <????????> * * Пример работы Дата + Время / Example of work Date + Time */ ANNOUNCE RDDSYS #include "minigui.ch" Function Main() Local nFSize := 16, cFName := "Arial" Local nWDate := 360, nRow := 30, nCol := nG := 20 Local dDateTime, dDate, nCol2, nHSay := nFSize*3 DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 530 ; HEIGHT 300 ; TITLE "MiniGUI DateTime Demo" ; MAIN ; FONT cFName SIZE nFSize dDateTime := hb_DateTime() dDate := hb_TToD(dDateTime) @ nRow, nCol DATEPICKER Date_1 /*VALUE dDate*/ WIDTH nWDate HEIGHT nHSay ; SHOWNONE UPDOWN DATEFORMAT "dd MMMM yyyy' | 'HH:mm:ss" // important dtp_SetDT(Form_1.Date_1.Handle, dDateTime) nCol2 := nCol + Form_1.Date_1.Width + 10 @ nRow, nCol2 BUTTONEX Btn_11 WIDTH nHSay HEIGHT nHSay CAPTION ''; PICTURE "MINIGUI_EDIT_CANCEL" NOHOTLIGHT NOXPSTYLE HANDCURSOR ; ACTION (MsgDebug( 'Form_1.Date_1.???? := "00:00:00" - как это сделать ?' ) ) nCol2 += Form_1.Btn_11.Width + 10 @ nRow, nCol2 BUTTONEX Btn_12 WIDTH nHSay HEIGHT nHSay CAPTION ''; PICTURE "MINIGUI_EDIT_OK" NOHOTLIGHT NOXPSTYLE HANDCURSOR ; ACTION (MsgDebug( 'Form_1.Date_1.???? := "23:59:59" - как это сделать ?' ) ) nRow += Form_1.Date_1.Height + nG @ nRow, nCol DATEPICKER Date_2 VALUE (dDate += 2) WIDTH nWDate HEIGHT nHSay ; SHOWNONE UPDOWN DATEFORMAT "dd MMMM yyyy' | 'HH:mm:ss" // important dtp_SetDT(Form_1.Date_2.Handle, Year(dDate), Month(dDate), Day(dDate), 23, 59, 59) nCol2 := nCol + Form_1.Date_2.Width + 10 @ nRow, nCol2 BUTTONEX Btn_21 WIDTH nHSay HEIGHT nHSay CAPTION ''; PICTURE "MINIGUI_EDIT_CANCEL" NOHOTLIGHT NOXPSTYLE HANDCURSOR ; ACTION (MsgDebug( 'Form_1.Date_2.???? := "00:00:00" - как это сделать ?' ) ) nCol2 += Form_1.Btn_21.Width + 10 @ nRow, nCol2 BUTTONEX Btn_22 WIDTH nHSay HEIGHT nHSay CAPTION ''; PICTURE "MINIGUI_EDIT_OK" NOHOTLIGHT NOXPSTYLE HANDCURSOR ; ACTION (MsgDebug( 'Form_1.Date_2.???? := "23:59:59" - как это сделать ?' ) ) nRow += Form_1.Date_2.Height + nG @ nRow, nCol BUTTON Button_1 CAPTION "Get a FILTER condition" ; WIDTH nWDate HEIGHT 35 ; ACTION MsgInfo( mySearchString() ) nRow += Form_1.Button_1.Height + 5 @ nRow, nCol BUTTON Button_2 CAPTION "UnCheck DATEPICKUPs (Set to Null)" ; WIDTH nWDate HEIGHT 35 ; ACTION ( SetDatePickNull( Form_1.Date_1.Handle ), SetDatePickNull( Form_1.Date_2.Handle ) ) END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil Function mySearchString() Local nHandle1, nHandle2 Local tDateTime1, tDateTime2 Local cCondition := "" nHandle1 := Form_1.Date_1.Handle nHandle2 := Form_1.Date_2.Handle IF (dtp_IsChecked(nHandle1) .AND. dtp_IsChecked(nHandle2)) tDateTime1 := dtp_GetDT(nHandle1) tDateTime2 := dtp_GetDT(nHandle2) cCondition := hb_StrFormat( 'SKLAD->TSZ >= t"%s" .AND. SKLAD->TSZ <= t"%s"', ; hb_TToC(tDateTime1, "YYYY-MM-DD", "hh:mm:ss.fff"), ; hb_TToC(tDateTime2, "YYYY-MM-DD", "hh:mm:ss.fff")) ELSEIF dtp_IsChecked(nHandle1) tDateTime1 := dtp_GetDT(nHandle1) cCondition := 'SKLAD->TSZ >= t"' + hb_TToC(tDateTime1, "YYYY-MM-DD", "hh:mm:ss.fff") + '"' ELSEIF dtp_IsChecked(nHandle2) tDateTime2 := dtp_GetDT(nHandle2) cCondition := 'SKLAD->TSZ <= t"' + hb_TToC(tDateTime2, "YYYY-MM-DD", "hh:mm:ss.fff") + '"' ELSE cCondition := "No condition" ENDIF Return cCondition #pragma BEGINDUMP #include <mgdefs.h> #include <commctrl.h> #include "hbdate.h" HB_FUNC( DTP_SETDT ) { HWND hwnd; SYSTEMTIME sysTime; hwnd = ( HWND ) HB_PARNL( 1 ); if( HB_ISDATETIME( 2 ) ) { int iYear, iMonth, iDay, iHour, iMinute, iSecond, iMSec; hb_timeStampUnpack( hb_partd( 2 ), &iYear, &iMonth, &iDay, &iHour, &iMinute, &iSecond, &iMSec ); sysTime.wYear = ( WORD ) iYear; sysTime.wMonth = ( WORD ) iMonth; sysTime.wDay = ( WORD ) iDay; sysTime.wDayOfWeek = 0; sysTime.wHour = ( WORD ) iHour; sysTime.wMinute = ( WORD ) iMinute; sysTime.wSecond = ( WORD ) iSecond; sysTime.wMilliseconds = ( WORD ) iMSec; } else if( HB_ISDATE( 2 ) ) { //TODO } else { sysTime.wYear = ( WORD ) hb_parnidef( 2, 2005 ); sysTime.wMonth = ( WORD ) hb_parnidef( 3, 1 ); sysTime.wDay = ( WORD ) hb_parnidef( 4, 1 ); sysTime.wDayOfWeek = 0; if( hb_pcount() >= 7 ) { sysTime.wHour = ( WORD ) hb_parni( 5 ); sysTime.wMinute = ( WORD ) hb_parni( 6 ); sysTime.wSecond = ( WORD ) hb_parni( 7 ); sysTime.wMilliseconds = ( WORD ) hb_parni( 8 ); } else { sysTime.wHour = 0; sysTime.wMinute = 0; sysTime.wSecond = 0; sysTime.wMilliseconds = 0; } } SendMessage( hwnd, DTM_SETSYSTEMTIME, GDT_VALID, ( LPARAM ) &sysTime ); } extern HB_EXPORT double hb_timeStampPack( int iYear, int iMonth, int iDay, int iHour, int iMinutes, int iSeconds, int iMSec ); HB_FUNC( DTP_GETDT ) { SYSTEMTIME st; double dTimeStamp; SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ); dTimeStamp = hb_timeStampPack( st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds ); hb_rettd( dTimeStamp ); } HB_FUNC( DTP_ISCHECKED ) { SYSTEMTIME st; if( SendMessage( ( HWND ) HB_PARNL( 1 ), DTM_GETSYSTEMTIME, 0, ( LPARAM ) &st ) == GDT_VALID ) hb_retl( HB_TRUE ); else hb_retl( HB_FALSE ); } #pragma ENDDUMP [/pre2]

Петр: Andrey пишет: А как можно сделать доп.кнопку для смены времени на 00:00:00 ? Как-то так [pre2]Procedure dtp_ChangeTimePart(nHandle, nHour, nMinute, nSecond) Local tDateTime, dDate hb_defaultValue(@nHour, 0) hb_defaultValue(@nMinute, 0) hb_defaultValue(@nSecond, 0) IF dtp_IsChecked(nHandle) tDateTime := dtp_GetDT(nHandle) dDate := hb_TToD(tDateTime) ELSE dDate := Date() ENDIF tDateTime := hb_DateTime(Year(dDate), Month(dDate), Day(dDate), nHour, nMinute, nSecond) Return dtp_SetDT(nHandle, tDateTime) [/pre2] ACTION (dtp_ChangeTimePart(Form_1.Date_1.Handle, 0, 0, 0)) или ACTION (dtp_ChangeTimePart(Form_1.Date_1.Handle)) ACTION (dtp_ChangeTimePart(Form_1.Date_1.Handle, 23, 59, 59)) P.S. Если нужно задавать время в виде строки "hh:mm:ss" (иногда удобно) делайте функцию-обертку для dtp_ChangeTimePart с парсингом и валидацией.



полная версия страницы