PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Календарь смен


Календарь смен

Сообщений 1 страница 30 из 31

1

Календарь смен

Скачать: yandex upload.ee
Скачать CalendarAlarmPB (Windows, Linux): yandex upload.ee
Скачать для андроида yandex upload.ee

Ссылка на скриншот в Linux
https://i.imgur.com/LfE8DiT.png https://i.imgur.com/2PZgKXe.png

в ini-файл указать дату первой смены и программа от неё будет высчитывать.

Обновление в APK для телефона
Выбор смены теперь осуществляется кликом по дате в календаре
Текущий день подсвечивается не цветом числа, а рамкой
Шрифт календаря пропорционален размеру окна.
Использование Canvas.
Исправление незначительной ошибки проверки будильника, ограничивал 4-мя днями, теперь по числу дней в цикле.

Отредактировано AZJIO (13.03.2023 18:57:07)

0

2

1. сегодня подсветить
2. день недели нужен
3. выходные подсветить
4. праздники подсветить, чтобы отличались от выходных

картинка

AZJIO, забываешь когда тебе на работу? стареешь? :crazyfun:

0

3

newJS написал(а):

1. сегодня подсветить
2. день недели нужен
3. выходные подсветить
4. праздники подсветить, чтобы отличались от выходных

На каждую подсветку нужно 3 цвета: фон, кайма, шрифт. Так как я уже сделал 4 типа, то уже 12 цветов, если добавить ещё 3 типа будет итого 21 цвета. В теории можно но будем развиваться потихоньку предчувствуя необходимость. Добавлять можно полно чего, у других программ есть алгоритмы графиков, не 2+2 а кучи вариантов, я пока взял распространённый и по совместительству мой.

newJS написал(а):

AZJIO, забываешь когда тебе на работу? стареешь? :crazyfun:

Я на другом форуме изначально обозначил задачу:
1. Выход с больничного
2. Выход с отпуска
3. Подстроить дату начала отпуска с первой сменой.
Хотя столько времени уходит, что наверно если я за все года это посмотрю в другой программе, то потрачу в итоге меньше времени. Но тут то важна идея и желание. Я уже делал лаунчер с нарисованными кнопками (#BS_OWNERDRAW) и с подсветкой окантовки вокруг кнопки (BitBlt_), так почему бы используя готовые наработки не попробовать с календарём? Сплошная математика.

В начале было желание раз уж используются кнопки, а не просто текст сделать типа напоминателя. Выбираю год, месяц, день, нажимая на соответствующие кнопки и добавляю событие, оно сохраняется в ini-файл и потом подсвечивается, а если типа прогу добавить в автозагрузку, то при каждом запуске просто сверяет дату и за 5 дней начинает напоминать о неком дне, или задав за сколько дней напоминать.

И кстати обновил. Цвет добавил в ini-файл, сделал вариант если ini-файл не существует то месяцы в цифрах 1-12, во общем задал значения по умолчанию. Добавил дни предыдущего и следующего месяца блеклыми, добавил цвет смен разный, если день/ночь, то день например жёлтый, ночь - синий.

Отредактировано AZJIO (14.05.2022 09:45:55)

0

4

AZJIO написал(а):

Я уже делал лаунчер с нарисованными кнопками (#BS_OWNERDRAW) и с подсветкой окантовки вокруг кнопки (BitBlt_)

Почему не канвас?

0

5

Пётр написал(а):

Почему не канвас?

Мне кажется обрабатывать легче в цикле. Канвас как 42 холста или как один холст с 42 квадратиками? Сам канвас добавляет 40 кб к проге, он сделан как сложное устройство с кучей событий в Callback. Хотя для кроссплатформенности лучше было бы его выбрать, так как я уже понимаю что в Linux целая проблема будет с нуля рисовать.
Чтобы легче было я с пятнашек взял генерацию кнопок и чуть изменил, поэтому изначально легко пошло.
Можно и попробовать канвас.
Сейчас единственное сомнение это в расчёте разницы дат. Там есть разница в плюс и разница в минус, я взял от средины дня 12 часов 00 минут 00 секунд. Между двумя датами будет допустим ровно 100 дней, а если в минус, что если получится 99,9999, а у меня интегрер, девятки откинутся, надо в float наверно делать, делим на 4, чтобы получить остаток, который будет сдвигом, в одном случае 25 с остатком 0, в другом остаток 3.999, отбрасываем дробные получим 3. Так что я пока вот этот момент изучить, как более критичный.
Сейчас проверил онлайн календарь рабочих смен взял выборочно разные года и месяцы в том числе за 2024г, всё сходится. Взял указал дату из будущего 2023г и посмотрел как рассчитываются месяца 2022, тоже всё сходится.

Отредактировано AZJIO (14.05.2022 11:48:39)

0

6

AZJIO написал(а):

как один холст с 42 квадратиками?

Именно так. Нарисовать не сложно. Размеры квадратиков известны и легко вычислить что и где рисовать и над каким сейчас курсор мышки.
Может этот код будет полезным Редактор картинок для графического индикатора.

0

7

Пётр
Как нибудь займусь, понимая что надо в любом случае изучать канвас досконально, делать примеры чтобы легче потом было использовать.

Сейчас перезагрузился в Linux попытать счастье подстроить исходник, вроде не сложно задавать цвета не в Callback, а непосредственно в цикле смены дат. У кнопки нет нативной функции окрашивания, но есть у TextGadget. Подменил, добавил функции SetGadgetColor, заработало. Но центрирование работает только по горизонтали. Увеличил размер цифр и прилипание цифр к потолку ящика стало не так бросаться в глаза. И тут же возник вопрос, а как тот же текст центрировать в неком виртуальном ящике заданным например структурой RECT? И вот тут я чувствую, что даже в Windows могу потерять это свойство, которое на кнопках сейчас присутствует.

Добавил в архив линуксовый исходник.

0

8

AZJIO написал(а):

например структурой RECT

В линукс нет структуры RECT. Это из WinAPI.
Для TextGadget можно узнать минимальную ширину и высоту для отображения текста вызвав GadgetWidth и GadgetHeight с флагом #PB_Gadget_RequiredSize
Исходя из размеров центровать.

0

9

Обнаружил что архив то я не выложил ссылку, исправил первый пост.

0

10

AZJIO написал(а):

Но центрирование работает только по горизонтали.

и по вертикали тоже, но только если текст в одну строку #SS_CENTERIMAGE
а в API это две константы

AZJIO написал(а):

а как тот же текст центрировать в неком виртуальном ящике заданным например структурой RECT?

есть готовые константы, но это API
или саму rect задавать размером под текст, и её центрировать как тебе надо

для лучшей видимости добавь тень, как у меня на скрине

а зачем тебе кнопки, канвас, календарь должен кликаться? тогда канвас лучше, возможностей больше, например подсветка числа
подсветка это просто, делаешь маленькую картинку с полупрозрачностью, а дальше варианты, можно использовать ImageGadget() по координатам или накладывать на канвас, но при уходе надо перерисовать

0

11

Обновил
Добавил кнопку, чтобы указать первую смену. Так как в Linux никто не пользуется портаблом, есть только пакеты, то проблематично искать ini-файл, чтобы менять дату, поэтому сменить теперь можно из окна программы.

0

12

AZJIO написал(а):

Мне кажется обрабатывать легче в цикле. Канвас как 42 холста или как один холст с 42 квадратиками? Сам канвас добавляет 40 кб к проге, он сделан как сложное устройство с кучей событий в Callback. Хотя для кроссплатформенности лучше было бы его выбрать, так как я уже понимаю что в Linux целая проблема будет с нуля рисовать.
Чтобы легче было я с пятнашек взял генерацию кнопок и чуть изменил, поэтому изначально легко пошло.
Можно и попробовать канвас.
Сейчас единственное сомнение это в расчёте разницы дат. Там есть разница в плюс и разница в минус, я взял от средины дня 12 часов 00 минут 00 секунд. Между двумя датами будет допустим ровно 100 дней, а если в минус, что если получится 99,9999, а у меня интегрер, девятки откинутся, надо в float наверно делать, делим на 4, чтобы получить остаток, который будет сдвигом, в одном случае 25 с остатком 0, в другом остаток 3.999, отбрасываем дробные получим 3. Так что я пока вот этот момент изучить, как более критичный.
Сейчас проверил онлайн календарь рабочих смен взял выборочно разные года и месяцы в том числе за 2024г, всё сходится. Взял указал дату из будущего 2023г и посмотрел как рассчитываются месяца 2022, тоже всё сходится.

Отредактировано AZJIO (Вчера 11:48:39)

Надо день в месяце брать от григорианского календаря,соответственно и разницу в днях между датами можно тогда рассчитать,я переводил код ранее с старого Бейсика ЭВМ,если найду выложу,или сфоткаю с книжки тот без перевода.

0

13

Вот еле нашёл исходник свой расчёт между датами.

Код:
Global d.i=7
Global m.i=2
Global g.i=2018
Global N.i
If m>2 
  m+1
Else
  m+13
  g-1
EndIf
N=Int(365.25*g)+Int(30.6*m)+d-621050
Debug N
N=N-Int(N/7)*7+1

Select N
Case 1
Debug "Пн"
Case 2
Debug "Вт"
Case 3
Debug "Ср"
Case 4
Debug "Чт"  
Case 5
Debug "Пт"
Case 6
Debug "Ст" 
Case 7
Debug "Вс" 
EndSelect



 d=7
 m=5
 g=2018


If m>2 
  m+1
Else
  m+13
  g-1
EndIf

N1=Int(365.25*g)+Int(30.6*m)+d
Debug N1

 d=27
 m=5
 g=2018
 
 If m>2 
  m+1
Else
  m+13
  g-1
EndIf
 
 
N=Int(365.25*g)+Int(30.6*m)+d
Debug N

N-N1

Debug N

Procedure.s dendaty(d.i,m.i,g.i,koldneydonovoydaty=0);день, месяц, год,(возврат день недели)
Protected N.i
If m>2 
  m+1
Else
  m+13
  g-1
EndIf
d+koldneydonovoydaty
N=Int(365.25*g)+Int(30.6*m)+d-621050
N-Int(N/7)*7+1
Select N
Case 1
ProcedureReturn "Пн"
Case 2
ProcedureReturn "Вт"
Case 3
ProcedureReturn "Ср"
Case 4
ProcedureReturn "Чт"  
Case 5
ProcedureReturn "Пт"
Case 6
ProcedureReturn "Ст" 
Case 7
ProcedureReturn "Вс" 
EndSelect
EndProcedure
Procedure.l Dnei_Mezhdu_Datami(d.i,m.i,g.i,d2.i,m2.i,g2.i);количество дней между датами
  Protected N.i
  Protected N1.i
If m>2 
  m+1
Else
  m+13
  g-1
EndIf

N1=Int(365.25*g)+Int(30.6*m)+d

If m2>2 
  m2+1
Else
  m2+13
  g2-1
EndIf
 
N=Int(365.25*g2)+Int(30.6*m2)+d2
N-N1

ProcedureReturn N
EndProcedure


Debug dendaty(31,05,2022);
Debug Dnei_Mezhdu_Datami(16,09,2013,21,06,2018)


0

14

Sergeihik
вот мой вариант:
https://www.purebasic.fr/english/viewto … 88#p567788

кстати, можно прикрутить к календарю как функцию, не зря же писал. Два диалога запроса времени в которые вставлять текущее время, одно из которых можно изменить или оба. Хотя не представляю кому это пригодится.

Я тут Fedora установил, пробую RPM пакеты собирать, уже 4 пакета собрал (Find_GUI, create-desktop-file, RegExpPB, StopwatchTimer). Если так всё удачно складывается, может  MacOS поставить, чтобы расширить возможности. С руборда человек с исходников собрал RegExpPB на MacOS.

Также я обновил прогу, всвязи с проблемой DPI. Я проверил все проги на баги с DPI и получил 2 шт, "Календарь" и "CaptureText". В последней просто галку убрал из настройки компилятора, потому что там как такового окна нет, а вот расчёты мыши и границ вокруг окон все ломаются. В проге "Календарь" очистка окна по площади не захватывала все кнопки, так как окно увеличилось, теперь исправил.

Отредактировано AZJIO (31.05.2022 00:34:19)

0

15

newJS написал(а):

AZJIO, забываешь когда тебе на работу? стареешь?

:)
Любое творчество я уважаю. А программное тем более. Даже такие небольшие реализации, людям нужны. Но вот всё больше я думу думаю. Может быть мы как-то скоррелируемся, и что-то весомое создадим - ВМЕСТЕ... Я например, мечтаю создать подобие IDE Visual Studio, но для PB и AutoIt, хотя бы визуально. Чтобы и визуальную тему можно было переключать и создавать для себя каждому пользователю. Начал на C#, сделал много, через год бросил, понял что хочу более простой реализации кроссплатформенности и без фреймоворков. Окунулся в PB. DockPanel на PB, мне просто интересно создать. Как художника и перфекциониста, меня гнобит убогий вид IDE и того и другого языка. Одному, это лет 10 пилить. Интересно конечно, а будет ли потом оно нужно. Возможно и будет, ведь лично я, до сих пор с удовольствием в восьмибитки играю)))
P.S. За offtop извиняюсь.

Отредактировано Webarion (31.05.2022 03:34:57)

0

16

Webarion
Плаг пиши. Исходники IDE в свободном доступе, можешь их править, вот только я понимаю, что это мне не по зубам. Тут с одним только плагом подсветки я сдулся. Тот плаг использует разовую подсветку индикаторов, а с использованием стиля в grub2-генератор я хотел сделать аналогичное плагом в notepad++, он работал для всех документов, но когда я решил запрашивать тип документа и менять движок подсвечивания, то запарился искать ошибку, и забросил до лучших времен, тем более автор помешан на западных лозунгах и тем более если есть акелпад с подсветкой регвырами.

0

17

Обновил для андроида, второй исходник с попыткой будильника, но проблема загрузки звука будильника, возможно из-за старой версии андроида 5.1. Чтобы проверить звук переключить флаг flgAlarm = 1 в глобальных переменных. Чтобы не ждать сигнала, найти "тестовый блок Начало" и раскомментировать блок теста, тогда звук должен будет играть при нажатии кнопки "стрелка". Ну и путь там указать свой.

В другом исходнике тоже обновил, добавив вертикальное центрирование.

На работе предложили сделать несколько графиков, то есть отображается один график (или сделать выбор графиков для отображения), а звонки настраиваются под каждый график, чтобы можно было установить будильники для мужа, жены и ребёнка в школу. То есть задаётся цикл например 4 дня и указывается номер дня и  время будильника, или задать цикл 7 дней (для ребёнка в школу) и звонок с на все дни кроме выходных, то есть нет исключений, есть стандартный цикл и номера дней. Но так как сразу было бы сложно, тем более сразу было непонятно делать ли число таймеров по числу графиков или просто в каждом графике ищется ближайший будильник и устанавливается время до его срабатывания, потом выполняется поиск следующего ближайшего будильника. Сделал пока упрощённо - один пользователь и 2 будильника по графику ден-ночь-48 "жёстко" заданный в коде, потом можно было бы прочитать настройки через "Открыть файл", даже если не удастся сделать чтение по жёстко-заданном пути.
Были вопросы, как если два будильника с разницей в 5 минут и пока играет музыка в течении 6 минут, то второй будильник успеет устареть, но кажется что это можно совмещать как один будильник, так как он прозвучит в тоже время.
Ещё придётся переделывать чтобы задать не 4-х дневный цикл, кажется это не сложно, но пока он также охватывает 4-х дневный цикл сутки-через-трое. В общем это кажется не сложным сделать через открытие файла конфигурации и сделать описание как составлять файл конфигурации.

План
Сменить месяц движением пальцев вертикально
Сменить год движением пальцев горизонтально
Открытие настроек через "Открыть файл".

Отредактировано AZJIO (30.12.2022 11:18:26)

0

18

Resource directory
The path of the resource directory where all the app assets belongs to. It can be only one resource directory specified. The whole directory will be automatically copied to the app root directory.
in apk (If you unzip )
assets\www\ -->
I, for example, chose the name of the folder "s" in which I put
lazer.wav
siren.ogg
and
...
LoadSound(0, "./s/lazer.wav")
LoadSound(1, "./s/siren.ogg")
i.e. the path to the resources available to the loadxxx functions
within the apk
/assets/www/s/lazer.wav
/assets/www/s/siren.ogg
And in sb
LoadSound(0, "./s/lazer.wav")
LoadSound(1, "./s/siren.ogg")
===========================
Перевожу со своего возможно английского )))
При создании apk выбрать путь до папки ресурсов и всё что в ней будет лежать станет доступно всяким функциям loadxxx
p.s. речь о преобразовании примера со звуком в apk.
p.p.s. проверено как раз на 5.1 MEIZU M3s

Отредактировано useful (30.12.2022 15:02:04)

0

19

useful
лишние варианты только добавили мне лишние тесты, 8 раз пересобрал apk чтобы заиграла музыка наконец то.

Итак инструкция:
1. Рядом со скриптом создать папку "data"
2. В окне компиляции напротив "Resource directory:" указать папку "data\", можно прямой путь через "открыть", но вставится относительный "data\". И положить в папку файлы.
3. В коде использовать в точности LoadSound(#Sound, "./data/alarm.ogg")
4. LoadSound() не является критерием загрузки, это только вызов, а функция BindEvent(#PB_Event_Loading, @Loading()), точнее указатель на Loading() это есть критерий загрузки, то есть если после LoadSound() вызвать PlaySound(#Sound), то музыка ещё не загружена, а PlaySound(#Sound) не сможет играть то что ещё не загружено, а вот после калбэк-функции будет загружен, то есть либо внутри калбэк, либо открыть заранее с разрешающим флагом.
5. Что интересно мессага, даже если она стоит после PlaySound(), она срабатывает раньше и не даёт воспроизводится файлу, а после закрытия мессаги начинается воспроизведение. Вывод - использовать флаг #PB_Sound_Loop и показать кнопку остановки воспроизведения.
6. OGG-файл оказался даже компактнее mp3, а с wav долго запускается из-за размера файла 10Мб (ogg 635 кб).

0

20

В том то всё и дело, что программа на SB, как и на JS, это как бы и не программа. Это именно скрипт автоматизации браузера и живёт по законам браузера а не процессора. Все функции нужно в голове поделить на те что манипулируют памятью и они условно синхронны(поведение очевидно и привычно) и те что обращаются к внешним АПИ и они в свою очередь однозначно асинхронны.
Алгоритмы на коллбэках это та ещё гимнастика для головы.  :canthearyou:

0

21

Обновил для андроида, скачать APK c яндекса, upload.ee
Добавлен будильник для 4-х дневной смены, настройки можно загрузить через открытие ini-файла. Прогу запустить фоном и добавить в оптимизацию разряда батареи. Подробнее в Readme.

Я уже достиг 700 строк, хотя там комментарии думаю не считаются строками. Я там планов написал наверно ещё на 800 строк, придётся остановиться.

0

22

AZJIO написал(а):

Я там планов написал наверно ещё на 800 строк

Можно попробовать размещать несколько строк в одной строке разделяя их двоеточиями.

0

23

Имхо, календарей для андройда много:
https://apkpure.com/ru/search?q=График смен
Наверное, можно их распотрошить и посмотреть код js.. в академических целях)
Мне нравится "График смен +Калькулятор дат " v2.1, его достаточно, чтобы посмотреть, когда на работку)
Для себя сделал календарик в excel - для печати. В планах добавить выделение праздников из списка (формулы на втором листе) и прочие доработки из пожеланий в этой теме.
https://disk.yandex.ru/d/vfqu5o_-MHWc3g
п.с. просьба до конца 2023г не выкладывать в общественных местах - только для личных нужд)

Отредактировано bizdon (02.01.2023 11:07:47)

0

24

Обновления
Чёрная тема css
Размер окна по ширине экрана.
Добавлены пункты "О программе" и "Показать будильники".
Рингтон будильника зациклен и добавлена кнопка остановки.
Исправление при вычислении номера дня будильника.

https://i.imgur.com/c839vnS.png

кому интересно, чтобы изменить тему, надо внутри APK открыть файлы:
\assets\www\spiderlibraries\dojo\themes\flat\flat.css
\assets\www\spiderlibraries\themes\flat\window.css
Сделать необходимые замены и собрать.

Файлы css находятся в \SpiderBasic\Libraries\javascript\ поэтому чтобы не перепаковывать лучше заменить тут, сделав копии оригиналов.
А также файл при запуске программы \SpiderBasic\Compilers\splashscreen.png

Отредактировано AZJIO (03.01.2023 10:39:43)

0

25

bizdon
имхо в них нет нужного мне. Я скачивал самый рейтинговый, который раньше работал нормально "Скользящий график", после он стал звонить только первые две смены живет сам по себе плюс-минус 20 минут, а после 2 звонков напрочь пропадает. Автору писал выложить старый файл под другим именем, но рабочий, молчок, удалил. Решил поэкспериментировать, установил ещё один 54 Мб, я запарился выставлять смены, запарился переключаться на следующий месяц, просто нереально, если хочешь посмотреть следующий месяц опять вбивай смены, будильник там вообще не понятно как настраивать я так и не настроил, вот сегодня его удалил окончательно. Так что мой это то что работает. А другое это то что не работает.

Отредактировано AZJIO (03.01.2023 12:51:40)

0

26

AZJIO
Зачем в календаре будильник? Когда он должен звонить? - за полчаса до смены? Наверное, надо очень хорошо отдыхать, чтобы вообще забыть, какой сегодня день и когда на работку) Впрочем, я не работал по скользящему графику.. Если то в день, то в ночь, то можно и забыть..

Про "скользящий график" пишут:
https://shift-work-schedule.ru.aptoide.com/app

❗️ Начиная с версии андроида 6.0 для корректной работы будильника в настройках телефона нужно исключить приложение из списка оптимизации батареи, разрешить приложению работу в фоне и автостарт. Больше информации в разделе приложения “Помощь”.
После настройки графика, отдельные смены менять нельзя.

скорее всего, энергосбережение смартфона завершает висящий в фоне процесс. Есть также приложения-планировщики (не совсем календари, но календарь там неотъемлемая часть), которые специально созданы, чтобы напоминать по расписанию. Можно в них отметить смены и поставить будильник.

0

27

bizdon написал(а):

Зачем в календаре будильник?

Чтобы проснуться на работу, а не спать до тех пор когда с работы начнут звонить. Мы о каких то детских понятиях сейчас рассуждаем.

bizdon написал(а):

скорее всего, энергосбережение смартфона завершает висящий в фоне процесс

Я не знаю как это работает, но к примеру WhatsApp висит в процессах, в фоне, но бывает включаешь телефон на зарядник и он начинает обновлять сообщения на иконке. То есть он в полусне, опять же это может быть функция WhatsApp, ведь я тоже хотел добавить если разряд батарее ниже 10% то не играть музыки или играть но первый раз, чтобы и сработать и не послать телефон в аут. У меня версия андроида 5.1, я уже говорил выше.
Нет никакого планировщика, а будильник можно поставить разово и так каждый день его ставить, нет никакого желания этим заниматься.

Отредактировано AZJIO (03.01.2023 16:11:49)

0

28

AZJIO
имхо, будильников разных полно. В том числе таких, которые будут звонить как угодно: и каждый день (кроме выходных) и только в определённые дни и т.п.

0

29

Для работы будильника оставлять окно программы открытым (не сворачивать).

Пытался зарегистрироваться в Google Play, он попросил $25. Программа даже старый apk стал блокироваться "Google Play", при установке в окне блокировки жму "Сведения" и прокручиваю вниз на специально скрытую кнопку "Всё равно установить". "Google Play" потом ещё раз напоминает что надо удалить опасную программу.
Ссылка на яндекс в первом посте.

Отредактировано AZJIO (09.03.2023 17:52:44)

0

30

Обновление для андроид.

09.03.23
Добавлен пункт "Стиль", чтобы легко выбрать один из 7. В папке "\assets\www\data\" файлы от 1 до 7 содержат только цвет.

06.02.23
Коррекция стиля (css) - синий заголовок, правильные линии окна и т.д.
Цвет фона календаря при запуске программы сразу чёрный.
Увеличен шрифт меню.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Календарь смен