日期格式化故障发生 - 可能的原因,以及预防或否定的最有可能的方法?

时间:2014-04-22 21:15:01

标签: delphi internet-explorer-9 delphi-7

我正在使用我的前任编写的Delphi 7程序,并且他一直在做的事情之一就是重置DateSeparator值和ShortDateFormat值。 (分隔符为' /',格式为' YYYY-MM-DD'。)有问题的程序正在尝试针对数据库检查一组记录,根据需要更新它们,然后将它们写入手持式条形码扫描仪的文件中。此外,可以选择一组记录并将其显示为报告,方法是将ShellExec字符串中的键值传递给实际运行报告的php页面。

通常,此程序正常运行,没有任何问题。但是,在某些机器上(似乎特定于运行IE9的Win7盒子),如果首先运行报告(从ShellExec调用中打开IE),那么试图验证记录的代码部分最终会被日期搞砸up - 而不是像Delphi ShortDateFormat调用指定的那样显示为YYYY-MM-DD,或者作为Win7默认格式的M / d / yyyy,它们会在输出文件中显示为类似于' ddyyyymm&#39 ;. (代码在写入文件之前剥离了分隔符。预计缺少分隔符。)

鉴于出现此问题的奇怪条件,我怀疑有关打开IE9的内容明确覆盖程序尝试重置日期格式。以前有没有人听说过这样的事情?如果是这样,我有什么选择来解决这个问题?我没有权力在我们的客户使用该程序的每台机器上要求IE升级,而且我不确定无论如何都会真正解决问题。我有一半害怕我不得不重置格式作为程序中每个可能的功能和程序的初始部分,并且我非常希望我能做的事情能够赢得&#39这是非常耗时且容易出错的。

1 个答案:

答案 0 :(得分:2)

尝试添加

Application . UpdateFormatSettings := false;

 Application.Initialize;
在DPR文件中

操作系统会不时向所有应用程序发出WM_WININICHANGE消息,表示某些全局参数(例如用户的区域设置)已更改。有几件事可以触发这一点,通常它是有道理的,但有时它可能是一个谜。当Delphi应用程序收到此消息时,它将重新初始化格式设置。这通常是件好事。想象一下,你有一个时钟应用程序,它使用DateTimeToStr(Now)每秒显示日期和时间。用户进入Windows区域设置并更改其日期格式。 Windows发出WM_WININICHANGE消息,您的程序设置会自动更新。下次更新时钟显示时,它将使用新的正确设置。

但是,如果您使用特定于应用程序的值覆盖FormatSettings,这可能是一个大问题。突然之间,您根据需要精确设置的设置被丢弃并替换为默认设置。

您可以通过将UpdateFormatSettings设置为false来防止这种情况。

您的应用程序取决于FormatSettings正如您设置的那样。一切通常都很完美。我的假设是在那些触发WM_WININICHANGE消息的机器上发生了某些事情。