2009-12-29 8 views
1

J'ai une application Delphi qui a été en production depuis plusieurs années maintenant et récemment un morceau de code spécifique a cessé de fonctionner. En cas OnClose pour la forme que je donne les résultats suivants:programme Delphi soudainement ne postez pas les changements de requête

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; 

Il obtient à l'appel dtpPEEndTimeChange(self) qui est la suivante:

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

alors que dans cette fonction les appels programme Windows.pas et se coince dans :

function GetTickCount; external kernel32 name 'GetTickCount'; 

il ne publie jamais les modifications apportées à l'enregistrement.

Est-ce que quelqu'un sait si des mises à jour Windows ont pu causer ce dysfonctionnement? Nous sommes actuellement sur Windows XP Professionnel Version 5.1 SP 3.

+2

La question évidente est "qu'est-ce qui a changé"? Si la seule chose qui a changé dans votre environnement est la mise à jour de Windows, la réponse est "Oui, les mises à jour de Windows sont à blâmer". Essayez de désinstaller le plus récent un par un et de tester ..? –

+4

Non, Steve, la chose la plus récente à changer n'est pas toujours la cause. Il se pourrait que le code ait été erroné pour toujours et la dernière mise à jour a finalement corrigé un bogue qui permettait au mauvais code de fonctionner par accident. –

+0

Peut-être - mais cela semble moins probable. Et certainement revenir sur les mises à jour permettra d'identifier le problème un peu. –

Répondre

2

GetTickCount renvoie Cardinal. Si vous stockez des résultats dans des variables entières, le dépassement d'entier se produira lorsque votre ordinateur sera en panne depuis 25 jours environ. Je ne fais que deviner, mais c'était une fois un problème dans notre application.

+0

Depuis l'aide Delphi: 'Le temps écoulé est stocké en tant que valeur DWORD. Par conséquent, l'heure sera arrondie à zéro si le système fonctionne en continu pendant 49,7 jours. Pour éviter ce problème, utilisez GetTickCount64. Pour cette raison, je n'utiliserais jamais GetTickCount ... – Edelcom

+0

@Edelcom: C'est une mauvaise idée dans la plupart des cas, car l'utilisation de 'GetTickCount64()' inconditionnellement limitera votre logiciel à Windows Vista, Server 2008 et versions ultérieures. Voir http://msdn.microsoft.com/fr-fr/library/ms724411%28VS.85%29.aspx – mghie

+0

Ceci est un bon aperçu, mais pas susceptible d'être son problème, car elle dit qu'il "gèle" à l'intérieur un appel du noyau api. Cela ressemble à une corruption de pile. –

Questions connexes