| 
			| 
					
						| 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 Кб - загружено 2161 раз.)
									 |  
								| « Последнее редактирование: 06-05-2005 19:23 от Nevis » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Alf 
								Гость
 | 
								|  | « Ответ #15 : 06-05-2005 21:49 »  |  | 
 
 Ну так тогда по нажатию кнопки с номером N запиши в Label1 текстовое значение week[N], все ведь уже подготовлено заранее.
 Если на кнопках ничего писать не нужно, тогда все упрощается, можно оптимизировать алгоритм, убрав ненужный массив. Но для начала я бы все-таки реализовал как есть.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |