如何取得在线程中动态建立的控件的名称?(100分)

  • 主题发起人 主题发起人 mayi
  • 开始时间 开始时间
M

mayi

Unregistered / Unconfirmed
GUEST, unregistred user!
我在线程中动态建立了几个Label,用于显示一些信息,但我用showmessage(Label1.caption)时,程序
出错了,不知我错在什么地方?请指教!
 
动态建立的Label在showmessage所在的程序段中有效么?
也就是说,如果你的Label是在线程中声明的,而在另一个函数中ShowMessage,
那样就会出错,除非你将它们定义成全局变量
 
to cheka:
Label是在线程运行时有效,但在showmessage过程中无效,出错!
定义成全局变量就可以了吗?但我如何得到这个Label呢?比如说,我在线程里动态建立了5
个Label,等线程运行结束后,我想显示这5个Label的结果,可以直接用showmessage(label1.caption)
吗?请用例子告之!
 
你动态建立的Label的名字就不是Label1,2,3,4,5了,那是在设计窗体的时候,
form designer自动加上去的。可以有很多的办法的,可以用一个数组记录下来啊。
 
你的线程是不是设成了FreeOnTerminate := True?那么当线程释放时,
所有在线程类中声明的Label都已经释放了,当然就不能再去访问了。
你可以在线程中ShowMessage(Label1.Caption)。或者采用一个全局的TThreadList链表
来存放线程执行中产生的信息,最后将之显示就可以了。
 
可以先申请全局的变量S:TSTRINGLIST,并在窗口的CREATE事件中初始化
S:=TSTRINGLIST.CREATE,这样就可以保存在线程生成的Label1.Caption信息,
S.ADD(Label1.Caption).
 
Delphi不允许线程访问任何窗口中的可视控件,因此必须通过程序主线程访问。
虽说vcl提供了简化多线程操作的类,但只是工作者线
程(worker threads)使用起来比较简单。如果线程要和界面打交道的话事情就变得麻烦
了,因为除了应用程序的主线程,任何线程不能访问任何可视的vcl部件。你不得不使用
synchronize方法等待主线程处理它的消息,然后在主线程中访问vcl部件
 
多人接受答案了。
 
后退
顶部