Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2010, 15:01   #1
AnkaP
 
Регистрация: 24.01.2010
Сообщений: 8
По умолчанию Выбор периода времени DateTimePicker

Добрый день!
Помогите, пожалуйста, решить проблему.
Пишу программу по расчету коммунальных услуг. Произвожу расчеты начисления за использованный газ. Так вот, есть период отопительный, для него норма одна, а есть не отопительный - норма другая. Как указать в программе, что если пользователь производит расчеты в период с 1-го октября по 30 апреля, то норма такая-то, а в остальное время - расчет по другой формуле?
На форме имеется 2 DateTimePicker для указания периода времени, за который производится расчет.
Большое спасибо!
AnkaP вне форума Ответить с цитированием
Старый 24.01.2010, 15:18   #2
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Вот можно определить за какой месяц, в принципе таким же образом, вытащив месяц из даты, можно и узнать какие месяцы были выбраны.
Код:
var
d1:Integer;
begin
d1:=strtoint(FormatDateTime('mm',DateTimePicker1.Date));
case d1 of
 10,11,12,1,2,3,4:
 begin
  //расчет по одной формуле
 end
else
 begin
  //расчет по другой
 end;
end;
У нас принято оформлять код специальным тэгом - при помощи кнопочки "#".
Только...
И не значком #.
И не РНР-кодом.
И не значком цитаты.
И не собственными "ручками".
Рекомендую. Помимо общих правил форума есть и дополнения к ним в каждом разделе...
Модератор
Шипулин А. В.

Последний раз редактировалось mihali4; 24.01.2010 в 16:45.
Шульц вне форума Ответить с цитированием
Старый 24.01.2010, 15:39   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

в принципе Шульц прав.
только я бы организовал цикл по всем месяцам от первого месяца до последнего и ДЛЯ КАЖДОГО месяца проверял/считал с проверкой того, какой это месяц, "отапливаемый" или нет... Т.е. выбранный период может быть, например с февраля по июнь, или с января по ноябрь (т.е. в период могут входить как месяцы с учётом отопления, так и без оного...)

p.s. для получения месяца из даты я бы взял из JCL/ (ну, или написал свою на основе DecodeDate, благо это элементарно!:
Код:
function Month(const Dt : TDateTime) : word;
var Year, M, Day : Word;
begin
  DecodeDate(Dt, Year, M, Day);
  Month := M;
end;

Последний раз редактировалось Serge_Bliznykov; 24.01.2010 в 15:44.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.01.2010, 16:17   #4
AnkaP
 
Регистрация: 24.01.2010
Сообщений: 8
По умолчанию

Спасибо, но пока что-то не получается. Я попробовала по методу Шульца - выдает ошибку, когда я выбираю месяцы, не описанные в case. Это скорей всего, что в begin у меня много всяких условий:
Код:
begin
   Ngaz := Edit1.Text; // показание счетчика
 if lgota=1 then // если льгота отсутствует (1-id в БД)
   OPLATA_G{сумма к оплате} := (strtoint(Ngaz)-gaz)*tarifG else 
     NACHISLENO_G{кол-во использованого газа} := strtoint(Ngaz)-gaz;
     NORMA_G{норма потребления} := kol_lgot*usl_G+ind_otop*S;
      if NACHISLENO_G > NORMA_G then
       OPLATA_G := NORMA_G*tarifG*lgota + (NACHISLENO_G-NORMA_G)*tarifG else
       OPLATA_G := NACHISLENO_G*tarifG*lgota;
    Label10.Caption := floattostr(OPLATA_G);
    end;
Вот такой у меня расчет без месяцев. Когда применяю предложенный Вами вариант, то во втором begin в этой формуле
Код:
     NORMA_G{норма потребления} := kol_lgot*usl_G+ind_otop*S;
я удаляю ind_otop*S - это как раз отопление, и появляется ошибка при расчете 5-го, 6-го и т.д. месяцев

Последний раз редактировалось AnkaP; 24.01.2010 в 16:19.
AnkaP вне форума Ответить с цитированием
Старый 24.01.2010, 18:58   #5
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Дай весь код, и место, где возникает ошибка.
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 24.01.2010, 19:14   #6
AnkaP
 
Регистрация: 24.01.2010
Сообщений: 8
По умолчанию

Код:
procedure TForm4.SpeedButton1Click(Sender: TObject);
var  kol_lgot, kol_bez, ind_otop, usl_G: integer; 
      lgota, tarifG, OPLATA_G: double; 
      gaz: integer; 
     NACHISLENO_G, NORMA_G, d1: integer;
     Ngaz: string;
begin
d1:=strtoint(FormatDateTime('mm',DateTimePicker1.Date));
case d1 of
10,11,12,1,2,3,4:
begin
   Ngaz := Edit1.Text;
 if lgota=1 then
   OPLATA_G := (strtoint(Ngaz)-gaz)*tarifG
   else
     NACHISLENO_G := strtoint(Ngaz)-gaz;
     NORMA_G := kol_lgot*usl_G+ind_otop*S;
      if NACHISLENO_G > NORMA_G then
       OPLATA_G:= NORMA_G*tarifG*lgota + (NACHISLENO_G-NORMA_G)*tarifG
       else
        OPLATA_G := NACHISLENO_G*tarifG*lgota;
    end
else
 begin
 if lgota=1 then
   OPLATA_G :=  (strtoint(Ngaz)-gaz)*tarifG else
     NACHISLENO_G := strtoint(Ngaz)-gaz;
     NORMA_G := kol_lgot*usl_G;
       if NACHISLENO_G > NORMA_G then
     OPLATA_G:= NORMA_G*tarifG*lgota + (NACHISLENO_G-NORMA_G)*tarifG 
 else
      OPLATA_G := NACHISLENO_G*tarifG*lgota;
Label10.Caption := floattostr(OPLATA_G);
Считает только первый begin, а когда выбираю в DateTimePicker период не входящий в case (июль, например) - то не считает.
Сделала так:
Код:
begin
d1:=strtoint(FormatDateTime('mm',DateTimePicker1.Date));
case d1 of
10,11,12,1,2,3,4:
begin
   Ngaz := Edit1.Text;
 if lgota=1 then
   OPLATA_G := (strtoint(Ngaz)-gaz)*tarifG
   else
   begin
     NACHISLENO_G := strtoint(Ngaz)-gaz;
     NORMA_G := kol_lgot*usl_G+ind_otop*S;
    end; end
    else
    NORMA_G:= kol_lgot*usl_G;
      if NACHISLENO_G > NORMA_G then
       OPLATA_G:= NORMA_G*tarifG*lgota + (NACHISLENO_G-NORMA_G)*tarifG
       else
        OPLATA_G := NACHISLENO_G*tarifG*lgota;
 Label10.Caption := floattostr(OPLATA_G);
    end;
Так вообще ничего в Label не выводит ((((((((

Последний раз редактировалось AnkaP; 24.01.2010 в 19:38.
AnkaP вне форума Ответить с цитированием
Старый 24.01.2010, 19:32   #7
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Ну в конце перед Лаблом два End не дописал, а так вроде все правильно.
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 24.01.2010, 23:10   #8
AnkaP
 
Регистрация: 24.01.2010
Сообщений: 8
По умолчанию

Попробую еще сама поковырять. Спасибо!
AnkaP вне форума Ответить с цитированием
Старый 25.01.2010, 18:41   #9
AnkaP
 
Регистрация: 24.01.2010
Сообщений: 8
По умолчанию

Заработало когда вот так:
Код:
begin
d1:=strtoint(FormatDateTime('mm',DateTimePicker1.Date));
Ngaz := Edit1.Text;
NACHISLENO_G := strtoint(Ngaz)-gaz;
case d1 of
10,11,12,1,2,3,4:
begin
  if lgota=1 then
   OPLATA_G := NACHISLENO_G*tarifG
  else
   begin
    NORMA_G := kol_lgot*usl_G+ind_otop*S;
    if NACHISLENO_G > NORMA_G then
    OPLATA_G := NORMA_G*tarifG*lgota + (NACHISLENO_G-NORMA_G)*tarifG
       else
        OPLATA_G := NACHISLENO_G*tarifG*lgota;
        Label10.Caption := floattostr(OPLATA_G);
   end;
end
    else
begin
  NORMA_G := kol_lgot*usl_G;
  if NACHISLENO_G > NORMA_G then
  OPLATA_G := NORMA_G*tarifG*lgota + (NACHISLENO_G-NORMA_G)*tarifG
     else
      OPLATA_G := NACHISLENO_G*tarifG*lgota;
      Label10.Caption := floattostr(OPLATA_G);
end;
end;
AnkaP вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с расчетом периода времени Hitzkopf Microsoft Office Excel 3 30.11.2009 09:27
Случайный выбор времени из ограниченного диапазона Павел-812 Microsoft Office Excel 1 19.05.2009 08:55
Выбор Даты/Времени из БД при помощи DateTimePicker rainbow Общие вопросы Delphi 3 08.10.2008 12:42
Отображение в Label периода с помощью таймера DenSuper007x Помощь студентам 37 26.03.2008 22:05
Выбор товара из раннего периода? ASR Microsoft Office Excel 11 28.01.2008 15:08