ON edit에 설정한 시간에 시작해서 Off Edit에 설정한 시간에 끝나는 기능을
구현하고자 합니다.
타이머 두개를 사용했구요.(한개를 써도 될거같은데 잘 안되네요. ;;)
문제는 현재시간보다 설정시간이 크면 on 되게 하고 같으면 정지 시키도록
만들고자 하는데 밤 12시가 지난 경우에는 이 비교가 틀리게 되잖아요.
예를들어) 1730 (5시30분)에 on 되게 한경우에 이 시간이 되면 On이 되는데
밤12가 넘으면 시간이 0120 이런식으로 바뀌니까 이 비교가 안될거
같은데 어떻게 해야할지 좀 알려주세요...
그리고 OFF 설정시간이 같으면 정지상태인데 그 시간만 정지이고 바로 시간이 지나면 무효가 되므로 정지상태로 바로 빠져나가는 방법은 없는지요?
즉, On 시간 비교해서 맞으면 타이머 나가버리구요... OFF시간 비교해서 맞으면 타이머 나가버리고 ..그런식으로 하면 될거 같은데...어떻게 나가는지 잘
모르겠어요.
procedure TForm1.Timer2Timer(Sender: TObject);
var
CurrTime, SpecTime1: string;
begin
CurrTime := FormatDateTime('HHMM', Now);
SpecTime1 := Edit1.Text;
if StrToInt(CurrTime) > StrToInt(SpecTime1) then
begin
Showmessage('동작중입니다.');
end
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
CurrTime, SpecTime: string;
begin
CurrTime := FormatDateTime('HHMM', Now);
SpecTime := Edit2.Text;
if CurrTime = SpecTime then
ShowMessage('동작정지상태입니다.')
end;
우선 타이머 안에 어떠한 내용이 들어가는지.. 타이머 인터발은 얼마인지..
예를 들면 07:00 부터 14:00 까징 작업을 하겠다 하면..
그냥 타이머 1개에 넣으면 될것도 같은데..
문제는 타이머 인터발 이네요..
만약 타이머 인터발이 1초면
07:00:00 도 07시 00분
07:00:01 도 07시 00분
.
.
.
07:00:59 도 07시 00분
그리고 정확하게 인터발이 1초씩 뛴다면(꼭 그렇다는 가정은 없지만)
총 59번 을 호출 하겠네요..
" 그러면 인터발을 1분씩 주면 되겠네요 " 하면 .. 할말은 없지만..
제가 경험해본 결과.. 컴의 타이머가 그렇게 정확하게 뛴다는 보장이 없기
때문에.. 좀. 머리아프더군요..
왜냐면 1분씩 인터발을 주고 코딩하였는데. 잘 작동하다가
07:00이 되었을때 하드디스크 write 라든지 프린터를 작동한다던지 하면
인터발을 놓칠수도 있거든요....즉 타이머 루틴안에 어떠한 내용이 들어
가는지가 중요한 관건일수도 있네요..
그렇다고 방법은 없는 것은 아닌데. 제가 주로 사용하는 방법이
타이머 인터발을 0.6초에서 0.9초 사이의 값을 주고, 실행여부 플레그를
두어 체크하는 거죠.. 간단한 소스를 보면
(말 그대로 간단 소스입니다... 물론 컴파일도 않돼요.. 참고만)
(07:00 에서 14:00 까징 작업)
-----------------------------------------------------------------
public
TimerFlag : Byte;
procedure TForm1.FormCreate(Sender: TObject);
begin
TimerFlag := 0; // 0 <== 아직 실행하지 않음..
end;
procedure TForm1.Timer1Timer1(Sender: TObject);
begin
NowTime := 현재시간
if 현재시간 := '07:00' then
begin
if TimerFlag = 0 then // 실행 했냐?
begin
작업 Start 루틴 실행;
TimerFlag := 1;
end;
end
else
begin
TimerFlag := 0;
end;
if 현재시간 := '14:00' then
begin
if TimerFlag = 0 then // 실행 했냐?
begin
작업 End 루틴 실행;
TimerFlag := 1;
end;
end
else
begin
TimerFlag := 0;
end;
end;
좀 무식한(?) 방법인데.. FA 프로그램쪽에서는 쫌 단순무식한게
원할하게 돌아가서리.. (순전히 개인생각입니다.. 흐흐흐흐)
답변도 아니면서 이상한 내용만 적어서 죄송합니다..
그럼 수고하세요!!