2009-12-29 2 views
1

저는 몇 년 동안 생산 중이며 최근에 특정 코드 조각이 작동을 멈추었습니다. 폼의 OnClose 이벤트에서 나는 다음과 같습니다Delphi 프로그램이 갑자기 쿼리 변경 사항을 게시하지 않습니다.

procedure TfrmPublicEmpInfo.FormClose(Sender: TObject;var Action: TCloseAction); 
var 
    i : integer; 
    strWorkDays : string; 
begin 
    If cbMonday.Checked then strWorkDays := strWorkDays + 'Mo'; 
    If cbTuesday.Checked then strWorkdays := strWorkDays + 'Tu'; 
    If cbWednesday.Checked then strWorkdays := strWorkDays + 'We'; 
    If cbThursday.Checked then strWorkdays := strWorkDays + 'Th'; 
    If cbFriday.Checked then strWorkdays := strWorkDays + 'Fr'; 
    If cbSaturday.Checked then strWorkdays := strWorkDays + 'Sa'; 
    If cbSunday.Checked then strWorkdays := strWorkDays + 'Su'; 
    if strWorkDays <> '' then  
    begin 
    qryPubEmployees.Edit; 
    qryPubEmployees.FieldValues['OCCUPATION'] := strWorkDays; 
    end; 

    dtpPEEndTimeChange(self); 
    dtpPEStartTimeChange(self); 

    For i := 0 to ComponentCount - 1 do 
    begin 
    If Components[i] is TQuery Then 
     with Components[i] as TQuery do 
     begin 
     if State = dsEdit then 
     post; 
     end; 
    end; 
end; 

그것은이있는 dtpPEEndTimeChange(self) 전화를 가져옵니다

procedure TfrmPublicEmpInfo.dtpPEEndTimeChange(Sender: TObject); 
begin 
    qryPubEmployees.Edit; 
    dbePEEndTime.Field.Value := StrToInt(FormatDateTime('HHMM', dtpPEEndTime.Time)); 
end; 

이 기능의 프로그램이 Windows.pas를 호출에 걸리면 동안 :

function GetTickCount; external kernel32 name 'GetTickCount'; 

변경 사항을 레코드에 게시하지 않습니다.

Windows 업데이트로 인해 이러한 오작동이 발생했는지 알 수 있습니까? 현재 Windows XP Professional 버전 5.1 SP 3을 사용하고 있습니다.

+2

분명한 질문은 "변경된 사항"입니다. 사용자 환경에서 변경된 유일한 사항이 Windows 업데이트 인 경우 대답은 "예 창 업데이트는 비난합니다"입니다. 가장 최근의 것을 하나씩 제거하고 테스트하십시오 ..? –

+4

아니요, 스티브, 가장 최근의 일이 항상 그럴만 한 것은 아닙니다. 코드가 영원히 잘못되어 최신 업데이트가 결국 실수로 잘못된 코드가 작동하는 것처럼 보이게하는 버그를 수정했을 수 있습니다. –

+0

아마도 -하지만 그럴 가능성은 적습니다. 그리고 확실하게 모든 업데이트를 되 돌리면 문제를 조금씩 찾아 낼 수 있습니다. –

답변

2

GetTickCount는 Cardinal을 반환합니다. 정수 변수에 결과를 저장하는 경우, 컴퓨터가 최대 25 일 동안 계속되면 정수 오버플로가 발생합니다. 저는 추측하고 있지만 일단 응용 프로그램에서 문제가있었습니다.

+0

Delphi 도움말에서 '경과 시간은 DWORD 값으로 저장됩니다. 따라서 시스템이 49.7 일 동안 계속 실행되면 시간은 0으로 돌아갑니다. 이 문제를 피하려면 GetTickCount64를 사용하십시오. ' 이러한 이유 때문에 GetTickCount를 절대 사용하지 않을 것입니다. – Edelcom

+0

@Edelcom : 대부분의 경우 나쁜 생각입니다. GetTickCount64()를 사용하면 무조건 Windows Vista, Server 2008 이상 버전으로 소프트웨어가 제한됩니다. http://msdn.microsoft.com/en-us/library/ms724411%28VS.85%29.aspx – mghie

+0

참조 이것은 좋은 통찰력이지만 그녀가 문제가 될 가능성은 희박합니다. 내부에서 "얼어 붙었다"고 말했기 때문입니다. 커널 API 호출. 스택 손상처럼 들립니다. –

관련 문제