2009-07-23 64 views
2

我一直在学习德尔福在过去3年,在业余爱好/职业水平。我很高兴地说,我现在已经进展到可以用恐惧和尴尬回顾我的早期代码。所以我现在正在浏览一些早期的应用程序并重写/重构它们。在Delphi中使用框架来进行GUI信息隐藏

我想摆脱的一个坏习惯是从另一个单元访问一个表单上的组件。为了强制执行此操作,我一直在尝试使用帧作为信息隐藏方法。因此,与其具有上组件的形式,我创建一个框架来容纳所有形式的组件,然后把该框架的形式,移动框架宣言到私人声明,

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

+0

你需要什么RegisterClasses([TMyFrame])? – 2009-07-23 13:59:54

+0

因为我在移动 MyFrame:TMyFrame; 进入专用部分,如果我没有注册TMyframe,则会发生异常,说明'TMyFrame找不到'。 – HMcG 2009-07-24 23:03:23

+0

您应该专注于如何减少设计中的耦合,以便最终无论您是否使用框架都无关紧要。我发现以下文章非常具有启发性:http://www.objectmentor.com/resources/articles/TheHumbleDialogBox.pdf – mghie 2009-07-26 14:24:24

回答

3

这听起来像你仍然在你的UI层大量的逻辑。表单/面板不应该有那么多的值属性(除了可能的对话框)。

如果您需要比在MVC模式中读取更多的结构。

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

0

我喜欢用于创建复杂的可重用位的框架。大多数情况下,我认为他们可以成为构建屏幕的一种非常干净的方式。但是,如Henk Holterman所述,您的屏幕和框架应仅包含与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处理第一个li中显示的位刺。这样,调用代码永远不会收到表单指针,也不会触及任何未由包装类专门提供的位。