十分怪异的问题:dbgrid在线程中显示结果错乱?
这个程序在我的电脑上和其它几台电脑上没有任何问题(全是XP系统),但在另外两台新电脑当中(电脑公司给安装的GHOST XP系统)就出现了问题。可是我在我这台电脑中编译到运行没发现任何问题,没办法,我在那两台新电脑中安装了CB6,并在CB6当中运行程序,终于抓到了问题:
点击“查询”按钮后调用线程,这个线程是用来查询数据库并在DBGRID控件中显示结果的,源代码没有任何问题。但只要把DBGRID控件连接到DataSource1就会出现错误提示,见下图:
点“确定”后继续运行,发现DBGRID窗口里面显示的长或宽度是错乱的,见下图:
在线程中,代码是这样的:
Form1->Label5->Caption="正在进行查询,请稍候!";
serverid="Provider=SQLOLEDB.1;Password=XXX;Persist Security Info=True;User ID=XXX;Initial Catalog=ABCD;Data Source=192.168.1.22";
searchclass="ydnq_nx";
Form1->DBGrid1->DataSource=Form1->DataSource1; //问题出在这里,如果不做指向就不会出现上面所说的错误,当然也不会显示出来查询结果了。我也试过直接修改DBGrid1的DataSource属性为DataSource1,问题依旧,总之就是不能正常显示。
Form1->ado1->Close();
Form1->ado1->ConnectionString=serverid;
Form1->ado1->SQL->Clear();
Form1->ado1->SQL->Add("select phone as 手机号,servicename as 项目,flag as 定购状态,startdate as 定制时间,qxdate as 取消时间 from ["+searchclass+"] where phone='"+phone+"' order by startdate");
Form1->ado1->Open();
Form1->Label5->Caption="查询完毕,请查看!";
=====================
这个问题的奇怪之处是同样的程序,在其它电脑中运行都没有问题,只有在这两新安装的电脑中才会有这样的错误,不知道是怎么回事。
个人分析可能是新系统优化做的过多,导致缺少DLL文件或运行库文件?不知道是不是这样。 到底怎样才能解决呢?
急待高手!!
[解决办法]
很明显是在线程里面操作Vcl控件造成得。VCL在多线程得时候操作要这样
// Synchronize(&UpdateCaption);//// where UpdateCaption could look like:// void __fastcall AddFileToEncryptFileth::UpdateCaption()// {// Form1->Caption = "Updated in a thread";// }