Forum Replies Created
-
AuthorPosts
-
June 18, 2019 at 10:47 am in reply to: Улучшаем функционал TsMonthCalendar (MultiSelect, OnDateMouseEnter и др.) #59620Vitaliy PolyakovParticipant
В принципе, это будет решением. И логичной доработкой функционала параметров MinDate-MaxDate.
За ограничение, отдельно благодарю.
Но обратите внимание, если MinDate-MaxDate будут составлять период, в рамках одного месяца, то меню будет бесполезным и отображение его неактивным, может вызывать у пользователя недопонимание.
Мало так же смысла, отображать такое сложное меню с годами и месяцами в подменю, для выбора и между двумя или даже тремя месяцами – всегда проще переключить месяц календаря одной из кнопок MonthBtns или навигацией по дням самого календаря.
Но, у каждого пользователя, предпочтения могут быть свои 🙂
Если подумать именно о дополнительном сокрытии меню, то как мне кажется, показывать его или скрывать, логичней по значению одного из имеющихся параметров: AllowChangeMonth, ShowYearBtns, ShowMonthBtns или добавить новый параметр ShowTitleMenu.
June 10, 2019 at 11:12 am in reply to: Улучшаем функционал TsMonthCalendar (MultiSelect, OnDateMouseEnter и др.) #59588Vitaliy PolyakovParticipantРазработчики AC, огромное спасибо за исправление обнаруженных ошибок и оптимизацию работы календаря, теперь, почти всё, стало работать как надо, при намного стабильней и без лишних танцев с бубном – продолжать дальнейшую работу, одно удовольствие
Написал “почти всё” т.к. остались еще два незамеченных бага, один из них был описан в посте выше, пунктах 1. [Не критично] и 2. color=”#8b0000″]БАГ[/color, а именно:
В обработчике OnDateMouseEnter(Sender: TObject; Date: TDateTime), перемещая указатель мыши к нижней границе календаря, переменная Date сначала получает значение даты последней видимой ячейки календаря, а буквально за 3-4 пикселя до границы (border 3px по периметру компонента), получает дату ячейки календаря, которая как бы находится строкой ниже (значение ячейки следующего ряда, идущих ниже дат, но которые в текущем “развороте” календаря не отображены). И та же самая особенность, касается и обработчика OnMouseDown в области 3-4 пикселей до нижней границы компонента (до border 3px по периметру).
И кстати, параметр BorderWidth := 0, все-равно почему-то всегда остается минимум 3px, хотя в Design Time бордюр исчезает. В общем, этот баг некритичный, поэтому исправление его, оставляйте на свое усмотрение.
А вот второй, оставшийся незамеченный баг, более критичен.
При тех же настройках компонента (MinDate-MaxDate и AllowChangeMonth = true), по клику правой кнопкой мыши на Title календаря, открывается меню, с вложенными подменю, выбора года и месяца. При изменении текущего месяца или года, календарь отображает выбранный месяц и год, НО в старой версии календаря (см. exe-шник в архиве топика), при попытке переключения месяца кнопками MonthBtns (перелистывания месяца право или влево), календарь сразу (перерисовываясь) возвращается в наш текущий месяц, при этом перекрашивая “зеленым” и разрешенный период (MinDate-MaxDate), а в новой версии исправленного календаря, месяц вообще не перерисовывается, пока не начнем кликать по его отдельным ячейкам и то, кликнуть мы сможем только в рамках разрешенного “зеленого” периода, а остальные ячейки так и останутся отображать дни предыдущего выбранного месяца/года в том числе и Title календаря.
Получается так, что при AllowChangeMonth = true, никакими другими свойствами, ни границами (MinDate-MaxDate), ни ShowYearBtns = false и ShowMonthBtns = false, мы контекстное меню изменения года/месяца в Title календаря, отключить не можем.
Хотелось бы все-таки, как-то отдельно контролировать это меню (через отдельное property, к примеру: AllowChangeYear или ShowTitleMenu) или, может, привязать его отображение к ShowYearBtns – если год листать не нужно, то соответственно, нет нужды менять его и через меню. Или пусть так и дальше работает, по AllowChangeMonth = true, но тогда при AllowChangeMonth = false, разрешить листать (право/влево) месяцы, если у нас ShowMonthBtns = true.
Что скажете по этому поводу – сможем как-то листать месяцы (в моем варианте это нужно для разрешенного периода MinDate-MaxDate), но при этом скрыть меню смены года/месяца из Title?
May 30, 2019 at 8:55 am in reply to: Улучшаем функционал TsMonthCalendar (MultiSelect, OnDateMouseEnter и др.) #59544Vitaliy PolyakovParticipantПремного благодарен!
Очень приятно работать с продуктом, за которым стоит такая серьезная поддержка
Сегодня была обновлена версия AlphaControls до v14.25 (update 30.05.2019) – это, нужная мне версия или ждать в следующем релизе?
И уточните пожалуйста еще, для быстрой замены функционала, одного только обновленного компонента TsMonthCalendar, мне достаточно из пакета релиза, перезаписать по своему пути файл sMonthCalendar.dcu и, к примеру, sPanel.dcu или нужно еще что-то делать?
ПС: Для оперативности тестирования обновленной версии функционала и продолжения работы над проектом, не удобно будет тратить время на переустановку всего пакета AlphaControls, если вдруг окажется, что именно по календарю, останутся еще какие-либо замечания.
May 27, 2019 at 9:55 am in reply to: Улучшаем функционал TsMonthCalendar (MultiSelect, OnDateMouseEnter и др.) #59513Vitaliy PolyakovParticipantДобрый день, еще раз.
Мультиселект мышкой, через Ctrl и Shift, в своем проекте я реализовал, но пока это делал, нашел еще 3 особенности, возможно даже бага – все они видны в Demo-примере во вложении.
1. [Не критично] В абсолютно стандартном sMonthCalendar1, без скинов и без каких-либо параметров границ, в его обработчике OnDateMouseEnter(Sender: TObject; Date: TDateTime), следующий код:
Code:sLabel2.Caption:='OnDateMouseEnter: ' + DateToStr(Date);При перемещении указателя мыши над календарем, в обработчике переменная Date, содержит дату ячейки календаря, над которой в данный момент находится указатель. Но отведя указатель за границу любой крайней ячейки, на border календаря (3px по периметру компонента), переменная Date получает значение = 0.
Это так и должно быть?
С одной стороны, это легко лечится обычным if Date = 0 then … , но с другой стороны, при выходе указателя мыши за пределы области ячеек (на границу календаря), почему бы просто ничего не делать – не вызывать событие?
2. color=”#8b0000″]БАГ[/color Ошибка, близкая к первой фитче. В обработчике OnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer), следующий код:
Code:sLabel3.Caption:='OnMouseDown: ' + DateToStr(sMonthCalendar1.MousePosToDate(X,Y));При нажатии MouseDown в области ячеек, функция MousePosToDate(X,Y) возвращает дату ячейки календаря, по координатам мыши. При нажатии MouseDown на border (границе) календаря – также возвращает = 0, но при нажатии MouseDown в области Title календаря (заголовок, который отображает дни недели Пн,Вт,Ср,..), функция MousePosToDate(X,Y) возвращает дату ячейки календаря, которая скрыта, но как бы находится под ячейкой Title !!! 🙁
3. [Очень критично – т.к. сказывается на производительности] Справа на форме sMemo1, оно заполняется из обработчика календаря OnGetCellParams по коду:
Code:sMemo1.Lines.Add(DateToStr(Date));Т.е. sMemo1 просто информирует о том, какие ячейки календаря GetCell, скажем так – “отрисовываются“.
Для чистоты эксперимента, можете кинуть на форму нового проекта sMemo1 и sMonthCalendar1, с выключенным свойством AllowChangeMonth := false. Так вот, если мы теперь кликнем мышью на текущую выделенную ячейку календаря (предварительно отчистив строки sMemo1), то увидим, что в sMemo1 добавилась только одна дата (произошел GetCell 1 ячейки календаря), если мы мышкой кликнем на соседнюю ячейку календаря этого же месяца, то увидим, что в sMemo1 добавилось 3 строки: дата с которой ушел фокус, дата на которую пришел фокус и еще раз эта же дата, возможно синяя заливка фокуса или отрисовка пунктирного bevel самого фокуса – то же очень не ясно, зачем обрабатывать событие дважды!
С логикой такой простой последовательности разобрались, а теперь немного жести.
Если сначала кликнем, как в первом случае, на текущую выделенную ячейку календаря и потом перейдем на ту же соседнюю ячейку, только не с помощью мыши а клавишей курсора с клавиатуры (стрелка вправо/влево/вверх/вниз), то в sMemo1 добавится аж 42 строки!!! т.е. обработчик GetCell прошелся по всему календарю 7*6=42.
И это еще не все! При нажатии мышкой на любой день, соседнего месяца, к примеру, стояли на ячейке 31 Мая и кликнули на 1 Июня, происходит тоже самое. Месяц Май, по идее, вроде как должен был “перелистнуться” на следующий месяц Июнь, но из-за AllowChangeMonth := false, Май остался на месте, но при этом произошел OnGetCellParams по всему календарю (и скачек фокуса, о котором писал в топике выше) 🙁
Учитывая то, что при отрисовке в OnGetCellParams каждой ячейки определенным цветом, в зависимости от количества “событий” или конфликтов припадающих на этот день, мне нужно анализировать базу данных из нескольких тысяч записей соответствующих “событий”, то я ужасно разочарован из-за того, что вместо анализа 1-2 ячеек, в некоторых случаях, обращения к базе идут по 42 и более ненужных раз.
Уважаемые разработчики AlphaControls, я очень ценю то, что Вы делаете для всего developer-сообщества и в частности, что ваш продукт дает мне, но прошу пересмотреть приоритеты между имеющимися задачами и уделить отдельное внимание, решению вышеописанных проблем с TsMonthCalendar, если можно, отложив на время другие, не столь критические “плюшки”, полезности и удобства юзабилити. Всё, чем смогу сам лично, обращайтесь, с радостью помогу.
-
AuthorPosts