Форум » GUI » CALENDAR с отметкой дат ? » Ответить

CALENDAR с отметкой дат ?

Softlog86: Подскажите , может есть какое-нибудь готовое решение или 'полуфабрикат' для следующей задачи : Имеется список дат (даты доставки товара , к примеру) - нужно как-то отображать календарь и устанавливать/снимать отметки на определенных датах .... в Контроле MONTHCALENDAR не нашел чтоб как-то это отображалось .....

Ответов - 17

Haz: Softlog86 пишет: готовое решение или 'полуфабрикат' готового нет, а полуфабрикат - TSBrowse по массиву 7х5 . Заполняй датами и крась как хочешь

Softlog86: Там ещё и календарь встраивать ... с днями недели , 30/31 числа и тд ....

Haz: Softlog86 пишет: Там ещё и календарь встраивать ... с днями недели , 30/31 числа и тд .... Ну ты лентяй ) Стало интересно за пол часа накидал. Если есть желание - продолжай дальше сам для сборки нужна hbnf.lib отметка - даблклик или энтер [pre2] #include "minigui.ch" #include "tsbrowse.ch" STATIC aFont := {} MEMVAR oBrw_1 FUNCTION Main() LOCAL i := 0, j := 0, n := 0 LOCAL dFirst := Date() LOCAL aDay := {"ПН", "ВТ", "СР", "ЧТ", "ПТ", "СБ", "ВС"} SET DATE TO GERMAN FT_DATECNFG(, 2 ) DEFINE WINDOW Form_0 ; At 0, 0 ; WIDTH 600 ; HEIGHT 600 ; TITLE 'TsBrowse calendar' ; ICON 'lupa.ico' ; MAIN ; NOMAXIMIZE ; NOSIZE ON KEY ESCAPE ACTION ThisWindow.Release END WINDOW DEFINE TBrowse oBrw ; AT GetProperty("Form_0", 'Row') + 30, GetProperty("Form_0", 'Col') + 15 ; OF Form_0 ; WIDTH GetProperty("Form_0", 'Width') - 38 ; HEIGHT GetProperty("Form_0", 'Height') - 168 ; FONT "Arial" ; SIZE 9 ; GRID END TBROWSE oBrw:SetArray( Array(5,7), TRUE) __objAddData(oBrw, 'aMark' ) __objAddData(oBrw, 'aDate' ) oBrw:aMark := Array(5,7) oBrw:aDate := Array(5,7) dFirst := FT_ACCTWEEK(BOM(Date()) )[2] n := 0 for i := 1 To 5 For j := 1 TO 7 oBrw:aDate[ i ][ j ] := dFirst + n oBrw:aMark[ i ][ j ] := FALSE n++ end end oBrw:nHeightCell := 80 oBrw:nHeightHead := 30 oBrw:lNoHScroll := .T. oBrw:nFreeze := 7 oBrw:lLockFreeze := FALSE oBrw:lNoChangeOrd := TRUE oBrw:SetColor( { 3 }, { { || RGB(255,242,0) } }, ) oBrw:SetColor( { 4 }, { { || { RGB( 43, 189, 198 ), RGB(3,113,160) } } }, ) oBrw:Setcolor( { 6 }, { -RGB(220, 0, 0) }, ) oBrw:Setcolor( { 2 }, { { || IF( IsMark(1) , RGB(200, 255, 200), RGB(240, 255, 240)) } }, 1 ) oBrw:Setcolor( { 2 }, { { || IF( IsMark(2) , RGB(200, 255, 200), RGB(240, 255, 240)) } }, 2 ) oBrw:Setcolor( { 2 }, { { || IF( IsMark(3) , RGB(200, 255, 200), RGB(240, 255, 240)) } }, 3 ) oBrw:Setcolor( { 2 }, { { || IF( IsMark(4) , RGB(200, 255, 200), RGB(240, 255, 240)) } }, 4 ) oBrw:Setcolor( { 2 }, { { || IF( IsMark(5) , RGB(200, 255, 200), RGB(240, 255, 240)) } }, 5 ) oBrw:Setcolor( { 2 }, { { || IF( IsMark(6) , RGB(200, 255, 200), RGB(240, 255, 240)) } }, 6 ) oBrw:Setcolor( { 2 }, { { || IF( IsMark(7) , RGB(200, 255, 200), RGB(240, 255, 240)) } }, 7 ) oBrw:Setcolor( { 1 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][1] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 1 ) oBrw:Setcolor( { 1 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][2] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 2 ) oBrw:Setcolor( { 1 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][3] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 3 ) oBrw:Setcolor( { 1 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][4] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 4 ) oBrw:Setcolor( { 1 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][5] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 5 ) oBrw:Setcolor( { 1 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][6] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 6 ) oBrw:Setcolor( { 1 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][7] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 7 ) oBrw:Setcolor( { 5 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][1] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 1 ) oBrw:Setcolor( { 5 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][2] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 2 ) oBrw:Setcolor( { 5 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][3] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 3 ) oBrw:Setcolor( { 5 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][4] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 4 ) oBrw:Setcolor( { 5 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][5] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 5 ) oBrw:Setcolor( { 5 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][6] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 6 ) oBrw:Setcolor( { 5 }, { { || IF( Month( oBrw:aDate[oBrw:nAt][7] ) == Month( date() ) , RGB(0, 0, 0), RGB(200, 200, 200)) } }, 7 ) for i := 1 To 7 oBrw:aColumns[ i ]:cHeading := aDay[ i ] oBrw:SetColSize( i, 80) oBrw:aColumns[ i ]:bData := &( "{|| GetDate( " + NTOC( i ) + ")}") oBrw:aColumns[ i ]:nAlign := DT_CENTER oBrw:aColumns[ i ]:lEdit := TRUE oBrw:aColumns[ i ]:bPrevEdit := { || Mark() , .F.} end CENTER WINDOW Form_0 ACTIVATE WINDOW Form_0 RETURN Nil FUNC GetDate( nCol ) RETURN DAY(oBrw:aDate[oBrw:nAt][nCol] ) Func Mark(i) oBrw:aMark[oBrw:nAt][oBrw:nCell] := !oBrw:aMark[oBrw:nAt][oBrw:nCell] oBrw:refresh(FALSE) RETURN NIL Func IsMark(n) RETURN oBrw:aMark[oBrw:nAt][n] [/pre2]


Softlog86: Это было не самое важное .... подождёт . Так , на будущее . За такую работу - респектище !

Dima: Haz Слегка повело текст где [ i ] , у тебя без пробелов. Без них выглядит так ...опа ЗЫ Все i в скобках скушало.

Haz: Dima пишет: Все i в скобах скушало. Понатыкал пробелов , спасиб !

Dima: Haz пишет: Понатыкал пробелов Но не везде. Поправил.

Softlog86: Протестировал ... глючит немного ..... Кликаю на ячейку - перескакивает не на неё а на последнюю в том ряду . Иногда попадает туда куда нужно .... Может есть смысл добавить функцию MARK/UNMARK в контрол MONTHCALENDAR ? Ну и чтоб был массив отмеченных дат . Понял , что это невозможно .... Контрол сделан на основе виндового .

Haz: Softlog86 пишет: Протестировал ... глючит немного ..... поппробуй мою сборку , у меня не скачет https://yadi.sk/d/Xzyj5fPuqqQsq или ты про правый клик ??? так отключи его в бровсе вот это закоменти // oBrw:nFreeze := 7

Haz: а лучше фризу оставить oBrw:nFreeze := 7 и добавить oBrw:lNoMoveCols := .T.

Softlog86: Haz Ваш вариант работает корректно . А .PRG будет ?

Haz: Softlog86 пишет: А .PRG будет ? Окончательный пример, при смене месяца и года отметки стираются. Пример создан просто для демонстрации , отметки хранятся в самом объекте. В реальном применении можно их хранить в базе или в INI кто как захочет Отметить можно даблкликом или энтером PRG https://yadi.sk/d/sfgyn0lzqqZpV EXE https://yadi.sk/d/0eAz1u--qqZpG BAT https://yadi.sk/d/kis15hO_qqTZ8

SergKis: Игорь маленькая правка[pre2] Func Mark(i) If Month( oBrw:aDate[oBrw:nAt][oBrw:nCell] ) == Month( oBrw:dDate ) oBrw:aMark[oBrw:nAt][oBrw:nCell] := !oBrw:aMark[oBrw:nAt][oBrw:nCell] oBrw:DrawSelect() // oBrw:refresh(FALSE) EndIf RETURN NIL [/pre2]

Haz: SergKis пишет: маленькая правка Спасибо, так оптимальнее

gfilatov2002: Haz пишет: Спасибо, так оптимальнее Благодарю за отличный пример! Если нет возражений, то добавлю его в новую сборку с переводом названий дней недели на английский

Haz: gfilatov2002 пишет: Если нет возражений, то добавлю его в новую сборку с переводом названий дней недели на английский Возражений нет т.к. это именно пример . До практического использования еще далек

Softlog86: Так и напрашивается контрол :) . Хорошая визуализация по дням недели . Колонки с датами не всегда удобно , особенно когда дело касается каких-то недельных или ежемесячных операций/сделок и прочих событий .



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