一个基本的问题,高手请进。(50分)

S

sunys

Unregistered / Unconfirmed
GUEST, unregistred user!
有2个窗体,FORM1,FORM2, FORM2继承FORM1,FORM1是父窗体。
FORM1中有个线程,调用的是FORM1本身的一个过程。我是这样写的
procedure TTimerThread.Execute;
begin
Priority := tpNormal;

freeonterminate:=true;
try
fORM1.ScanTask ;
except
end;
end;
SCANTASK过程里用到了一个CLIENTDATASET构件。
然后我有一个RPOJECT ,里面只有FORM2,运行程序,执行到线程的SCANTASK时,
然后出现CLIENTDATASET为NIL,内存访问错误。

 
线程里调用大部分VCL对象的方法都需要同步.
用Synchronize,查一下delphi的帮助.
 
xeen:我的线程里面(SACNTASK 过程)调用了COM+对象。应该不能用Synchronize 的。
 
>不同的project工程是在单独内存空间中运行的,它们之间的相互访问必须通过很复杂的技术
>在windows下为每一个程序都开辟一个4G的虚拟空间,他们之间是互相独立的,也就是说他们只能访问
>自己的东西,并且也认为整个系统中只有自己存在(尽管肯定不是这样!).这样做的好处就是避免
>不同应用程序中间不能互相干扰导致错误的产生.
我其实不太明白你的程序是怎样构造的,乱发言不要怪我
 
你那个ClientDataset控件是哪里定义的,怎么创建的.好好看看.
 
only you.你说的和我的问题是2码事情。
其实我的问题很简单,就比如说 form2继承FORM1,
在FORM1的ONCREATE事件里写了 showmessage(form1.name);
当程序执行FORM1时就会出错,因为FORM1没有被CREATE,本来写showmessage(Self.name);就可以了,
但是这个线程却让我只能写showmessage(form1.name);
 
ClientDataset 控件就是我放上去的,不是动态创建的,其实这个问题是出现在继承和线程的写法上。
却不知道如何写。
 
form2继承form1,那你也得把form1单元的dfm文件拷过来吧,我估计
就是这个原因.
 
不是这个原因,就是说父窗体里面不能写 SHOWMESSAGE(FORM1.NAME);
而我因为线程调用了这个父窗体里的过程,好象只能写 FOMR1。SCANTASK
 
可能为没弄懂你的意识,请问,为什么在过程定义时不定义个TForm 型参数呢?
定义了参数,可以用
procedure TTimerThread.Execute(FormX:Tform);
begin
Priority := tpNormal;

freeonterminate:=true;
try
Formx.ScanTask ;
except
end;
end;
 
procedure TTimerThread.Execute(FormX:Tform);
这个是线程的过程,不能加参数的。
 
多人接受答案了。
 
顶部