Страница 1 из 2

Календарь :)

Добавлено: 13 Октябрь 2017, 16:40
Admin
К слову о календарях. Странного захотелось. Что то хреново получается.
Побаловался и бросил пока.
2017-10-13_23-38-27.png
2017-10-13_23-38-27.png (6.89 КБ) 2637 просмотров

Код: Выделить всё

  PROGRAM

  MAP
  END
  
ePrevMonth                      EQUATE(-1)
eCurrMonth                      EQUATE(0)
eNextMonth                      EQUATE(1)

CalendarQueue QUEUE,TYPE
Col1            STRING(2)
Col2            STRING(2)
Col3            STRING(2)
Col4            STRING(2)
Col5            STRING(2)
Col6            STRING(2)
Col7            STRING(2)
Date1           LONG
Date2           LONG
Date3           LONG
Date4           LONG
Date5           LONG
Date6           LONG
Date7           LONG
              END
              
CalendarClass   CLASS
Feq               LONG 
Date              LONG
Calendar          &CalendarQueue 
Construct         PROCEDURE  
Destruct          PROCEDURE  
Init              PROCEDURE(LONG Feq, LONG lDate)
BuildCalendar     PROCEDURE
GetDayNumber      PROCEDURE(LONG lDate),BYTE
TakeEvent         PROCEDURE()
                END
                
CalCombo        CalendarClass
CalList         CalendarClass

Window WINDOW('Date strange'),AT(,,271,112),GRAY,FONT('Tahoma',8,,,CHARSET:CYRILLIC)
    PROMPT('Combo... стрелки вправо, влево не работают :-('),AT(14,12),USE(?PROMPT1)
    COMBO(@D06.B),AT(14,25,99),USE(?CalendarCombo),COLUMN,DROP(8,126)
    PROMPT('List... вывести что то в Entry х.з. как'),AT(14,49),USE(?PROMPT2)
    LIST,AT(14,63,99),USE(?CalendarList),COLUMN,DROP(8,126)
  END

  CODE
  OPEN(Window)
  CalCombo.Init(?CalendarCombo, TODAY())
  CalList.Init(?CalendarList, TODAY())
  CalCombo.BuildCalendar
  CalList.BuildCalendar
  ACCEPT
    CalCombo.TakeEvent()  
    CalList.TakeEvent()
  END
  CLOSE(Window)

CalendarClass.Construct         PROCEDURE  
  CODE
  SELF.Calendar &= NEW(CalendarQueue)
  
CalendarClass.Destruct          PROCEDURE  
  CODE
  FREE(SELF.Calendar)
  DISPOSE(SELF.Calendar)

CalendarClass.Init              PROCEDURE(LONG Feq, LONG lDate)  
  CODE
  SELF.Date = lDate
  SELF.Feq = Feq
  SELF.Feq{PROP:From} = SELF.Calendar
  SELF.Feq{PROP:Format} = '18CF@S2@18CF@S2@18CF@S2@18CF@S2@18CF@S2@18CF@S2@18CF@S2@'
  SELF.Feq{PROP:ScreenText} =  FORMAT(lDate, '@'&SELF.Feq{PROP:Text})
  SELF.Feq{PROP:LineHeight} = 12
  SELF.Feq{PROPLIST:Header,1} = 'Пн'
  SELF.Feq{PROPLIST:Header,2} = 'Вт'
  SELF.Feq{PROPLIST:Header,3} = 'Ср'
  SELF.Feq{PROPLIST:Header,4} = 'Чт'
  SELF.Feq{PROPLIST:Header,5} = 'Пт'
  SELF.Feq{PROPLIST:Header,6} = 'Сб'
  SELF.Feq{PROPLIST:Header,7} = 'Вс'
  
CalendarClass.BuildCalendar     PROCEDURE
lDate                           LONG
lDay                            BYTE
lRow                            BYTE
lCol                            BYTE  
lPrevMonthFromDay               BYTE
lCurMonthLastDay                BYTE
lFillPrevMonth                  BYTE 
lCurField                       ANY   
lCurFieldDate                   ANY   
lCurDay                         BYTE
lEnd                            BYTE
lMonth                          LONG
lCurrentDate                    LONG
  CODE
  lDate = DATE(MONTH(SELF.Date), 1, YEAR(SELF.Date))
  lDay = SELF.GetDayNumber(lDate)
  IF lDay > 1 
    lPrevMonthFromDay = DAY(lDate - (lDay - 1))
    lFillPrevMonth = TRUE
  END
  lCurMonthLastDay = DAY(DATE(MONTH(SELF.Date)+1,1,YEAR(SELF.Date))-1)
  
  lMonth = ePrevMonth
  LOOP lRow = 1 TO 6
    CLEAR(SELF.Calendar)
    LOOP lCol = 1 TO 7
      lCurField &= WHAT(SELF.Calendar, lCol)
      lCurFieldDate &= WHAT(SELF.Calendar, lCol + 7)
      IF lFillPrevMonth = TRUE
        lCurField = lPrevMonthFromDay
        lCurrentDate = DATE(MONTH(SELF.Date)+lMonth, lPrevMonthFromDay ,YEAR(SELF.Date))
        lCurFieldDate = lCurrentDate
        lPrevMonthFromDay += 1
        lDay -=1
        IF lDay = 1 
          lFillPrevMonth = FALSE 
          lMonth = eCurrMonth
        END
      ELSE  
        lCurDay += 1
        IF lCurDay > lCurMonthLastDay OR lMonth = eNextMonth
          IF SELF.GetDayNumber(DATE(MONTH(SELF.Date) + lMonth, lCurDay-1 ,YEAR(SELF.Date))) = 7
            lEnd = TRUE
            BREAK
          ELSIF lMonth = eCurrMonth
            lCurDay = 1
            lMonth = eNextMonth
          END  
        END
        lCurField = lCurDay
        lCurrentDate = DATE(MONTH(SELF.Date) + lMonth, lCurDay ,YEAR(SELF.Date))
        lCurFieldDate = lCurrentDate
      END
    END
    IF lEnd = TRUE THEN BREAK END
    ADD(SELF.Calendar)
  END
  
  
CalendarClass.GetDayNumber      PROCEDURE(LONG lDate)!,BYTE  
lDay                            BYTE 
  CODE
  lDay = lDate % 7
  IF lDay = 0 THEN lDay = 7 END
  RETURN lDay
  
CalendarClass.TakeEvent         PROCEDURE()
lCurFieldDate                   ANY   
  CODE
  CASE FIELD()
  OF SELF.Feq
    CASE EVENT()
    OF EVENT:NewSelection
      GET(SELF.Calendar, CHOICE(SELF.Feq))
      lCurFieldDate &= WHAT(SELF.Calendar, SELF.Feq{PROP:Column} + 7)
      SELF.Feq{PROP:ScreenText} =  FORMAT(lCurFieldDate, '@'&SELF.Feq{PROP:Text})
    END      
  END
  

Календарь :)

Добавлено: 13 Октябрь 2017, 19:56
kreator
Комбо совсем не вариант для календаря.

Календарь :)

Добавлено: 13 Октябрь 2017, 20:21
Дед Пахом
kreator писал(а): 13 Октябрь 2017, 19:56Комбо совсем не вариант для календаря.
Не согласен, очень часто удобнее руками вбить дату, чем листать её на 20 лет назад.

Календарь :)

Добавлено: 13 Октябрь 2017, 21:51
Yufil
Можно отработать событие Event:DroppingDown. Combo должна ссылаться на очередь ровно из одной записи, тогда нажатие на стрелку вниз вызовет событие Event:DroppingDown, обработчик каковой выдаёт

Код: Выделить всё

Event:SelectDate Equate( .... ) ! По вкусу 
.... 
OF Field() = ?Combobox 
... 
OF Event:SelectDate 
    ... ! Здесь вызываем календарь 
Of EVENT:DroppingDown
     ! Меняем обработчик 
     Post( Event: SelectDate ?Combobox) 
     ! Встаём на первую запись 
     ?ComboBox{Prop:Selected} = 1 
    ! И игнорируем DroppingDown 
     Cycle 

После этого в Combobox пишется обработчик Post на нужное событие. Пару раз приходилось извращаться, вместо сочетания Entry + Lookup Button использовал один Combobox. Работало...

Пы.Сы. Кстати, в ABC вполне приличный календарь, мож не стоит самому делать? Русские шаблоны-классы для календарика есть...

Календарь :)

Добавлено: 13 Октябрь 2017, 22:34
gopstop2007
я бы три комбо или спин поставил (дата, месяц и год)

Календарь :)

Добавлено: 13 Октябрь 2017, 23:30
kreator
Подозреваю, что Admin хотел что-то такого:
calendar.png
calendar.png (9.39 КБ) 2619 просмотров

Календарь :)

Добавлено: 14 Октябрь 2017, 2:18
Дед Пахом
Не смог удержаться... Прикрутил календарь из .NET: https://yadi.sk/d/_u5VGIRv3NjnZF
Есть и преимущества, есть и недостатки.

Календарь :)

Добавлено: 14 Октябрь 2017, 4:21
Admin
Yufil писал(а): 13 Октябрь 2017, 21:51Пы.Сы. Кстати, в ABC вполне приличный календарь, мож не стоит самому делать?
Я просто побаловался. Календарями не пользуюсь.
Привыкли руками вводить. + по правой кнопке есть меню на всех двойных датах (задаем период)
В меню можно выбрать период предопределенный, типа прошлая неделя, следующая неделя, прошлый месяц, весь год и т.д.
Обычно хватает.
Дед Пахом писал(а): 14 Октябрь 2017, 2:18Не смог удержаться... Прикрутил календарь из .NET
Вводить зависимость от .NET не хочется + зоопарк версий .NET и WIndows
Кстати. Календарь не закрывается при клике на окне или пока не выберешь дату.

Календарь :)

Добавлено: 14 Октябрь 2017, 4:33
Admin
kreator писал(а): 13 Октябрь 2017, 23:30Подозреваю, что Admin хотел что-то такого:
Вообще хотелось бы простой класс для создания таких контролов.

Clarion entry поле (поддерживающее Clarion паттерны) с кнопкой. При нажатии на кнопку внизу появляется окно привязанное к entry полю. В этом окне мы можем что угодно размещать.
Поля ввода, кнопки и т.д. Эдакий миниредактор чего либо.
Можно делать календари, калькуляторы и т.д.

Можно даже entry с отдельной кнопкой. Главное окно которое открывается под контролом. Что бы оно закрывалось по Esc и по клику мимо него.

Картинки просто пример:

Календарь :)

Добавлено: 14 Октябрь 2017, 10:26
Дед Пахом
Admin писал(а): 14 Октябрь 2017, 4:21Я просто побаловался. Календарями не пользуюсь.
Аналогично :-)
Admin писал(а): 14 Октябрь 2017, 4:21Вводить зависимость от .NET не хочется + зоопарк версий .NET и WIndows
Кстати. Календарь не закрывается при клике на окне или пока не выберешь дату.
Ну так я для этого код не написал :-)
А вообще их календарь много чего умеет (выбор диапазона дат в том числе).

Календарь :)

Добавлено: 14 Октябрь 2017, 10:41
RaFaeL
У нас вот такой самописный
calendar.png
calendar.png (3.83 КБ) 2593 просмотра
Его можно растянуть, тогда он будет вот такой
calendar2.png

Календарь :)

Добавлено: 14 Октябрь 2017, 12:40
kreator
Дед Пахом писал(а): 14 Октябрь 2017, 2:18 Не смог удержаться... Прикрутил календарь из .NET: https://yadi.sk/d/_u5VGIRv3NjnZF
Есть и преимущества, есть и недостатки.
То, что надо. Если допилить. Не понравилось: не закрыть пока не выберешь дату (реакция на потерю фокуса нужна), мелковато, пальцем не нажмёшь (может стиль можно менять?).

Календарь :)

Добавлено: 14 Октябрь 2017, 15:22
Дед Пахом
kreator писал(а): 14 Октябрь 2017, 12:40мелковато, пальцем не нажмёшь (может стиль можно менять?).
Если Вы имеете в виду планшет, то вроде бы в доке написано, что календарь отрисовывается на разных платформах по разному, то есть возможно на маленьком экране будет крупнее. Сам проверить не могу, не на чем.

Календарь :)

Добавлено: 14 Октябрь 2017, 16:18
gopstop2007
Admin писал(а): 14 Октябрь 2017, 4:33 Вообще хотелось бы простой класс для создания таких контролов.

Clarion entry поле (поддерживающее Clarion паттерны) с кнопкой. При нажатии на кнопку внизу появляется окно привязанное к entry полю. В этом окне мы можем что угодно размещать.
UserControl Class не оно? https://forum.clarionlife.net/viewtopic ... rol#p30906

Календарь :)

Добавлено: 14 Октябрь 2017, 17:06
Admin
gopstop2007 писал(а): 14 Октябрь 2017, 16:18UserControl Class не оно? https://forum.clarionlife.net/viewtopic ... rol#p30906
Вообще не то.