Просмотр полной версии : Календарь
dr1emaver
11.09.2011, 20:07
Здравствуйте, есть класс календаря. По дням можно щелкать. Задача : через trace вывести дату на которую нажал:
Делаю так:
addEventListener(MouseEvent.CLICK,onDate); // инициируем нажатие на иконку.
private function onDate (e:MouseEvent):void {
var today = new Date();
trace ( _currentMonth+1); // месяц
trace ( _currentYear); // год
trace ( today.getDate() );
}
Месяц и год передает правильно.Но как передать дату, на которую щелкнул, ведь today.getDate() передаст сегоднящнюю! Помогите пожалуйста продумать этот момент )
Вам сюда (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/Date.html).
dr1emaver
11.09.2011, 20:38
Спасибо, но я там смотрел и мне ничего не дало в плане, как получить число именно то на которое я нажал в календаре.
В этом и дело, что с месяцем и годом легче, потому что отображать текущий надо, а вот как с днем появляются вопросы
Чего? Не понятно куда вы там нажимаете. Дата текущего месяца берется из свойства date:
date - свойство : День месяца по местному времени (целое число от 1 до 31), заданный объектом Date. Местное время определяется операционной системой, в которой запущена среда выполнения Flash.
dr1emaver
11.09.2011, 21:21
Нажимаю на ячейку.
//Эта функция которая добавляет текстовое поле в ячейку, ей передается номер ячейки ( номер дня)
function attachTextField(it:Number):void {
var textDate:TextField = new TextField();
textDate.mouseEnabled = false;
textDate.selectable = false;
textDate.text = it.toString();
textDate.width = 20;
textDate.height = 20;
_dates[tempNumber][2].addChild(textDate);
textDate.x = -1;
textDate.y = 1;
}
насколько можно судить по отрывкам кода, в таком вот примитивном раскладе это будет что-то типа
private function onDate(e:MouseEvent):void
{
trace( "date : " + (e.target as TextField ).text);
}
зы: имо любой уважающий себя календарь должен иметь хотя бы геттер selectedDate для этих целей
но это так - вообще, к делу не относится :)
dr1emaver
13.09.2011, 18:34
Код брал с сайта demiart и вот код класса :
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
import com.greensock.*;
import com.greensock.easing.*;
public class Calendar extends MovieClip {
public static const CHANGEDATE:String = 'changedate';//константа для имени события
public static const XGRID:Number = 12;//координаты сетки из ячеек с датами и панельки с днями недели
public static const YGRID:Number = 95;
public static const YDAYS:Number = 60;
public static const BETWEENCELLS:Number = 5;//расстояние между ячейками
private var _dateObject:Date;//экземпляр нужен для получения значений текущей даты, дня недели, года
private var _currentDate:Number;//текущая дата
private var _currentDay:Number;//текущий день недели
private var _currentMonth:Number;//текущий месяц
private var _currentYear:Number;//текущий год
private var _days:Array;//массив для хранения названий дней недели
private var _dates:Array;//массив для хранения дат
private var _months:Array;//массив для хранения названий месяцев
private var _daysinMonth:Array;//массив для хранения количества дней в месяце
private var _nextMonthButton:NextMonthButton;//кнопки
private var _prevMonthButton:PrevMonthButton;
private var _nextYearButton:NextYearButton;
private var _prevYearButton:PrevYearButton;
private var _textCurrentMonth:TextField;//текстовое поле для названия месяца
private var _textCurrentYear:TextField;//текстовое поле для значения года
private var _formateTextMonthAndYear:TextFormat;//форматы для текстовых полей
private var _formateTextDate:TextFormat;
private var _formateTextDays:TextFormat;
private var _startCell:Number;//ячейка с сегодняшней датой
public function Calendar() {
init();
}
private function init():void {
_dateObject = new Date();
_currentDate = _dateObject.getDate();
_currentDay = _dateObject.getDay();
_currentYear = _dateObject.getFullYear();
_currentMonth = _dateObject.getMonth();
_days = ['пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'вс']
_months = ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"];
_daysinMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
buildHeader();//создаем текстовые поля для названия месяца, года; создаем панельку с днями недели
buildGrid();//создаем сетку из ячеек с датами
showCurrentDate();//изменяем сетку в соответствии с видом текущего месяца
//когда пользователь кликает по кнопкам для изменения даты или года (см метод onClick()),
//мы отправляем событие Calendar.CHANGEDATE, которое обрабатывает метод onChangeDate()
addEventListener(MouseEvent.CLICK, onClick);
addEventListener(Calendar.CHANGEDATE, onChangeDate);
addEventListener(MouseEvent.CLICK,onDate); // по нажатию на иконку дату перемещаем.
}
private function buildHeader():void {
//создаем экземпляр текстового поля с присоединенным шрифтом, чтобы
//этот шрифт можно было использовать в нашем ролике
var textEmbed:TextEmbed = new TextEmbed();
//создаем формат текстовых полей для названия месяца и значения года
_formateTextMonthAndYear = new TextFormat();
_formateTextMonthAndYear.color = 0x333333;
_formateTextMonthAndYear.font = 'Tahoma';
_formateTextMonthAndYear.size = '16';
_formateTextMonthAndYear.bold = true;
_formateTextMonthAndYear.align = TextFormatAlign.CENTER;
//создаем формат текстового поля для значений даты
_formateTextDate = new TextFormat();
_formateTextDate.color = 0xffffff;
_formateTextDate.font = 'Tahoma';
_formateTextDate.size = '13';
_formateTextDate.bold = true;
_formateTextDate.align = TextFormatAlign.CENTER;
//создаем формат текстового поля для значений дней недели
_formateTextDays = new TextFormat();
_formateTextDays.color = 0xffffff;
_formateTextDays.font = 'Tahoma';
_formateTextDays.size = '14';
_formateTextDays.bold = true;
_formateTextDays.align = TextFormatAlign.CENTER;
//создаем текстовое поле для названия месяца
_textCurrentMonth = new TextField();
_textCurrentMonth.selectable = false;
_textCurrentMonth.defaultTextFormat = _formateTextMonthAndYear;
_textCurrentMonth.embedFonts = true;
_textCurrentMonth.x = 23;
_textCurrentMonth.y = 25;
_textCurrentMonth.width = 90;
_textCurrentMonth.height = 40;
_textCurrentMonth.text = _months[_currentMonth];
addChild(_textCurrentMonth);
//создаем текстовое поле для значения года
_textCurrentYear = new TextField();
_textCurrentYear.embedFonts = true;
_textCurrentYear.selectable = false;
_textCurrentYear.defaultTextFormat = _formateTextMonthAndYear;
_textCurrentYear.x = 137;
_textCurrentYear.y = 25;
_textCurrentYear.width = 80;
_textCurrentYear.height = 40;
_textCurrentYear.text = _currentYear.toString();
addChild(_textCurrentYear);
//создаем ячейки с названиями дней недели
for (var i:int = 0; i < _days.length; i++) {
var bgDay:BgDay = new BgDay();
addChild(bgDay);
bgDay.x = i * (bgDay.width + BETWEENCELLS) + XGRID;
bgDay.y = YDAYS;
var textDay:TextField = new TextField();
textDay.mouseEnabled = false;
textDay.selectable = false;
textDay.text = _days[i];
textDay.width = 30;
textDay.height = 30;
textDay.embedFonts = true;
textDay.setTextFormat(_formateTextDays);
bgDay.addChild(textDay);
textDay.x = -3;//эти значения получаем опытным путем :)
textDay.y = 1;
}
//создаем кнопки для изменения месяцев и лет
_nextMonthButton = new NextMonthButton();
_nextMonthButton.stop();
_nextMonthButton.x = 115;
_nextMonthButton.y = 33;
_nextMonthButton.buttonMode = true;
_nextMonthButton.useHandCursor = true;
addChild(_nextMonthButton);
_prevMonthButton = new PrevMonthButton();
_prevMonthButton.stop();
_prevMonthButton.x = 15;
_prevMonthButton.y = 33;
_prevMonthButton.buttonMode = true;
_prevMonthButton.useHandCursor = true;
addChild(_prevMonthButton);
_nextYearButton = new NextYearButton();
_nextYearButton.stop();
_nextYearButton.x = 209;
_nextYearButton.y = 33;
_nextYearButton.buttonMode = true;
_nextYearButton.useHandCursor = true;
addChild(_nextYearButton);
_prevYearButton = new PrevYearButton();
_prevYearButton.stop();
_prevYearButton.x = 137;
_prevYearButton.y = 33;
_prevYearButton.buttonMode = true;
_prevYearButton.useHandCursor = true;
addChild(_prevYearButton);
}
private function onChangeDate(e:Event):void {
clearGrid()//убираем старую сетку
buildGrid();//делаем новую
showCurrentDate();
}
private function clearGrid():void {
//удаляем все ячейки
_dates = null;
while (getChildAt(numChildren-1) is BgDate) {
removeChild(getChildAt(numChildren-1));
};
//создаем новый объект Date, со значениями года и месяца, которые выбрал пользователь
_dateObject = new Date(_currentYear,_currentMonth, _currentDate);
_currentDate = _dateObject.getDate();
_currentDay = _dateObject.getDay();
_currentYear = _dateObject.getFullYear();
_currentMonth = _dateObject.getMonth();
}
private function showCurrentDate():void {
//небольшая проверка на високосный год, если год не високосный, то в феврале 28 дней
_daysinMonth[1] = 28;
//если високосный - 29
if ((_currentYear / 4 - Math.floor(_currentYear / 4) == 0)) {
_daysinMonth[1] = 29;
}
if (_currentYear / 100 - Math.floor(_currentYear / 100) == 0 &&
_currentYear / 400 - Math.floor(_currentYear / 400) != 0) {
_daysinMonth[1] = 28;
}
//ищем в сетке ближайшую ячейку, день недели которой совпадает со значением _currentDay
for (var i:Number = _currentDate - 1; i < _dates.length - 1; i++) {
if (_dates[i][1] == _currentDay) {
_startCell = i;
_dates[i][2].gotoAndStop(2);
break;
}
}
var tempNumber:Number;
tempNumber = _startCell;
//функция добавляет текстовое поле в ячейку
function attachTextField(it:Number):void {
var textDate:TextField = new TextField();
textDate.mouseEnabled = false;
textDate.selectable = false;
textDate.text = it.toString();
textDate.width = 30;
textDate.height = 30;
textDate.embedFonts = true;
textDate.setTextFormat(_formateTextDate);
_dates[tempNumber][2].addChild(textDate);
textDate.x = -3;//эти значения получаем опытным путем :)
textDate.y = 1;
}
//добавляем текстовые поля к ячейкам от текущей даты до первого числа месяца
for (var j:Number = _currentDate; j > 0; j--) {
attachTextField(j);
tempNumber--;
}
//восстанавливаем значение tempNumber
tempNumber = _startCell;
//добавляем текстовые поля к ячейкам от текущей даты до последнего числа месяца
for (var k:Number = _currentDate; k <= _daysinMonth[_currentMonth]; k++) {
attachTextField(k);
tempNumber++;
}
//удаляем ячейки без текстовых полей из списка отображения, хотя можно этого и не делать,
//а просто изменять их внешний вид
for (var l:Number = 0; l < _dates.length ; l++) {
if (_dates[l][2].numChildren==1) {
removeChild(_dates[l][2]);
}
}
]
Дальше продолжение этого же класса
dr1emaver
13.09.2011, 18:35
//создаем сетку из ячеек дат
private function buildGrid():void {
_dates = new Array();
var it:Number = 0;
for (var i:Number = 0; i < 6; i++) {
for (var j:Number = 0; j <= 7; j++) {
if (j == 7) {
break;
}
it++;
var dateOfMonth:Number;
dateOfMonth = it;
var dayOfWeek:Number;
dayOfWeek = j + 1;
if (dayOfWeek == 7) {
dayOfWeek = 0;
}
var bgDate:BgDate = new BgDate();
addChild(bgDate);
bgDate.x = j * (bgDate.width + BETWEENCELLS) + XGRID;
bgDate.y = i * (bgDate.height + BETWEENCELLS) + YGRID;
_dates.push([dateOfMonth, dayOfWeek, bgDate]);
}
}
}
//обработчик события MouseEvent.CLICK - здесь меняем месяцы и даты
//и отправляем событие Calendar.CHANGEDATE
private function onClick(e:MouseEvent):void {
if (e.target is NextMonthButton || e.target is PrevMonthButton
||e.target is NextYearButton || e.target is PrevYearButton) {
if (e.target is NextMonthButton) {
_currentMonth++;
if (_currentMonth == 12) {
_currentMonth = 0;
_currentYear++;
_textCurrentYear.text = _currentYear.toString();
}
_textCurrentMonth.text = _months[_currentMonth];
} else if (e.target is PrevMonthButton) {
_currentMonth--;
if (_currentMonth == -1) {
_currentMonth = 11;
_currentYear--;
_textCurrentYear.text = _currentYear.toString();
}
_textCurrentMonth.text = _months[_currentMonth];
}
if (e.target is NextYearButton) {
_currentYear++;
_textCurrentYear.text = _currentYear.toString();
} else if (e.target is PrevYearButton) {
_currentYear--;
_textCurrentYear.text = _currentYear.toString();
}
dispatchEvent(new Event(CHANGEDATE));
}
}
private function onDate (e:MouseEvent):void {
trace ( _currentMonth+1);
trace ( _currentYear);
trace (_months[_currentMonth]);
trace( ); //тут вывести номер дня
}
}
}
в функции onDate надо вывести через trace день на иконку которого нажал.
что-то мне подсказывает что это _currentDay
dr1emaver
13.09.2011, 19:25
_currentDay - это сегодняшний день, а мне нужен тот день на иконку которого я нажал...
Лично я в коде не вижу обработки клика по определенному дню..
dr1emaver
13.09.2011, 19:35
т.е. получается что мы создаем еще одного слушателя :
addEventListener ( MouseEvent.CLICK,onClickCell)
а дальше надо как то сделать,чтобы в функции onClickCell находился номер дня ( номер ячейки) на которую мы кликнули, но как?
>>надо как то сделать,чтобы в функции onClickCell находился номер дня ( номер ячейки) на которую мы кликнули
сделать сами ячейки кликабельными : textDate.mouseEnabled = true; или прозрачную подложку с mouseEnabled ему добавить, ну и запоминать же на клике id кликнутой ячейки в свойстве, чтобы оно было доступно в любом другом месте..или не id, а саму дату, в твоем примере это типа _dateObject
не могу конкретнее, пример твой не тестируемый, а умозрительно фантазировать не хочется
глянь как minimalComs (http://www.minimalcomps.com/) сделано, может и изобретать ничего не стоит :)
Код брал с сайта demiart и вот [!]
Последнее место, где нужно брать код.
dr1emaver
14.09.2011, 01:50
dimarik,а там плохо что ли?
Вот проект весь
Drac0Sha
19.09.2011, 20:23
помогите пожалуйста..
dr1emaver вы решили эту проблему!?
не уверен, что понимаю в чем собственно проблема (на мой взгляд проблема только в бардачном коде:))
но если это поможет в аттаче класс из примера dr1emaver'а с поправкой, дающей дату кликнутой ячейки в обработчике
(поправка заключается только в добавлении этим ячейкам свойства с этой датой)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.