2009-12-29 37 views
1

我有Delphi應用程序已經生產了好幾年了,最近一段特定的代碼已停止工作。在OnClose事件的形式我有以下幾點:德爾菲程序突然不會發布查詢更改

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更新,那麼答案是「是的Windows更新是責備」。嘗試卸載最新的一個和測試..? – 2009-12-29 21:15:41

+4

不,史蒂夫,最近要改變的事情並不總是原因。這可能是代碼永遠是錯誤的,最新的更新最終修復了一個錯誤,它允許錯誤的代碼出現意外工作。 – 2009-12-29 21:18:43

+0

也許 - 但這似乎不太可能。當然,恢復任何更新都會指出這個問題。 – 2009-12-29 21:28:48

回答

2

GetTickCount返回紅衣主教。如果將結果存儲到整數變量中,則當計算機運行25天左右時,會導致整數溢出。 我只是猜測,但曾經是我們的應用程序中的問題。

+0

從Delphi幫助:'流逝的時間存儲爲一個DWORD值。因此,如果系統連續運行49.7天,時間將回到零。爲了避免這個問題,請使用GetTickCount64。'因此,我絕不會使用GetTickCount ... – Edelcom 2009-12-30 09:48:34

+0

@Edelcom:在大多數情況下,這是一個壞主意,因爲無條件地使用'GetTickCount64()'將限制您的軟件到Windows Vista,Server 2008及更高版本。請參閱http://msdn.microsoft.com/en-us/library/ms724411%28VS.85%29.aspx – mghie 2009-12-30 15:40:10

+0

這是一個很好的見解,但不可能是她的問題,因爲她說它內部「凍結」一個內核API調用。這聽起來像堆棧腐敗。 – 2009-12-31 14:00:10