八神的技巧集之一 Form的关联引用技巧(9分)

  • 主题发起人 主题发起人 bsense
  • 开始时间 开始时间
B

bsense

Unregistered / Unconfirmed
GUEST, unregistred user!
现在delphibbs 的人气太差了,我打算有空就上来写一些自己看到的,学习别人的技巧集资料,希望大家喜欢.
我们经常需要做Aform 引用Bform的工作,特别是Aform做为列表显示,比如显示一个员工的资料,用Bform 是一个showmodal 的模式,进行新建,查看,修改具体的资料,可以使用
//保存Bform资料到对象变量
if Bform.showmoal = mrOk then

begin
with bformdo
begin
FId := Edt_Id.text;
//在这里取值,进行处理,
.....
end;
end;
//之后在aform 里面做检查,保存
if trim(FId) = '' then
...
//将对象资料显示到bform
with bformdo
begin
edt_id.text := Fid;
edt_name.text := Fname;
...
showmodal;
end;

也就是说Bform 只是一个显示的框架,具体内容存取,都在Aform里面实现.
扩展之, 可以将Bform 做成一个 frame ,可以在多处地方使用 ,名字 BFrame ,在Aform 里面放一个
control 是 Frame_B 使用时
with frame_bdo
begin
Fid := edt_id.text;
end;
 
这样也没减少工作量嘛。
 
这一般我是用于浏览数据界面(Aform)与数据录入界面(bform)相像吧!
 
没看出来技巧在哪里。
 
FId := Edt_Id.text;
//在这里取值,进行处理,
edt_id.text := Fid;
这种所谓技巧建议大家都不要学习,这属于类之间的强耦合
这里问问楼主 如果你的bform类在不知情的情况下有人将Edt_Id的显示内容改为显示user的工号你怎么办?
这里编译是不会错的 但是你的业务逻辑就成浆糊了
所以正确的做法是bform类提供一个传值的方法让自己获得外部赋值或让外部或取自己的值
而非通过访问published变量获取值
 
ball_cao,你的意思是不是外界不能访问bform的值,要通过bform提供的public函数来获得bform的值呢?谢谢!我是菜鸟哦,请指教!
 
不是不能访问 而是应该通过接口访问
建议楼主和问这个问题的兄弟看看《敏捷软件开发原则、模式与实践》一书
其中提到的代码的bad smell里有一条叫脆弱性,
这样的调用虽然方便但是面对改动时非常脆弱。
用个例子来说明一下正确的做法
如果我们两分别是两个不同的对象
我可以卖东西给你
但我不能直接掏你的钱包(相当于bform.edt_id.text)
应该是你有个方法,我告诉你应该给多少钱,你打开钱包,找出一定数量的money给我
这样你的钱包可以放在你自己的任何一个口袋 你甚至可以换钱包(edt_id不再被命名为edt_id)
而我还是能放心的收钱 不会因为你换了钱包或者换了钱包换了口袋我就收不到钱
 
很好啊,看来有很多人要扔砖头了~~~~~~~~~, 其实这个东东也是我看别人做的一个东西后发现挺有用的,楼上几位说的很好啊,的确是强耦合,如果将 a,b 两个form 的 b form 作为 私有的form ,不在别的地方使用, 这个 方法 是很有用的.
其他任何场合,不推荐使用这个tip.
 
多人接受答案了。
 
后退
顶部