在Delphi中使用框架进行GUI信息隐藏

时间:2009-07-23 11:26:46

标签: delphi user-interface vcl information-hiding

在过去的3年里,我一直在学习德尔福,业余爱好/职业水平。我很高兴地说,我现在已经发展到可以用恐怖和尴尬的方式回顾我的早期代码。所以我现在正在浏览一些早期的应用程序并重写/重构它们。

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

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

2 个答案:

答案 0 :(得分:3)

听起来你的UI层中仍然有很多逻辑。表单/面板不应具有那么多的Value属性(可能对话框除外)。

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

说了这么多,Frames可以成为组织GUI的好方法。和所有事情一样,不要过度使用。

答案 1 :(得分:0)

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

在UI中隐藏了几个重点和信息:

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

    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处理第一个列表中显示的位。这样调用代码永远不会接收表单指针,也不能触及包装类没有专门提供的任何位。