开发人员应该如何应对如此多的GUI配置组合?

24
现今,任何一个体面的Windows桌面应用程序都必须在以下条件下表现出色并外观漂亮:
  1. 支持XP、Vista和Windows 7。
  2. 支持32位和64位系统。
  3. 支持启用和禁用主题。
  4. 支持启用和禁用Aero。
  5. 支持96、120以及自定义DPI设置。
  6. 支持单个或多个监视器(屏幕)。
  7. 每种操作系统都有其首选字体。
哦,我的天!身为一名低贱的Windows桌面应用程序开发者该怎么办呢?:(
我希望能开启一个讨论线程,探讨如何应对这个GUI困境。
首先,我使用Delphi 7。
a) Delphi 2010是否提供了新功能来解决此问题?
b) 我们应该选择某些市场上的组件套件,并依靠它们来解决所有这些问题吗?
c) 我们应该使用某个市场上的皮肤引擎吗?
d) 或许更HTML类型的GUI是走向成功的道路。我们可以用HTML制作相对复杂的GUI应用程序吗?(最好保持基于表单的)
e) 我们应该耐心对待每一种情况并逐个解决,而不是抱怨呢?
f) 最后,我们应该如何测试所有这些条件?

难题!Eclipse难道没有一个完美的可移植系统吗?(Windows,Linux,Mac,每种风味)我有点过于急躁了,但我似乎记得它有一个Java GUI。我对我的答案非常不确定,这就是为什么我把它作为评论的原因。 - Shawn
7个回答

6

目前我只想回答一个问题:

f) 使用虚拟机和(如果可能的话)自动化测试。我知道这是一项巨大的工作,但您永远不会后悔。


1

我也是一个卑微的Windows开发人员(D7),更感兴趣的是解决我的垂直市场应用程序用户的问题,而不是应对M$的问题。

我凑合着制作了一个组件来处理所有这些问题,还有一些其他问题。

据我所知,所有这些部分都是公共领域的,并且我已经尽可能地进行了归功。

以下是其中一些属性:

type TAppEnvironment = class(TComponent)

private

{ Private declarations }

// 环境管理

FEnvError              : TEnvError;          // environment error code
FEnvErrorMsg           : string;             // environment error message
FEnvLocalComputerName  : string;             // name of the client computer
FEnvCurrentUserName    : string;             // logged-on user
FEnvCurrentUserAdmin   : Boolean;            // is logged-on user Admin?
FEnvProduct            : string;             // windows edition
FEnvProductFlavour     : string;             // windows flavour (Home/Pro)
FEnvBuildNumber        : string;             // windows build number
FEnvServicePack        : string;             // windows service pack
FEnvThemeActive        : Boolean;            // Windows Theme active

// 使用产品和主题计算

FEnvTitleHeight        : integer;            // window title height
FEnvMenuHeight         : integer;            // window menu height
FEnvStatusHeight       : integer;            // window status bar height
FEnvBorderHeight       : integer;            // window border height
FEnvMainHeight         : integer;            // main menu window height
FEnvMainWidth          : integer;            // main menu window width
FEnvHeightAdjust       : integer;            // window height adjust
FEnvWidthAdjust        : integer;            // window width adjust
FEnvLocalPath          : string;             // App exe home folder
FEnvAppFolderName      : string;             // application name less extension
FEnvAppFileVersionStr  : string;             // like 6.0.0.4567
FEnvAppFileVersion     : TFileVersion;       // HiVersion, LoVersion, etc.

还有一些实用工具:

function EnvironmentReady : TEnvError;
function GetLocalComputerName : string;             // network needs this
function GetAppFolderName : string;
function BuildNumber : Integer;
procedure GetFileInfo(const AFileName: string; var RFileInfo: TFileInfo);
function GetLocalPath : string;
procedure getEnvWindowAdjust(bar : TStatusBar);
function setAppFileVersionStr : string;
function GetFileTime(const FileName: string): LongInt;
function initEnvironment : Boolean;
function exitEnvironment : Boolean;
function AlreadyRunning : Boolean;
function specialBuild : Boolean;

我有一个函数可以使用FEnvTitleHeight等来正确调整每个表单的大小。

所有愚蠢的用户路径也会根据Windows版本生成。

我不知道如何管理这个过程,但如果有人想要,我会把整个东西扔进去 - 让专家们来处理它。


哪里是一个好的地方?只发布文本 - 一段一段的还是全部发布也可以吗?我仍然需要从中删除一些安全代码并修复注释。也许今天晚些时候。 - Dave Wallace

1

很好的问题。

我已经开发我的应用程序超过10年了,从Delphi 2开始,然后是3和4,然后停在那里等了很多年升级到Delphi 2009,因为Unicode是必须的。当64位版本发布时,我会再次升级。

所以我经历了各种操作系统:Windows 98,Windows 2000,XP,Vista,现在是7。每个操作系统都会对你的用户界面产生一些影响,但Delphi在这方面做得相当不错。在某个时间点上,你必须决定不能再支持旧的操作系统了,并且从我的支持列表中最终剔除了Windows 98转向Unicode。

总的来说,我发现核心的Delphi提供了最好的用户界面支持。一些第三方包可能看起来提供了更多功能,但它们的不一致性问题比它们的好处更严重。尽量减少使用其他包。

我一直追求的一个UI目标是参加Windows Vista Logo计划,最近是Windows 7计划。Microsoft提供了很多信息,关于与您问题中的条件1到7相关的标准应该是什么。但是,让Delphi程序使用清单并通过Microsoft的审核最终对我来说不值得麻烦和成本,特别是因为我的不符合规定的程序在Vista和7上运行良好。
当我在64位Vista机器上开发时,保持我的程序运行并在Windows XP、Vista和7上保持UI外观相同意味着我需要使用Microsoft虚拟机。有人告诉我,我的程序也可以在Wine上运行,所以那是另一个测试机器。
现在回答你的问题:
a)Delphi 2010是否在这种情况下带来了新的东西?
是的。每个版本都会添加已添加到新操作系统的新VCL组件。例如,Windows 7的新UI已被添加。
b)我们应该选择售后市场组件套件,并依靠它们解决所有这些问题吗?c)我们应该选择售后市场换肤引擎吗?

就像我之前说的那样,我认为在Delphi本身中完成比在第三方软件包中完成要好。

d)也许更适合采用类似于HTML的GUI。我们是否可以使用HTML制作一个相对复杂的GUI应用程序,而不需要使用浏览器?(最好是基于表单)

我的应用程序类似于一个带有富文本的文字处理器。我看过一些基于HTML的编辑套件,但我不认为这是桌面应用程序的正确方向。如果你想要一个基于网络的应用程序,你最好使用.NET和Prism。

e)我们应该专注于编写这些场景的每一个部分,而不是抱怨吗?

首先升级到Delphi 2010。你会发现Delphi本身将为您处理大多数这些情况。

f)最后,我们如何测试所有这些条件?

自己做这个任务很繁重,即使使用虚拟机也是如此。你所要做的是开放测试版,并吸引尽可能多的用户在不同的环境下测试你的程序。然后,你将处理最重要的环境,以满足你的用户需求。

现在,如果你认为在不同的Windows环境中获得用户界面兼容性很困难,那么等待Embarcadero推出他们的适用于Mac的Delphi版本之后,你的当前UI问题将会变得微不足道。

1

对于在多分辨率 / DPI 大小上缩放你的窗体:我们使用DevExpress LayoutControl。它确保你窗体上的控件始终对齐,充分利用可用空间,无论如何。而且它还有更多功能。请查看他们的网站


0
  • Delphi 2010 带来了本地 Unicode 支持。
  • Delphi 2010 带来了 Windows Vista/Seven 控件。
  • 目前还没有 64 位 Delphi 编译器。
  • 使用 Delphi 7 处理 dpi 和监视器数量问题不应该有任何问题。

2
Delphi无法很好地处理不同的系统字体和DPI设置,它使用基于像素的布局并缺乏适当的布局管理器。它还在DFM文件中硬编码字体。 - mghie
1
这里可能有一个解决dpi问题的方案:http://www.gerixsoft.com/blog/delphi/large-fonts - Pierre-Jean Coudert

0
Delphi 让这件事情相对简单,但最终你需要在所有 Windows 版本上运行你的软件并目视检查一切是否正常。自动化测试很适合测试功能,但外观只能通过目视检查来确认。

这只是部分正确的:你只能通过观察来检查布局是否正确,但是一旦做出了这个决定,你可以使用自动化测试来检查当前布局是否仍然相同。如果不同,你可能会被通知并且仍然可以查看,但如果相同,你根本不需要查看它。 - Uwe Raabe

0

Delphi 2009 增加了主题支持功能(它是应用层级别的设置)。当您在 Vista/Windows 7 上运行 Delphi 2009 或更高版本的应用程序时,它会将消息框更改为任务对话框,因此您可以免费获得一些 UI 改进。

我们在移植到 Delphi 2009 和 Unicode 方面遇到了一些困难,但这是我们必须付出的“技术债务”。

希望这能有所帮助。


Delphi在Delphi 7中增加了Windows主题支持,随后的版本有所改进。 - Bruce McGee
是的,通过XPManifest可以实现,但后来被移除了,D2007有一个更好的系统。 - mmmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接