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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2010, 15:14   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос Таймер обратного отсчета работает не так как надо.. нужно найти ошибку в коде...

Привет=)
Есть код таймера обратного отсчета.
отсчитываем часы минуты исекунда.. по достижению 0-ля происходит действие выбранное пользователем из предложеных..
время задаётся 3-мя SpinEdit'ами..

вот листинг:
Код:
function TimeIntToStr(N: Integer): string;
begin
  Result := IntToStr(N);
  if Length(Result) = 1 then
    Result := '0' + Result;
end;

procedure TMainForm.StartPowerBtnClick(Sender: TObject); //запуск отсчета
begin
StartPowerBtn.Enabled:=False;
RestoreBtn.Enabled:=False;
StopPowerBtn.Enabled:=True;
HourSpinEdit.Enabled:=False;
MinSpinEdit.Enabled :=False;
SecSpinEdit.Enabled:=False;
Timer.Enabled:=True;

//Деактивация кнопок действия..
PCActionGr.Enabled:=False;
end;

procedure TMainForm.StopPowerBtnClick(Sender: TObject); //остановка..
begin
StartPowerBtn.Enabled:=True; //кнопка старта отсчета доступна
StopPowerBtn.Enabled:=False; //кнопка старта отсчета не доступна

RestoreBtn.Enabled:=True; //кнопка сброса таймера отсчета доступна

//изменение счетчика таймера доступны
HourSpinEdit.Enabled:=True;
HourSpinEdit.Value:=0;
MinSpinEdit.Enabled :=True;
MinSpinEdit.Value:=0;
SecSpinEdit.Enabled:=True;
SecSpinEdit.Value:=0;

Timer.Enabled:=False;

//активация кнопок действия..
PCActionGr.Enabled:=True;
end;

procedure TMainForm.TimerTimer(Sender: TObject);
var
Hours, Minutes, Seconds: Integer;
S: string;
begin
  S := TheTime.Caption;
  Hours := StrToIntDef(Copy(S, 1, Pos(':', S) - 1), 0);
  Delete(S, 1, Pos(':', S));
  Minutes := StrToIntDef(Copy(S, 1, Pos(':', S) - 1), 0);
  Delete(S, 1, Pos(':', S));
  Seconds := StrToIntDef(S, 0);
  Seconds := Seconds - 1;
  if Seconds < 0 then begin
    Seconds := 59;
    Minutes := Minutes - 1;
    if Minutes < 0 then begin
      Minutes := 59;
      Hours := Hours - 1;
      if Hours < 0 then begin
        Timer.Enabled := False;
        Hours := 0;
        Minutes := 0;
        Seconds := 0;
        HourSpinEdit.Enabled := True;
        HourSpinEdit.Value := 0;
        MinSpinEdit.Enabled := True;
        MinSpinEdit.Value := 0;
        SecSpinEdit.Enabled := True;
        SecSpinEdit.Value := 0;
        begin
        {** После завершения отсчета произойдет код... **}
        {case PCActionGr.ItemIndex of
        0: SystemRequests(EWX_POWEROFF or EWX_FORCE);    //Выключение
        1: SystemRequests(EWX_REBOOT or EWX_FORCE);  //перезагрузка
        3: SystemInWait;     //Ждущий режим
        end;}
        MessageBox(0,'Таймер завершил работу. Сейчас произойдет одно из выбранных вами действий.'+#10#13+'{это тестовая версия,ничего не будет}','Тестовое сообщение',MB_OK or MB_ICONINFORMATION);
        TheTime.Caption := '00:00:00';
      end;
    end;
  end;
  TheTime.Caption := TimeIntToStr(Hours) + ':' +
    TimeIntToStr(Minutes) + ':' +
    TimeIntToStr(Seconds);
end;
end;



procedure TMainForm.HourSpinEditChange(Sender: TObject); //счетчик часов
begin
  if HourSpinEdit.Value = -1 then begin
    TheTime.Caption := '00' + Copy(TheTime.Caption, 3, 6);
    Exit;
  end else if HourSpinEdit.Value = 99 then Exit;
  if HourSpinEdit.Value < 10 then
    TheTime.Caption := '0' + FloatToStr(HourSpinEdit.Value) + Copy(TheTime.Caption, 3, 6)
  else
    TheTime.Caption := FloatToStr(HourSpinEdit.Value) + Copy(TheTime.Caption, 3, 6);
end;

procedure TMainForm.MinSpinEditChange(Sender: TObject); //счетчик минут
begin
  if MinSpinEdit.Value = -1 then begin
    TheTime.Caption := Copy(TheTime.Caption, 1, 3) + '00' + Copy(TheTime.Caption, 6, 3);
    Exit;
  end else if MinSpinEdit.Value = 59 then Exit;
  if MinSpinEdit.Value < 10 then
    TheTime.Caption := Copy(TheTime.Caption, 1, 3) + '0' + FloatToStr(MinSpinEdit.Value) + Copy(TheTime.Caption, 6, 3)
  else
    TheTime.Caption := Copy(TheTime.Caption, 1, 3) + FloatToStr(MinSpinEdit.Value) + Copy(TheTime.Caption, 6, 3);
end;

procedure TMainForm.SecSpinEditChange(Sender: TObject);  //счетчик секунд
begin
  if SecSpinEdit.Value = -1 then begin
    TheTime.Caption := Copy(TheTime.Caption, 1, 6) + '00';
    Exit;
  end else if SecSpinEdit.Value = 59 then Exit;
  if SecSpinEdit.Value < 10 then
    TheTime.Caption := Copy(TheTime.Caption, 1, 6) + '0' + FloatToStr(SecSpinEdit.Value)
  else
    TheTime.Caption := Copy(TheTime.Caption, 1, 6) + FloatToStr(SecSpinEdit.Value);
end;
таймер должен работать но ничего не меняется.. отматывает 1 сеунду и все.

P.S. за код таймера спасибо WOLF =)
Человек_Борща вне форума Ответить с цитированием
Старый 13.04.2010, 15:35   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
if Hours < 0 then begin
Timer.Enabled := False;
Может быть срабатывает это условие? Ты поставь брекпоинт и пошагам программу отладь, увидишь где вылет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.04.2010, 15:48   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

это условие того что таймер отключится когда все 3 значения достигнут 0-ля и произойдет дейсвие..

могу прикрепить исходник и программу.
Человек_Борща вне форума Ответить с цитированием
Старый 13.04.2010, 15:53   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да ты уж если не сложно проект в архив, и сюда.
Ато так перецеплять твой код к компонентам жестоко
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.04.2010, 16:00   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Радость

Да, несложно..

прикрепил исходник и Exe для понимания ситуации..
Исходник нуждается в:
AphaSkins и CoolTrayIcon компонентах..

++Added++
упс.. забыл сурц=)
Вложения
Тип файла: zip Power_Off_Src.zip (555.0 Кб, 11 просмотров)
Тип файла: zip PowerOff_UPX_Compressed.zip (920.7 Кб, 12 просмотров)

Последний раз редактировалось Человек_Борща; 13.04.2010 в 16:14.
Человек_Борща вне форума Ответить с цитированием
Старый 13.04.2010, 16:36   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
AphaSkins и CoolTrayIcon компонентах..
У-у-у. Этим баловством не занимаюсь...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.04.2010, 16:42   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

*Перебросить не сложно.. заменить компоненты на свои и дать имена которые используются в коде.

Народ, есть ещё варианты решения проблемы?
Человек_Борща вне форума Ответить с цитированием
Старый 13.04.2010, 19:00   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Народ, I need you help!
Человек_Борща вне форума Ответить с цитированием
Старый 13.04.2010, 19:45   #9
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
Подмигивание

Чем разбираться в куче кода проще самому написать:

Код:
unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, ExtCtrls, DateUtils;

type
  TfrmMain = class(TForm)
    cbHour: TComboBox;
    cbMin: TComboBox;
    cbSec: TComboBox;
    XPManifest1: TXPManifest;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    lbledtTime: TLabeledEdit;
    btnStart: TButton;
    btnStop: TButton;
    tmrInc: TTimer;
    btnContinue: TButton;
    procedure btnContinueClick(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
    procedure tmrIncTimer(Sender: TObject);
    procedure btnStartClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  Separator = ':';

var
  frmMain: TfrmMain;
  myDate: TDateTime;

implementation

{$R *.dfm}

{Возобновляем после паузы}
procedure TfrmMain.btnContinueClick(Sender: TObject);
begin
  tmrInc.Enabled := true;
end;

{Запускаем таймер}
procedure TfrmMain.btnStartClick(Sender: TObject);
begin
  myDate := EncodeTime(StrToInt(cbHour.Text), StrToInt(cbMin.Text),
    StrToInt(cbSec.Text), 100);
  tmrInc.Enabled := true;
end;

{Останавливаем, если нужно}
procedure TfrmMain.btnStopClick(Sender: TObject);
begin
  tmrInc.Enabled := false;
end;

{Заполняем комбобоксы, может по-другому у себя реализуеш}
procedure TfrmMain.FormCreate(Sender: TObject);
var
  I: integer;
begin
  cbSec.Clear;
  cbMin.Clear;
  for I := 0 to 59 do
  begin
    if I < 10 then
    begin
      cbMin.Items.Add('0' + IntToStr(I));
      cbSec.Items.Add('0' + IntToStr(I));
      Continue;
    end;
    cbMin.Items.Add(IntToStr(I));
    cbSec.Items.Add(IntToStr(I));
  end;
  cbHour.Clear;
  for I := 0 to 23 do
  begin
    if I < 10 then
    begin
      cbHour.Items.Add('0' + IntToStr(I));
      Continue;
    end;
    cbHour.Items.Add(IntToStr(I));
  end;
end;

procedure TfrmMain.FormShow(Sender: TObject);
begin
  lbledtTime.SetFocus;
end;

{Ждём пока время не выйдет}
procedure TfrmMain.tmrIncTimer(Sender: TObject);
begin
  myDate := IncSecond(myDate, -1);
  LongTimeFormat := 'hh:mm:ss';
  lbledtTime.Text := TimeToStr(myDate);
  if lbledtTime.Text = '00:00:00' then
  begin
    ShowMessage('Ok');
    tmrInc.Enabled := false;
  end;
end;

end.
Вот и всё!! Исходник прилагается
Вложения
Тип файла: rar Timer.rar (24.3 Кб, 19 просмотров)
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 13.04.2010, 20:01   #10
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Переделал, теперь работает, сорц в аттаче...
Вложения
Тип файла: rar Power_Off_Src.rar (493.8 Кб, 17 просмотров)
W0LF вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С#.NET. Маленькая проблемка - условие не работает так , как надо Ksy Общие вопросы .NET 11 24.12.2009 21:07
Нужно найти ошибку в коде Вован111 Помощь студентам 15 08.11.2009 14:33
Таймер обратного отсчета Bilargo Помощь студентам 6 30.09.2009 17:02
Функция обратного вызова и таймер на WinApi flug Win Api 4 17.09.2009 16:06
Таймер обратного отсчета на С Raptor Помощь студентам 6 08.01.2008 01:11