Introduction to platform-sensitive development/zh CN

From Lazarus wiki
Jump to navigationJump to search

English (en) 中文(中国大陆) (zh_CN)

简介平台敏感型开发

Mac Leopard 中平台无关与平台依赖的应用对比。图示的所有应用都是平台无关的,但只有右半部分的程序是平台依赖的。请注意,左半部分平台不敏感的 X Window 程序外观令人陌生。这种非常规的操作方式和含糊的界面元素(如双菜单栏),往往会给用户造成困惑。

平台敏感型开发跨平台编程指南的后继。通过实现平台特有的功能,遵循平台特有的用户界面风格,可为应用程序移植锦上添花。

有赖于 Lazarus 和 Free Pascal 的“一次编写 - 随处编译”原则,非常容易开发一个能在多平台开箱即用的程序。但要让已完工的应用程序符合对应的 GUI 风格规范(甚至会是应用商店的强制要求),需要进行额外的操作。

平台敏感型开发不仅是要遵循用户界面风格规范,还要解决内存管理、文件处理和进程间通信等各种问题。

本文给出了平台敏感型开发的基本信息和一些技巧。

序言

Stock-dialog-warning.svg

This article applies to platform-sensitive development only.

See also: Multiplatform Programming Guide

大多数与平台相关的代码调整都是由 LCLFCLRTL 和相应的组件自动进行的。通常只需进行少量修改即可完成应用程序的创建。利用编译器指令进行条件编译,对于保持代码的可移植性很有用。

以下是条件编译技术的示例。过程 AdaptMenus 会根据目标平台对显示的菜单栏进行调整。这很有必要,因为菜单“About”和“Preferences”在 macOS 中的位置和 Windows、Linux、FreeBSD 不同。此外,macOS 中的菜单快捷键由 Command 键触发(LCL 称为 Meta 键),而在大多数其他操作系统中则由 Control 键触发。

这里的主菜单包含一些平台特有的菜单项, WinAboutItem(打开一个消息对话框) 和WinPreferencesItem (用于设置程序参数)用于非 macOS 操作系统。另一方面还包含一个适用于 macOS 的 Apple 菜单。根据目标平台的不同,这里的代码会隐藏不需要的菜单项(及相应的菜单分隔线),并显示平台用户期望看到的菜单项。

uses
  LCLType;

procedure AdaptMenus;
{ Adapts Menus and Shortcuts to the interface style guidelines
  of the respective operating system }
var
  modifierKey: TShiftState;
begin
  {$IFDEF Darwin}
  MainForm.WinAboutItem.Visible := False;
  MainForm.Divider_5_1.Visible := False;
  MainForm.Divider_2_2.Visible := False;
  MainForm.WinPreferencesItem.Visible := False;
  MainForm.AppleMenu.Visible := True;
  {$ELSE}
  MainForm.WinAboutItem.Visible := True;
  MainForm.Divider_5_1.Visible := True;
  MainForm.Divider_2_2.Visible := True;
  MainForm.WinPreferencesItem.Visible := True;
  MainForm.AppleMenu.Visible := False;
  {$ENDIF}
  MainForm.NewMenuItem.ShortCut := ShortCut(VK_N, ssModifier); //ssModifier equals ssMeta on Mac, ssCtrl on other platforms
  MainForm.OpenMenuItem.ShortCut := ShortCut(VK_O, ssModifier);
  MainForm.CloseMenuItem.ShortCut := ShortCut(VK_W, ssModifier);
  MainForm.SaveItem.ShortCut := ShortCut(VK_S, ssModifier);
  MainForm.PrintItem.ShortCut := ShortCut(VK_P, ssModifier);
  MainForm.QuitMenuItem.ShortCut := ShortCut(VK_Q, ssModifier);
  MainForm.UndoMenuItem.ShortCut := ShortCut(VK_Z, ssModifier);
  MainForm.CutMenuItem.ShortCut := ShortCut(VK_X, ssModifier);
  MainForm.CopyMenuItem.ShortCut := ShortCut(VK_C, ssModifier);
  MainForm.PasteMenuItem.ShortCut := ShortCut(VK_V, ssModifier);
  MainForm.SelectAllMenuItem.ShortCut := ShortCut(VK_A, ssModifier);
end;

旧版 Lazarus(1.0 之前)不支持 ssModifier。以下代码虽比上述示例复杂,但可以兼容 Lazarus 0.9.x:

uses
  LCLType;

procedure AdaptMenus;
{ Adapts Menus and Shortcuts to the interface style guidelines
  of the respective operating system }
var
  modifierKey: TShiftState;
begin
  {$IFDEF LCLcarbon}
  modifierKey := [ssMeta];
  MainForm.WinAboutItem.Visible := False;
  MainForm.Divider_5_1.Visible := False;
  MainForm.Divider_2_2.Visible := False;
  MainForm.WinPreferencesItem.Visible := False;
  MainForm.AppleMenu.Visible := True;
  {$ELSE}
  modifierKey := [ssCtrl];
  MainForm.WinAboutItem.Visible := True;
  MainForm.Divider_5_1.Visible := True;
  MainForm.Divider_2_2.Visible := True;
  MainForm.WinPreferencesItem.Visible := True;
  MainForm.AppleMenu.Visible := False;
  {$ENDIF}
  MainForm.NewMenuItem.ShortCut := ShortCut(VK_N, modifierKey);
  MainForm.OpenMenuItem.ShortCut := ShortCut(VK_O, modifierKey);
  MainForm.CloseMenuItem.ShortCut := ShortCut(VK_W, modifierKey);
  MainForm.SaveItem.ShortCut := ShortCut(VK_S, modifierKey);
  MainForm.PrintItem.ShortCut := ShortCut(VK_P, modifierKey);
  MainForm.QuitMenuItem.ShortCut := ShortCut(VK_Q, modifierKey);
  MainForm.UndoMenuItem.ShortCut := ShortCut(VK_Z, modifierKey);
  MainForm.CutMenuItem.ShortCut := ShortCut(VK_X, modifierKey);
  MainForm.CopyMenuItem.ShortCut := ShortCut(VK_C, modifierKey);
  MainForm.PasteMenuItem.ShortCut := ShortCut(VK_V, modifierKey);
  MainForm.SelectAllMenuItem.ShortCut := ShortCut(VK_A, modifierKey);
end;
Light bulb  Note: 若要查看组件是否支持某 LCL 功能,可以用限制浏览器(视图/限制浏览菜单)

各平台相关提示

Android

Android 是非经典的 Linux 版本,因此 Linux 发行版的很多注意事项通常都不适用。此外,Android 开发还面临以下挑战:软件环境碎片化分布于大量不同版本的系统中,并且支持的设备存在相当大的硬件差异。

参阅

外部链接

FreeBSD

FreeBSD 操作系统适用于多种平台,专注于功能、速度和稳定性。FreeBSD 源自 BSD,一种加州大学伯克利分校开发的 UNIX® 版本。FreeBSD 由一个大型社区开发和维护,应用于现代服务器、台式机和嵌入式平台。其大型社区已持续开发了 30 多年。它具备先进的网络、安全性和存储功能,很多最繁忙的网站、最流行的嵌入式网络和存储设备都首选采用。

参阅

  • FreeBSD 门户 完整罗列了 FreeBSD 开发技术、编程提示、程序创建技巧的链接。

外部链接

iOS

iOS 是 macOS 针对移动设备的简化版。Lazarus 环境的最新功能有助于用 iOS 版 Free Pascal 开发应用程序。iOS 开发在某些方面不同于其他平台,不过幸亏有 iOS Designer 可用于 GUI 的图形化设计。为了能够向 Apple 的 App Store 提交应用,必须实现 iOS 人机交互指南。

参阅

外部链接

Linux

Linux 的标准化程度要低于其他操作系统。一是因为发行版的异构性,二是因为 Linux 没有“标准”的桌面环境。GNOME、KDE、LXDE 和其他桌面环境对 GUI 设计的建议各不相同。

参阅

外部链接

macOS

在所有操作系统中,Mac 系统的 GUI 历史最为厚重。它的历史可以追溯到 1984 年的经典 Mac OS 及其不太成功的前身 Lisa OS (1983)、Xerox Star (1981)和 Xerox Alto (1973)。很多人认为 Mac 的 GUI 提供的用户体验最好。但这也意味着更复杂的开发过程。

与其他操作系统相比,有很多地方在 Mac 计算机上采用不同的实现方式。包括菜单栏的设计和位置、某些标准菜单的位置、按钮和图标的样式。此外,Mac 计算机的一些非 GUI 功能也与其他系统不一样,如程序的架构、首选项文件的位置和进程间通信方式。

Carbon(仅限 32 位,且自 2019 年底的 macOS 10.15 Catalina 版本开始已被 Apple 移除了)和 Cocoa(仅限 64 位)组件自动解决了许多问题,因此很容易开发一个简单的 macOS 程序,通常不需要对源代码作任何改动。但若要开发 Mac 成品应用,仍需要进行一些微调。详见 Apple 特有的 UI 元素

参阅

  • Mac 门户 整合了开发技术、编程提示和 macOS 应用创建技巧的链接。

外部链接

Windows

Windows 是 Lazarus 支持的最古老平台之一。因此,IDE 生成的大多数应用程序都自动满足可用性要求。但如今 Windows 版本已十分众多,涵盖了移动操作系统(如 Windows CE 或 Windows mobile)、桌面环境(如 Windows 2000、Windows 7 和 Windows 10)以及服务器平台。因此,建议针对特殊环境及其 GUI 规则进行微调。

参阅

外部链接

参阅