过去 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

有帮助吗?

解决方案

这听起来像您仍具有在UI层大量的逻辑。窗体/面板应该不会有那么大的价值属性(可能除了对话框)。

如果你想比MVC模式读了更多的结构。

话虽如此,框架可以是组织GUI的好方法。就像一切,不要滥用。

其他提示

我通常喜欢用框架来创建复杂的可重用位。在大多数情况下,我认为它们是构建屏幕的一种非常干净的方式。然而,正如所提到的 亨克·霍尔特曼 您的屏幕和框架应该只包含与 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 处理第一个清单中显示的位。这样,调用代码永远不会接收表单指针,也无法触及包装类未专门提供的任何位。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top