产生问题的环境:
1)Unit1 中有类 A 继承于DBGrid,包含一个TADOQuery。
2)窗体Form2 调用 Unit1 中类A,建立多个实例,
窗体Form2 包含一个变量(TStringList),每建一个A的实例,就使用TStringList的AddObject方法把实例添加到列表中。
3)类A中实现TADOQuery的方法QueryAfterScroll,遍历窗体Form2 中的实例A的列表。
现在出现内容耦合,因为TADOQuery的方法QueryAfterScroll调用了窗体Form2 中的实例A的列表。问题: 请问怎样把耦合去掉?我自己想把TStringList 传入到类A中但是不知道怎么实现。 请大家帮帮忙,谢谢!
1)Unit1 中有类 A 继承于DBGrid,包含一个TADOQuery。
2)窗体Form2 调用 Unit1 中类A,建立多个实例,
窗体Form2 包含一个变量(TStringList),每建一个A的实例,就使用TStringList的AddObject方法把实例添加到列表中。
3)类A中实现TADOQuery的方法QueryAfterScroll,遍历窗体Form2 中的实例A的列表。
现在出现内容耦合,因为TADOQuery的方法QueryAfterScroll调用了窗体Form2 中的实例A的列表。问题: 请问怎样把耦合去掉?我自己想把TStringList 传入到类A中但是不知道怎么实现。 请大家帮帮忙,谢谢!
解决方案 »
- 按键精灵跟简单游的脚本可以实现==比较游戏的血条==来模拟按键, 请问Delphi 怎么实现比较
- 有那位大侠知道 在写WINDOWS2000日志文件的时候 所需要的资源文件格式
- 辞职了要搞c++开发了和兄弟们道个别!
- 如果知道远端论坛数据库的用户名,密码,我可不可以写程序发帖子,读帖子,不通过IE浏览论坛??????????
- 一个枚举格式的问题!
- 请问怎样取得硬盘的序列号
- 由于我不小心忘了,日期-日期=天数,我需要天数为整型,请问如何解决
- 时间的比较
- 请问那有BDE的升级包下载。
- 有关Delphi4下生成的dcu文件在Delphi5下安装时的问题?
- api怎么脱离第三方运行?
- DBGRIDEH如何添加自定义的函数
TA=class
...
procedure SetAfterScroll(const Value: TDataSetNotifyEvent);
function GetAfterScroll: TDataSetNotifyEvent;
public
property AfterScroll : TDataSetNotifyEvent read GetAfterScroll write SetAfterScroll;.....
function TA.GetAfterScroll: TDataSetNotifyEvent;
begin
Result := ADOQuery1.AfterScroll;
end;procedure TA.SetAfterScroll(const Value: TDataSetNotifyEvent);
begin
ADOQuery1.AfterScroll := value;
end;这样就可以再Form2中关联这个事件进行处理了。
谢谢 hawksoft 。
我想复用A类,想把Form2的Tstringlist 功能写到类中,或者把Form2的Tstringlist 传递到A类中。
没有思路。
谢谢 Corn1 。我一直在想观察者模式。以前没有用过,要好好看看。
按照观察者模式可以解决这个问题。hawksoft 给出的方法可以使程序更加的简单和优雅。
谢谢!
Tsubject = class
private
observers: TList;
public
procedure AddObserver(TObserver obj)
procedure RemoveObserver(TObserver obj);
procedure SomethingHappend;//在这个过程做处理,并通知观察者.
procedure NotifyObservers;//通知观察者
for i:=0 to observers.count-1 do
begin
TObserver(observers[i]).SubjectHasSomgthing(self,参数....)
end
end;Tobserver = class
public
procedure SubjectHasSomgthing(sender:Tsubject,参数....)
//在这个事件里进行观察到事情进行处理
end;为了扩展,可以把Tobserver做成接口,具体的实现由实现该接口的类进行.