Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с датой не получается(Изменено содержание)  (Прочитано 19473 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 05-05-2005 19:00 » 

Объясни пожалуйста на пальцах, что ты хочеш именно сделать. Потому что ничего не ясно. По тому куску кода, что ты дал, у тебя
Today - Текушая дата, в скомпанованом виде.
Year - Текуший год
Month - Текуший месяц
Day - Текуший день
NextDay - Следуюший рабочий день в скомпанованном виде
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
PooH
Глобальный модератор

ru
Offline 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
Глобальный модератор

ru
Offline 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
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #8 : 06-05-2005 07:43 » new

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
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #10 : 06-05-2005 09:44 » 

не все...
во первых: я не предлагал писать Edit3, я предлагал писать Edit (тот который в параметры процедуры передается)
во вторых: "Вот код процедуры, которая определяет текущий день недели месяц и год, и пишет его так как мне надо." - это все реализовано в методе FormatString
в третьх: для каких кнопок работает процедура BitBtn1Click? На события каких кнопок прописана эта функция.
Записан

Удачного всем кодинга! -=x[PooH]x=-
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #11 : 06-05-2005 09:48 » 

 Form2->Day - это что за компонент?
Записан

Удачного всем кодинга! -=x[PooH]x=-
Alf
Гость
« Ответ #12 : 06-05-2005 10:20 » 

Если я правильно понял, функция DayOfWeek возвращает номер дня недели от 1 до 7?

Тогда советую сделать следующее:

1. Заводим массив на неделю:
Код:
TDateTime week[7];

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
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #13 : 06-05-2005 10:32 » 

а я так понял, что на кнопках уже статически написано: понедельник, вторник и т.д  и при нажатии на одну из них надо в лабел засунуть _будующюю_, относительно _текущей_ , дату которая соответствует выбраному (нажатой клавише) дню недели...
Записан

Удачного всем кодинга! -=x[PooH]x=-
Nevis
Гость
« Ответ #14 : 06-05-2005 19:21 » 


Вот так выглядит форма.
Роон понял меня почти правильно.
При нажатии кнопки понедельник в Label1 пишется число и месяц (на кнопках ничего не пишется) В Label2 программа сама ставит день недели

* 12.JPG (12.79 Кб - загружено 2024 раз.)
« Последнее редактирование: 06-05-2005 19:23 от Nevis » Записан
Alf
Гость
« Ответ #15 : 06-05-2005 21:49 » 

Ну так тогда по нажатию кнопки с номером N запиши в Label1 текстовое значение week[N], все ведь уже подготовлено заранее.

Если на кнопках ничего писать не нужно, тогда все упрощается, можно оптимизировать алгоритм, убрав ненужный массив. Но для начала я бы все-таки реализовал как есть.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines