Календарь :)

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Календарь :)

Сообщение Admin »

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

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

  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
  
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Календарь :)

Сообщение kreator »

Комбо совсем не вариант для календаря.
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Календарь :)

Сообщение Дед Пахом »

kreator писал(а): 13 Октябрь 2017, 19:56Комбо совсем не вариант для календаря.
Не согласен, очень часто удобнее руками вбить дату, чем листать её на 20 лет назад.
С уважением, ДП
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Календарь :)

Сообщение 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 вполне приличный календарь, мож не стоит самому делать? Русские шаблоны-классы для календарика есть...
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Календарь :)

Сообщение gopstop2007 »

я бы три комбо или спин поставил (дата, месяц и год)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Календарь :)

Сообщение kreator »

Подозреваю, что Admin хотел что-то такого:
calendar.png
calendar.png (9.39 КБ) 2294 просмотра
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Календарь :)

Сообщение Дед Пахом »

Не смог удержаться... Прикрутил календарь из .NET: https://yadi.sk/d/_u5VGIRv3NjnZF
Есть и преимущества, есть и недостатки.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Календарь :)

Сообщение Admin »

Yufil писал(а): 13 Октябрь 2017, 21:51Пы.Сы. Кстати, в ABC вполне приличный календарь, мож не стоит самому делать?
Я просто побаловался. Календарями не пользуюсь.
Привыкли руками вводить. + по правой кнопке есть меню на всех двойных датах (задаем период)
В меню можно выбрать период предопределенный, типа прошлая неделя, следующая неделя, прошлый месяц, весь год и т.д.
Обычно хватает.
Дед Пахом писал(а): 14 Октябрь 2017, 2:18Не смог удержаться... Прикрутил календарь из .NET
Вводить зависимость от .NET не хочется + зоопарк версий .NET и WIndows
Кстати. Календарь не закрывается при клике на окне или пока не выберешь дату.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Календарь :)

Сообщение Admin »

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

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

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

Картинки просто пример:
Вложения
color_picker.jpg
color_picker.jpg (8.52 КБ) 2281 просмотр
ColorPicker.jpg
dropdown.gif
dropdown.gif (5.37 КБ) 2281 просмотр
visual_style.jpg
visual_style.jpg (11.5 КБ) 2281 просмотр
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Календарь :)

Сообщение Дед Пахом »

Admin писал(а): 14 Октябрь 2017, 4:21Я просто побаловался. Календарями не пользуюсь.
Аналогично :-)
Admin писал(а): 14 Октябрь 2017, 4:21Вводить зависимость от .NET не хочется + зоопарк версий .NET и WIndows
Кстати. Календарь не закрывается при клике на окне или пока не выберешь дату.
Ну так я для этого код не написал :-)
А вообще их календарь много чего умеет (выбор диапазона дат в том числе).
С уважением, ДП
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Календарь :)

Сообщение RaFaeL »

У нас вот такой самописный
calendar.png
calendar.png (3.83 КБ) 2268 просмотров
Его можно растянуть, тогда он будет вот такой
calendar2.png
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Календарь :)

Сообщение kreator »

Дед Пахом писал(а): 14 Октябрь 2017, 2:18 Не смог удержаться... Прикрутил календарь из .NET: https://yadi.sk/d/_u5VGIRv3NjnZF
Есть и преимущества, есть и недостатки.
То, что надо. Если допилить. Не понравилось: не закрыть пока не выберешь дату (реакция на потерю фокуса нужна), мелковато, пальцем не нажмёшь (может стиль можно менять?).
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Календарь :)

Сообщение Дед Пахом »

kreator писал(а): 14 Октябрь 2017, 12:40мелковато, пальцем не нажмёшь (может стиль можно менять?).
Если Вы имеете в виду планшет, то вроде бы в доке написано, что календарь отрисовывается на разных платформах по разному, то есть возможно на маленьком экране будет крупнее. Сам проверить не могу, не на чем.
С уважением, ДП
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Календарь :)

Сообщение gopstop2007 »

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

Clarion entry поле (поддерживающее Clarion паттерны) с кнопкой. При нажатии на кнопку внизу появляется окно привязанное к entry полю. В этом окне мы можем что угодно размещать.
UserControl Class не оно? https://forum.clarionlife.net/viewtopic ... rol#p30906
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Календарь :)

Сообщение Admin »

gopstop2007 писал(а): 14 Октябрь 2017, 16:18UserControl Class не оно? https://forum.clarionlife.net/viewtopic ... rol#p30906
Вообще не то.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить