Delphi中使用Frames进行GUI信息隐藏
-
19-09-2019 - |
题
过去 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 中的重构和信息隐藏有以下几点:
- 正如所讨论的 在 StackOverflow 上的另一个问题中 在框架中使用事件处理程序时需要小心。
- 框架仍然具有许多已发布的属性,并且没有真正解决表单能够不恰当地篡改彼此的位的问题。即使您不这样做,如果代码允许,最终有人会编写代码来篡改不应该篡改的地方。我总是删除全局表单变量 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 处理第一个清单中显示的位。这样,调用代码永远不会接收表单指针,也无法触及包装类未专门提供的任何位。