2

在过去的 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 信息,是否有更好/更简单的方法来实现相同的效果?

血红蛋白

4

2 回答 2

3

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

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

说了这么多,框架是组织 GUI 的好方法。和所有东西一样,不要过度使用。

于 2009-07-23T11:33:09.003 回答
0

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

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

  1. 正如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 处理第一个清单中显示的位。这样,调用代码永远不会收到表单指针,也无法触及包装类未专门提供的任何位。

于 2009-07-23T20:35:55.370 回答