【问题标题】:Use of Frames in Delphi for GUI information hiding在 Delphi 中使用框架来隐藏 GUI 信息
【发布时间】:2010-11-13 08:32:36
【问题描述】:

在过去的 3 年里,我一直在学习 Delphi,在兴趣/职业层面。我很高兴地说,我现在已经进步到可以带着恐惧和尴尬回顾我早期的代码了。所以我现在正在检查我的一些早期应用程序并重写/重构它们。

我试图摆脱的一个坏习惯是从另一个单元访问一个表单上的组件。为了加强这一点,我一直在尝试使用框架作为信息隐藏的方法。因此,我没有创建一个带有组件的表单,而是创建一个框架来保存所有表单组件,然后将框架放置在表单上,​​将框架声明移动到私有声明中,

type
  TMyForm = class(TForm)
   private
    MyFrame: TMyFrame;
    procedure SetTimeDate(const Value: TMyItem);
    function ReadTimeDate:TMyItem ;

然后在表单初始化部分注册框架

initialization 
begin
RegisterClasses([TMyFrame])

然后我在表单单元的公共部分声明我需要的属性,它可以访问框架及其组件。

  public
    property TimeDate: TOverlayItem  read ReadTimeDate  write SetTimeDate;

我还使用框架来合并经常重复的组件组。

这似乎可以达到我想要的目的(隐藏 Myframe 及其组件),但是其他人有这种方法的经验吗?

使用框架有什么缺点吗? 我真的从这样做中获得任何好处吗? 在框架内使用嵌套框架有什么问题吗? 在 Delphi 中使用框架是否有任何好的实践指南? 对于隐藏在 Delphi 中的 GUI 信息,是否有更好/更简单的方法来实现相同的效果?

HMcG

【问题讨论】:

  • RegisterClasses([TMyFrame]) 有什么用?
  • 因为我正在移动 MyFrame: TMyFrame;进入私有部分,如果我不注册 TMyframe,则会出现一个异常,指出“找不到 TMyFrame”。
  • 你应该专注于如何在你的设计中减少耦合,这样最终你是否使用框架都没有关系。我发现以下文章很有启发性:objectmentor.com/resources/articles/TheHumbleDialogBox.pdf

标签: delphi user-interface vcl information-hiding


【解决方案1】:

听起来您的 UI 层中仍有很多逻辑。表单/面板不应该有那么多值属性(对话框除外)。

如果您想要更多的结构而不是阅读 MVC 模式。

话虽如此,框架是组织 GUI 的好方法。和所有东西一样,不要过度使用。

【讨论】:

  • 您说得非常正确,因为我早期的应用程序在 UI 层中具有所有逻辑。所以我想要一种干净的方式来提升 UI 值/属性以供在主应用程序单元中使用。我的大多数应用程序都与硬件接口并且执行相当简单的操作,但是有很多特定的设置,所以不清楚如何摆脱具有大量 Value 属性的表单(对话框?)。我正在(慢慢地)阅读 Head First Design Patterns 这本书,所以我应该很快就会接触到 MVC。我所希望的是简单工具/应用程序的更简洁的 RAD 风格。
  • RAD 不会引导您做出更好的设计。考虑创建一个表单可以操作的设置对象。
  • 所以我创建了一个记录或类,GUI 层中的逻辑设置值,然后在主单元中访问该对象?这听起来确实比在 GUI 表单单元中拥有一堆属性更好的方法。谢谢。
  • 是的 - 它被称为业务规则层
【解决方案2】:

我通常喜欢使用框架来创建复杂的可重用位。在大多数情况下,我认为它们可以是一种非常干净的方式来构建屏幕。但是,正如Henk Holterman 所述,您的屏幕和框架应该只包含与 UI 功能相关的逻辑,并且尽可能不了解业务逻辑。

几个点重新框架和隐藏在 UI 中的信息:

  1. 正如in another question on StackOverflow 所讨论的,在框架中使用事件处理程序时需要小心。
  2. 框架仍然有许多已发布的属性,并没有真正解决表单能够不恰当地互相摆弄对方位的问题。即使你不这样做,如果代码允许的话,最终有人会编写代码来篡改不应该篡改的地方。我总是删除全局表单变量 Delphi 玷污了代码,并经常编写包装对象或实现提供对 UI 的受控访问的接口。

所以不要有这样的代码:

ClientForm := TClientViewForm.Create(Self);
try
  ClientForm.Client := MyClient;
  ClientForm.ShowModal;
finally
  ClientForm.Free;
end;

我通常会强迫人们写类似的东西:

ClientViewer := TClientViewer.Create(MyClient);
try
  ClientViewer.Show;
finally
  ClientViewer.Free;
end;

甚至

TClientViewer.ShowClient(MyClient);

并让类方法 ShowClient 处理第一个清单中显示的位。这样,调用代码永远不会收到表单指针,也无法触及包装类未专门提供的任何位。

【讨论】:

  • 感谢您指出 1) - 我还没有遇到过这种情况。第 2 点)是我对私有的 MyFrame 所做的 - 只有与 Frame 关联的 MyForm 单元才能访问 Frame 和框架组件。其他单位都看不到(私有)MyFrame。如果包装类方法具有相同的效果,这可能是实现相同效果的更简单的方法。 HMcG
猜你喜欢
  • 2011-06-17
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 2014-11-08
  • 2014-05-05
  • 2015-03-21
相关资源
最近更新 更多