我的情况,是应该定义一个属性,还是声明一个变量?(50)

  • 主题发起人 主题发起人 delhpi
  • 开始时间 开始时间
D

delhpi

Unregistered / Unconfirmed
GUEST, unregistred user!
涉及到2个FORM。一个是MainForm,上面有个StringGrid,通过一个按钮调用DataForm。另外一个是DataForm,需要读、写MainForm里的StringGrid。一般的情况下,2个form相互引用,然后各自直接访问需要的对象。这种方式似乎有点耦合太紧。我现在想修改为单向引用,只有MainForm引用DataForm。方式1,是在DataForm里Public处定义一个变量 public { Public declarations } Sgtoimport:TStringGrid;MainForm里这样调用 formimport.SgToImport:=StringGrid1;//这里是直接使用变量 FormImport.Show;方法2,是 DataForm里定义一个属性private { Private declarations } FSgtoimport:TStringGrid; public { Public declarations } property SgToImport:TStringGrid read Fsgtoimport write Fsgtoimport;MainForm里这样调用 formimport.SgToImport:=StringGrid1;//这里其实是使用的属性 FormImport.Show;2种方式好像都能实现效果。不知道哪种方式好?或者更好的方法应该是什么?
 
方法2好,建议使用方式1的好处是写代码简单,但不建议使用。
 
我来写的话,会将MainForm.StringGrid的read/write操作弄成两个事件,然后,这两个事件指针传给其它单元,这样,不会因为MainForm.StringGrid的操作逻辑改变,引起所有用到StringGrid的代码全部更改。如:type TOnGridReadData = function(Row, Col: Integer): string of object; TOnGridWriteData = procedure(Row, Col: Integer; const Value: string) of object;function TMainForm.OnGridRead(Row, Col: Integer): string;{ Result := ...}procedure MainForm.OnGridWrite(Row, Col: Integer; const Value: string);{ StringGrid...}DataForm处定义两个事件指针:FOnGridRead, FOnGridWriteDataForm.OnGridRead := MainForm.OnGridRead;DataForm.OnGridWrite := MainForm.OnGridWrite;在DataForm需要针对StringGrid操作时,就调用FOnGridRead, FOnGridWrite以后需要,就直接更改MainForm里面的代码。也就是说涉及到MainForm的逻辑,代码尽量在MainForm中处理,不要这一块那一块的
 
第一种好,今后你如果扩充因为涉及到多个Form时,你就知道好处了!
 
errorcode已给出最佳答案了
 
无非是将StringGrid传递出去,二种办法都可以用,但思维方法复杂化了,再简单清晰点的话,都不需要考虑上述林林总总的问题,只是简单到在 DataForm 里定义一个 Show 的函数就行:procedure ShowDataForm(Grid: TStringGrid);begin // same code ...end;这样写的意义是:1)维护代码时,即便不是你自己,也不需要再去看一遍你的 DataForm 代码是怎么写的,即:一个函数已经封装了先赋值后运行的执行逻辑。2)函数定义下来就是给人用的,定义了这样一个函数,写注释的时候只要写:“要调用本单元(DataForm),只要调用函数 ShowDataForm 并传入参数即可”,非常直观。3)难道我的写法不能做到最小耦合吗?答案是否定的,这样的方法耦合最小,这就是接口思想:单元间不需要互相耦合,要的只是输入和输出。
 
谢谢各位
 
后退
顶部