Страницы: 1
RSS
Календарь на стандартных элементах
 
Календарь, основанный на стандартных элементах – т.е. не требует подключения дополнительных библиотек, а так же открыт для улучшения/ухудшения/доработки напильником.  
 
Благодаря qw присутствуют четыре вида дизайна (мне лично нравится третий – считая слева, если нажать кнопку «показать календари») .  
 
Благодаря ZVI календарь позиционируется рядом с активной (или заданной) ячейкой.  
 
Благодаря обсуждению на данном форуме календарь принял нижеследующий вид (см вложение).  
 
В файле есть примеры вызова календаря по кнопке (и позиционирования его на экране), по двойному клику в ячейке (позиционируется рядом с ячейкой), из контекстного меню (тоже рядом с активной ячейкой).  
 
Календарь может изменять свой размер при нажатии на спин-кнопку в левом верхнем углу и запоминает этот размер для последующих вызовов (записывая его в имени).  
 
Также уделено некоторое внимание возможности вызывать календарь в другую ячейку, не закрывая его при вызове двойным кликом (если вдруг промахнешься) - просто кликаете в другую ячейку... Но, признаюсь, это несколько усложняет код и, соответственно, понимание его. Каюсь, но не смог удержаться.  
 
Еще раз повторяю, что предназначен он для разработчиков, которые могут свободно включать этот код в свои проекты, а так же изменять его.  
 
Для конечных пользователей может быть сподоблюсь сделать надстройку в дальнейшем.  
 
Советы по улучшению  и просто критика – приветствуются.
Живи и дай жить..
 
НАДСТРОЙКУ!!! НАДСТРОЙКУ !!!! плиз на бис.
 
nerv:  
Немного попривередничаю:  
1. Сделать масштабирование по растягиванию мышью за правый нижний угол;  
2. Вызывать календарь по средствам горячих клавиш (возможность назначения).  
3. Убрать мерцание при вызове - изначально позиционировать форму ЗА пределами экрана. Кстати, ZVI об этом писал.  
Это мое мнение и к реализации не обязательно : )  
 
 
полностью согласен с nerv-ом  :)  
 
но почему именно за правый нижний? :)  
 
а насчет предварительног - так было так, когда вызов на позиционирование из initialize стоял, но почему-то потом переехал в activate - не помню почему :)
Живи и дай жить..
 
{quote}{login=слэн}{date=16.03.2012 02:44}{thema=}{post}но почему именно за правый нижний? :){/post}{/quote}Интуитивно : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
щас перечитал и понравилось:  "для разработчиков, которые могут свободно включать этот код в свои проекты, а так же изменять его"  
 
т.е. кто не сможет включать и изменять, для того не предназначается :)
Живи и дай жить..
 
Если уменьшать календарь с помощью SpinButton, данный SpinButton пропадает и увеличить обратно уже не получается :)
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
Пожелания:  
 
1) Сделать функцию типа GetDate(optional byval StartDate as variant), вызывающую форму календаря, и возвращающую выбранную дату  
(либо пустую строку при отказе от выбора)  
 
2) Сделать код универсальным - для всех версий Windows и Office  
(раз уж используется WinAPI - написать код WINAPI в 4 вариантах)  
Я бы WinAPI вообще убрал - ИМХО, не так уж необходимо его использование в календаре.  
 
3) Запретить ручной ввод в комбобоксы (пользователь не должен вручную вводить месяц и год. К примеру, я написал год 999999 - выскочила ошибка)  
 
4) Масштабирование через SpinButton - неудобно.  
Либо, как уже говорили, через правый нижний угол формы, либо вообще убрать  
(не вижу смысла масштабировать календарь)  
 
5) Кнопка «Отмена» должна иметь свойство Cancel = TRUE  
(чтобы календарь закрывался по нажатию ESC)  
 
 
Я до сих пор использую в своих программах календарь от Avsha (тоже на стандартных элементах управления),  
- пример можно посмотреть в этой программе: <EM>http://excelvba.ru/programmes/Fill_Invoice</EM>
 
это до каких же пор вы его уменьшаете?  
 
дело в том, что там стоит неявное ограничение на минимальный запоминаемый размер..  
 
дело в том, что форма не может уменьшить свою ширину меньше ширины заголовка, поэтому как бы вы не уменьшали календарь, минимальная ширина будет вполне определенная, а по ней и пересчитывается высота с сохранением пропорций. т.е. если закрыть маленький календарь крестом(крест-то не уменьшается), то в след раз он откроется в размере, соответствующем миним ширине, а там кнопка еще видна..  
 
но на всякий на случай поставил обработку ошибок в процедуру ресайза - on error resume next  
теперь можно просто удалить в диспетчере имен имя "nmw__" и календарь вернется (при дальнейших вызовах)к своему изначальному виду( а имя создастся заново)  
 
можно также в этом имени непосредственно задать нужный размер..  
 
выкладываю файл с этой микродоработкой..
Живи и дай жить..
 
to EducatedFool  
 
1 практически есть - процедура setcal принимает аргументом дату, стоит задать глобальную переменную с датой, а в инициации календаря проверку на содержательность этой переменной и заменить date() на эту переменную  
подумаю - стоит ли делать это самому или отдать на откуп разработчикам..  
 
2 разве api не будут работать в 10м офисе? в седьмом работают нормально.  
вообще-то это перешло с процедурой от ZVI - это он во всем виноват :)  
можете предложить позиционирование без api?  
 
3 запрещать ручной ввод не хотелось бы, надо подумать как обойти ошибку  
 
4 мне лично масштабирование удобно :) кому нет, может не пользоваться или убрать  
 
5 да согласен, хотя я сосредоточился на версии без этой кнопки..
Живи и дай жить..
 
вот в общем-то исправил с вводом в комбо и esc
Живи и дай жить..
 
> setcal принимает аргументом дату, стоит задать глобальную переменную с датой ...  
 
Из опыта - при написании программ на VBA, использовать календарь для ввода в активную ячейку мне ни разу не приходилось.  
А вот для ввода даты на форме - очень часто.  
Или для ввода в ячейку, без её активации.  
Я, когда увидел календарь от Avsha, первым делом нарисовал такую функцию, ибо без неё календарь мне без надобности.  
А если без такой функции - то только в виде надстройки делать.  
 
 
> разве api не будут работать в 10м офисе?  
 
Ознакомьтесь с этим: <EM> http://excelvba.ru/articles/WinAPI</EM>  
 
> запрещать ручной ввод не хотелось бы  
 
Ну а как вы видите работу календаря, если пользователь ввел в поле «МЕСЯЦ» слово «ХЗ»?  
Выводить сообщение об ошибке?  
Но зачем, если можно изначально избежать такой ситуации?  
Ввод запрещать не нужно, но комбобокс должен иметь свойство style = ...styleList  
(чтобы список значений ограничивался заданным)
 
{quote}{login=слэн}{date=17.03.2012 01:55}{thema=}{post}2 разве api не будут работать в 10м офисе? в седьмом работают нормально.  
вообще-то это перешло с процедурой от ZVI - это он во всем виноват :)  
можете предложить позиционирование без api?{/post}{/quote}  
Конечно, ZVI виноват :-)  
Cейчас даже уточню, в чем именно.  
 
Тема <EM>http://www.planetaexcel.ru/forum.php?thread_id=9786</EM>  
Архив:<EM>http://www.planetaexcel.ru/docs/forum_upload/post_274618.zip  
</EM>
 
Файл: SetCalendarPosition_02.xls  
Модуль: ZVI_FrmPosition  
4 строка сверху, фрагмент комментария:  ZVI:2011-11-04 … Win64 compartible  
Так вот, моя ошибка в том, что слово compatible правильно пишется без буквы r :-)  
А в остальном - все хорошо, в коде есть: #If Win64 Then ...  
Поэтому код будет работать и в Excel 2010 64bit    
 
По поводу совместимости отмечу, что в Win7 64bit + Excel 2012 32bit беспокоиться о совместимости необязательно – все сработает со старыми API-декларированиями.  
А вот для Excel 2010 64bit действительно требуется  специальное декларирование API функций и процедур.  
 
Чтобы код работал в Excel 2010  32bit и 64bit применяются операторы условного компилирования #If ... #Then ... #Else
 
спасибо за разъяснения!
Живи и дай жить..
 
добавил варианты компилирования, указанные ZVI..  
 
делать еще пример ввода значения в форму пока не вижу необходимости..  
 
месяц ввести не из списка и так нельзя.
Живи и дай жить..
 
на x64 + x64 не работает. выдает ошибку.
 
Это точно моя ошибка. Исправляется так:  
В процедуре: ZVI_SetFormPosition()  
Было: Dim hWnd&  
Должно быть: Dim hWnd  
 
Поправлю и в той теме.
 
пароль: Dim hWnd  
ответ: спасибо, канает
 
{quote}{login=antal10}{date=20.03.2012 03:11}{thema=}{post}ответ: спасибо, канает{/post}{/quote}Правильно, и пусть канает! © :-)
 
спасибо ZVI, тоже исправляю, хотя на 64 пока и не пробовал
Живи и дай жить..
 
Слэн, привет. Вопросы у меня такие:  
1) почему у меня дату невозможно выбрать - нажимаю мышь (лев.кнопку) - календарь закрывается  
2) про стелки (размер) - я думаю лучше их использовать для крокрутки календаря с шагом день (если это можно)
 
1. не могу знать( у меня все выбирает)  
2 что значит прокрутки? зачем 1 день? но, в целом, можно, разрешаю :)  
 
ps делайте любые изменения, которые сочтете нужными, если же чего-то не получается, то можете спрашивать как это сделать. Но ответы - это уж как получится..
Живи и дай жить..
 
обновление календаря.  
 
улучшено позиционирование при наличии  на листе встроенных обектов, добавлены примеры ввода даты в текстбокс на листе, в комбобокс, на встроенную фигуру, на текстбокс на форме.  
 
модераторам - не знаю как лучше- заменить файл в копилке или добавить туда это сообщение?
Живи и дай жить..
 
Пардон. При вызове через кнопку, у меня ругаетс на этой строке  
Call ZVI_SetFormPosition(Me).  
И еще бы в колонтитул, чтобы можно было вставлять дату, спс
 
{quote}{login=слэн}{date=04.04.2012 03:38}{thema=}{post}модераторам - не знаю как лучше- заменить файл в копилке или добавить туда это сообщение?{/post}{/quote}Лучше создать (здесь) новую тему с этим файлом, включив текст и из "Копилки", затем переместим её в "Копилку", взамен существующей.
 
хорошо. заодно исправлю указанную выше недоработку.
Живи и дай жить..
 
Перенёс.
Страницы: 1
Наверх