【发布时间】:2011-01-13 03:13:24
【问题描述】:
我是 Stack Overflow 的新手,但我发现自己在这个网站上寻找一些最好的编程解决方案。所以我有一个问题要问。
我正在用 Delphi 编写一个程序,它是一个用于本地商业客户的 TUI 菜单驱动程序。他们要求我保持与旧程序中的用户界面相同(用 BASIC 为 MS-DOS 编写,日期为 1982 年),因此它是所有菜单驱动的,全局数据存储在文件中并由程序重新加载。每个子菜单本身就是一个由活动菜单运行的程序(也是一个程序)。
我编写了自己的 TUI 框架和 UI 管理器来显示菜单和子菜单。 UI 管理器包含一个名为“Draw”的覆盖方法来显示菜单和另一个名为“OnEvent”的覆盖方法,它处理 UI 中的键盘事件。 我的第一个问题是,您认为这是制作包含子菜单的菜单驱动程序的合适方法吗?这是如何工作的一个示例:
type
TMenu1 = class(TExtendedUIManager)
private
procedure OnEvent (c: Char); override;
end;
type
TSubMenu1 = class(TExtendedUIManager)
end;
procedure TMenu1.OnEvent (c: Char);
var
Next: TExtendedUIManager;
begin
if c = '2' then begin
Next := TSubMenu1.Create;
Self.Start(Next);
Next.Free;
end;
end;
我的另一个问题是在菜单之间共享数据的适当方式是什么?例如,如果我希望我的 TSubMenu1 类在调用方法时返回一个字符串,我将如何实现它可访问其他不与之交互的子菜单? (对不起,如果问题含糊不清)。我想到了单例模式,但我也想过让 UI 管理器存储对某个对象的引用以进行数据存储,并且每次运行新的子菜单时,将引用传递给新的子菜单(UI经理)。难题在于找出哪一个效果最好。或者即使我的菜单驱动框架很不错。
欢迎提出意见并感谢任何建议。感谢您的时间和帮助!
--托德
【问题讨论】:
-
您能解释一下为什么您需要编写自己的框架和 UI 管理器,而不仅仅是使用标准的 Delphi 组件吗?什么是“TUI”?你是说图形用户界面吗??
-
TUI == 文本用户界面。如果是我,我真的很想使用 ncurses 之类的东西来使 TUI 实现可以接受,但我认为 Delphi 暗示了 Windows 环境——ncurses 可能不太适合。
-
是的,很遗憾我必须使用 Windows,但我的 TUI 框架与 ncurses 的用途相似。我自己编写的,因为原始程序具有某些 UI 特征,例如所有包含空格句点的文本提示、每个 UI 多个提示等。Writeln 和 Readln 是不够的。
-
“我的另一个问题是......”通常意味着在 SO 上打开第二个问题
-
如果您正在重写应用程序,请给他们升级:您可以保持相同的菜单组织,但使应用程序成为真正的 GUI 应用程序。我绝对肯定没有充分的理由保留基于文本的界面。示例:在表单上放置 3 个大按钮,您将获得一个 3 选项菜单。用户可以单击按钮(因此它的行为与所有 Windows 应用程序一样),用户可以左右切换并按 Enter,您可以注册加速键,以便他们可以根据需要使用一键访问。