Nevis
Гость
|
|
« : 05-05-2005 11:51 » |
|
Меняю вопрос. Дату я получить смог так: AnsiString stDay[7] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"}; AnsiString stMonth[12] = {"Января", "Февряля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"}; TDateTime Today, NextDay; Word Year, Month, Day; Today = Now(); DecodeDate(Today, Year, Month, Day);
switch ( DayOfWeek(Today)){ case 6 : NextDay = Today + 3; break; case 7 : NextDay = Today + 2; break; default : NextDay = Today + 1; break;} Form2->Label1->Caption = IntToStr(Day) + " " + stMonth[Month-1] + " " + stDay[DayOfWeek(Today) -1];
У меня на форме семь кнопок с названиями дней недели. Допустим сегодня понедельник. Но вот проблемма, мне надо как-то сделать так, чтобы при нажатии на кнопку понедельник, у меня появиться текущее число, но при нажатии на кнопку вторник, число не меняется, а надо чтобы было следующее в том же Label1. Но на следующий день(во вторник) текущее число должно загореться на вторнике, а на понедельнике на неделю вперед, т.е. чтобы происходило смещение today в зависимости от дня недели. Как это сделать?
|
|
« Последнее редактирование: 05-05-2005 17:09 от Nevis »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 05-05-2005 19:00 » |
|
Объясни пожалуйста на пальцах, что ты хочеш именно сделать. Потому что ничего не ясно. По тому куску кода, что ты дал, у тебя Today - Текушая дата, в скомпанованом виде. Year - Текуший год Month - Текуший месяц Day - Текуший день NextDay - Следуюший рабочий день в скомпанованном виде
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #2 : 06-05-2005 05:49 » |
|
а если, что-то вроде: //ButtonNum - номер кнопки TDateTime Today = Now(); int AddedDays = ButtonNum - DayOfWeek(Today); if (AddedDays < 0) AddedDays+=7; TDateTime ShowDate = Today + AddedDays; Form2->Label1->Caption = ShowDate.FormatString("dd mmmm dddd");
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Nevis
Гость
|
|
« Ответ #3 : 06-05-2005 05:55 » |
|
Объясняю: Я пишу график работы автотранспорта. Суть его в том, что есть таблица. Пользователи(менеджеры) вносят изменения в эту таблицу - поездки, которые водитель должен осуществить в определенный день. На форме 7 кнопок, названия соответствуют дням недели. Менеджер запускает программу и выбирает тот день, в который водитель должен посетить ту или иную фирму. Т.е. нажимая на кнопку понедельник, ему в таблицу выводятся все поездки записанные на понедельник, так же с остальными днями недели. Проблемма у меня с датами, а именно: Надо сделать так, чтобы менеджеры видели на какое число они пишут свою поездку. Сегодня, например, пятница - значит в моей программе в лабеле должно быть написано 6 Мая Пятница(при нажатии на кнопку пятница). Если сегодня нажать на "субботу" - то в том же лабеле должно быть написано уже 7 Мая Суббота .... "вторник" - в лабеле 10 Мая Вторник .... "четверг" - в лабеле 12 Мая четверг - надеюсь это понятно. Проблема в том как заставить программу, получив текущий день недели, сопоставить с той кнопкой, которой тек. день соответствует. Чтобы, другим языком, 6 Мая Пятница, отображалось в лабеле только при нажатии на кнопку "пятница", а не на какую другую, в других, как я уже писал, день + 1. Завтра будет суббота, поэтому программа должна только при нажатии на кнопу "суббота" показать в лабеле 7 Мая Суббота, а при нажатии на пятницу +6 дней - т.е. 13 Мая Пятница и т.д. Вот в чем проблемма!
|
|
|
Записан
|
|
|
|
Nevis
Гость
|
|
« Ответ #4 : 06-05-2005 06:12 » |
|
а если, что-то вроде: //ButtonNum - номер кнопки TDateTime Today = Now(); int AddedDays = ButtonNum - DayOfWeek(Today); if (AddedDays < 0) AddedDays+=7; TDateTime ShowDate = Today + AddedDays; Form2->Label1->Caption = ShowDate.FormatString("dd mmmm dddd");
Та тоже не работает, поскольку дату верную я получу при нажатии текущего дня, но поле того как я ее получил в label1 , она не уходит и неменяется при выборе сл. дней. Но все равно спасибо.
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #5 : 06-05-2005 06:14 » |
|
" она не уходит и неменяется при выборе сл. дней." поясни, что значит не меняется? А процедура обработки нажатия кнопок как вызывается и как у тебя определяется ButtonNum?
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Nevis
Гость
|
|
« Ответ #6 : 06-05-2005 06:50 » |
|
Событие OnClick: void ShowVodila(TEdit *Edit) { if (Form2->Panel1->Visible == true || Form2->Panel5->Visible == true) {Form2->Edit3->Text = "F";} else { if (Form2->Panel4->Visible == true || Form2->Panel6->Visible == true) {Form2->Edit3->Text = "N";} else {ShowMessage("прогу заглючило, зовите сюда администратора!!!");} } } void ShowDay(TEdit *Edit) { if (Form2->Day->Caption == "Понедельник") {Form2->Edit2->Text="P";} else { if (Form2->Day->Caption == "Вторник") {Form2->Edit2->Text="V";} else { if (Form2->Day->Caption == "Среда") {Form2->Edit2->Text="S";} else { if (Form2->Day->Caption == "Четверг") {Form2->Edit2->Text="C";} else { if (Form2->Day->Caption == "Пятница") {Form2->Edit2->Text="Y";} else { if (Form2->Day->Caption == "Суббота") {Form2->Edit2->Text="U";} else { if (Form2->Day->Caption == "Воскресенье") {Form2->Edit2->Text="W";} else {ShowMessage("Выбери день недели на какой будем писать поездку!!!"); Form2->Edit2->Text="";} }}}}}}}
void __fastcall TForm2::BitBtn1Click(TObject *Sender) { TIniFile *ini; Panel2->Visible = true; Panel3->Visible = true; Panel7->Visible = false;
ini = new TIniFile("J:\\Graph3\\data.ini"); Day->Caption = ini->ReadString( "Days", "Day1", 1); delete ini;
ShowDay(Edit2); ShowVodila(Edit3);
Date(DateTime); ini = new TIniFile("J:\\Graph3\\driver.ini"); Label11->Caption = ini->ReadString( "Driver", "DriverFirm", 1); delete ini;
int Block = 0; ini = new TIniFile("J:\\Graph3\\data.ini"); Block = ini->ReadInteger( "FirmP", "Block", 1); if (Block == 1) {BitBtn8->Enabled = false; BitBtn9->Enabled = false; BitBtn10->Enabled = false; BitBtn11->Enabled = true; BitBtn12->Enabled = false;} else {BitBtn8->Enabled = true; BitBtn9->Enabled = true; BitBtn10->Enabled = true; BitBtn11->Enabled = false; BitBtn12->Enabled = true;} delete ini; }
Прошу надо мной не смеяться, но огромное количество if это мой бич, от которого я не знаю как избавиться. Кто бы научил?! Я вообще только начинаю, поэтому такой геморой создаю себе переодически. Но я еще учусь. Так вот именно так выглядит процедура нажатия на кнопку понедельник. Здесь процедуры ShowDay & ShowVodila, нужны потому что, водитель не один, иногда их 2 - все данные пишутся в одну таблицу, так вот эти процедуры, как видите, пишут букву в эдит. Потом эти уникальные буквы попадают в таблицу. Далее я оперирую с данными как хочу. Для вывода даты я писал отдельно процедуру, но та не работает почему-то: void Date(TLabel *DateTime) { AnsiString stDay[7] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"}; AnsiString stMonth[12] = {"Января", "Февряля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"}; TDateTime Today, NextDay; Word Year, Month, Day; Today = Now(); DecodeDate(Today, Year, Month, Day);
switch ( DayOfWeek(Today)){ case 6 : NextDay = Today + 3; break; case 7 : NextDay = Today + 2; break; default : NextDay = Today + 1; break;}
if (stDay[DayOfWeek(Today)] == "Понедельник" && Form2->Day->Caption == "Понедельник") {Form2->DateTime->Caption = IntToStr(Day) + " " + stMonth[Month-1];} else {Form2->DateTime->Caption = " "; if (stDay[DayOfWeek(Today)] == "Вторник" && Form2->Day->Caption == "Вторник") {Form2->DateTime->Caption = IntToStr(Day) + " " + stMonth[Month-1];} else {Form2->DateTime->Caption = " "; if (stDay[DayOfWeek(Today)] == "Среда" && Form2->Day->Caption == "Среда") {Form2->DateTime->Caption = IntToStr(Day) + " " + stMonth[Month-1];} else {Form2->DateTime->Caption = " "; if (stDay[DayOfWeek(Today)] == "Четверг" && Form2->Day->Caption == "Четверг") {Form2->DateTime->Caption = IntToStr(Day) + " " + stMonth[Month-1];} else {Form2->DateTime->Caption = " "; if (stDay[DayOfWeek(Today)] == "Пятница" && Form2->Day->Caption == "Пятница") {Form2->DateTime->Caption = IntToStr(Day) + " " + stMonth[Month-1];} else {Form2->DateTime->Caption = " "; if (stDay[DayOfWeek(Today)] == "Суббота" && Form2->Day->Caption == "Суббота") {Form2->DateTime->Caption = IntToStr(Day) + " " + stMonth[Month-1];} else {Form2->DateTime->Caption = " "; if (stDay[DayOfWeek(Today)] == "Воскресенье" && Form2->Day->Caption == "Воскресенье") {Form2->DateTime->Caption = IntToStr(Day) + " " + stMonth[Month-1];} else {Form2->DateTime->Caption = " ";} }}}}}} }
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #7 : 06-05-2005 07:36 » |
|
У тебя уже есть функция, определяющая день недели по дате (готовая либо собственноручно написанная)?
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #8 : 06-05-2005 07:43 » |
|
1 замечание: Зачем ты в процедурах (ShowVodila, например) пишешь "Form2->Edit3->Text",когда можно просто написать "Edit->Text" 2 вопроса: - TForm2::BitBtn1Click - определен для как OnClick для кнопок дней недели; - Name of days button?
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Nevis
Гость
|
|
« Ответ #9 : 06-05-2005 09:33 » |
|
Отвечаю на первый вопрос: В процедуре ShowVodila и др. я пишу Form2->Edit3->Caption вместо Edit3->Caption только потому, что компилятор начинает ругаться, он не понимает кто такой Edit3 без Form2 Отвечаю на второй вопрос: - TForm2::BitBtn1Click опледелен как OnClick событие, то есть при нажатии на эту кнопку происходит все то, что написано подTForm2::BitBtn1Click - Принажатии кнопки "Понедельник", как видно из кода, программа пишет день недели сама(сие ни как не привязано к настоящим дням недели), нужно это для того чтобы в один из Элитов подставить букву соответствующую понедельнику, я потом это использую при записи данных в таблицу. Мне же необходимо получить число и месяц четко соответсятвующий текущему дню недели, больше ничего. Отвечая на вопрос Alf`a: Вот код процедуры, которая определяет текущий день недели месяц и год, и пишет его так как мне надо. Есдинственное, я не могу адаптировать этот код так, чтобы число и месяц выводились в соответствующие дни AnsiString stDay[7] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"}; AnsiString stMonth[12] = {"Января", "Февряля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"}; TDateTime Today, NextDay; Word Year, Month, Day; Today = Now(); DecodeDate(Today, Year, Month, Day); Form2->Label1->Caption = IntToStr(Day) + " " + stMonth[Month-1] + " " + stDay[DayOfWeek(Today) -1];
Этот код работает, все делает его и надо адаптировать. Я хотел это сделать впихнув его в процедуру, в которой все бы вычислялось, а в событии OnClick, выводился бы результат. Надеюсь теперь все понятно?
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #10 : 06-05-2005 09:44 » |
|
не все... во первых: я не предлагал писать Edit3, я предлагал писать Edit (тот который в параметры процедуры передается) во вторых: "Вот код процедуры, которая определяет текущий день недели месяц и год, и пишет его так как мне надо." - это все реализовано в методе FormatString в третьх: для каких кнопок работает процедура BitBtn1Click? На события каких кнопок прописана эта функция.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #11 : 06-05-2005 09:48 » |
|
Form2->Day - это что за компонент?
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Alf
Гость
|
|
« Ответ #12 : 06-05-2005 10:20 » |
|
Если я правильно понял, функция DayOfWeek возвращает номер дня недели от 1 до 7? Тогда советую сделать следующее: 1. Заводим массив на неделю: 2. Определяем сегодняшние число и день недели: TDateTime today = Now(); short int weekDay = DayOfWeek(today); 3. Заполняем массив дат: for (short int i = 0; i < 7; i++) week[i] = today + i - weekDay; Теперь массив week заполнен числами за текущую неделю, осталось лишь перенести их на кнопки. Borland C++ под рукой нет, поэтому проверить в работе не было возможности. Заранее извиняюсь за возможные неточности.
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #13 : 06-05-2005 10:32 » |
|
а я так понял, что на кнопках уже статически написано: понедельник, вторник и т.д и при нажатии на одну из них надо в лабел засунуть _будующюю_, относительно _текущей_ , дату которая соответствует выбраному (нажатой клавише) дню недели...
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Nevis
Гость
|
|
« Ответ #14 : 06-05-2005 19:21 » |
|
Вот так выглядит форма. Роон понял меня почти правильно. При нажатии кнопки понедельник в Label1 пишется число и месяц (на кнопках ничего не пишется) В Label2 программа сама ставит день недели
|
12.JPG (12.79 Кб - загружено 2030 раз.)
|
« Последнее редактирование: 06-05-2005 19:23 от Nevis »
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #15 : 06-05-2005 21:49 » |
|
Ну так тогда по нажатию кнопки с номером N запиши в Label1 текстовое значение week[N], все ведь уже подготовлено заранее.
Если на кнопках ничего писать не нужно, тогда все упрощается, можно оптимизировать алгоритм, убрав ненужный массив. Но для начала я бы все-таки реализовал как есть.
|
|
|
Записан
|
|
|
|
|