程序的主窗体Form1,Form1上有一个ADOQuery1控件
另有一个DataModule1,DataModule1上有一个ADOConnection1,从DataModule1继承一个窗体DataModule2
设计时,将Form1上的ADOQuery1的Connection属性设置成DataModule1.ADOConnection1如果工程中的程序如下
begin
  Application.Initialize;
  Application.CreateForm(TDataModule2, DataModule2);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
这里没有创建DataModule1,运行时,ADOQuery1.Connection 指向的是DataModule2.ADOConnection1如果程序改为
begin
  Application.Initialize;
  Application.CreateForm(TDataModule2, DataModule2);
  Application.CreateForm(TDataModule1, DataModule1);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
这里创建了DataModule1,运行时,ADOQuery1.Connection 指向的还是DataModule2.ADOConnection1如果程序改为
begin
  Application.Initialize;
  Application.CreateForm(TDataModule1, DataModule1);
  Application.CreateForm(TDataModule2, DataModule2);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
运行时,ADOQuery1.Connection 指向的才是DataModule1.ADOConnection1我可以理解为运行时其实指向的是TDataModule1的ADOConnection1,但是这个是个什么机制,弄不明白,望高手指教

解决方案 »

  1.   

    第一段程序编译会通过吗?DataModule1是TDataModule1的实例,begin
      Application.Initialize;
      Application.CreateForm(TDataModule2, DataModule2);
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.并没有创建TDataModule2的实例,能行?
    发个源码给我看看
    [email protected]没有创建Tdatamoduale的对象,
      

  2.   

    对不起,纠正一下,TDataModule2只是一个UNIT,没有窗口,弄错了,自己写的一个类
    从TDataModule1继承,上面所有的DataModule2的创建都换成
    DataModule2 := TDataModule2.Create(Application);
    代码我给你发过去了
      

  3.   

    编译是可以通过
    新问题又来了,如果是有窗口的话,就是按照上面的写法,为什么ADOQuery1的Connection又会是空的呢?我越来越模糊了
      

  4.   

    我觉得你最好先研究一下面向对象编程技术,然后了解一下DelphiForm继承机制!
      

  5.   

    声明DataModule2的类型为TDataModule1一、Adoquery1.Connection:=DataModule1.ADOConnection1;二、TDataModule2 = class(TDataModule1)三、DataModule2 := TDataModule2.Create(Application);看明白了吧?
      

  6.   

    最好在程序运行起来了再去为connectiostring/connection赋值。
    赋值了再编译,不好!
      

  7.   

    声明DataModule2的类型为TDataModule1一、Adoquery1.Connection:=DataModule1.ADOConnection1;二、TDataModule2 = class(TDataModule1)三、DataModule2 := TDataModule2.Create(Application);看明白了吧?
    这些我明白
    但是实例毕竟是DATAMODULE2,属性中设置的是DataModule1中的连接,可以理解他在编译时是和先产生的TDataMoudle1连接,但是程序中明明产生了DataModule1的实例,他还是连在DataModule2上,用代码写没有问题这个我也知道,我的问题是为什么我在设计时指定的是DataModule1会有这种效果,还有,当DataModule2有窗口,不是只写类的时候他的连接又正确了
      

  8.   

    大家来这里看看吧
    阳春三月,和Borland专家--刘艺相约上海!
    http://expert.csdn.net/Expert/topic/2749/2749208.xml?temp=.2271692
      

  9.   

    什么叫“DataModule2有窗口”啊?DataModule是不可视的组件呀
      

  10.   

    最好在程序运行起来了再去为connectiostring/connection赋值
    同意这种说法!