关于C++ builer xe2的几个问题
相信大家用CB很大的一个原因就是CB的VCL很好用,可以节省自己很多时间。至于其它功能。和VS肯本不是一个档次。前几天下了个CB的最新版本。破解的,版本号是 Embarcadero@ RAD Studio XE2 Version 16.0.4256.43595.首先发现的第一个问题。控件的caption不能使用中文,否则切换到另一个控件的时候。object inspector 的属性不能同步到第二个控件。
太家看上图,object inspector已经切到button2了。下面的内容还是button1的内容。
不过这也不算很大的问题,基本上可以忍受。这个可以直接在FORM的LOAD事件中,自己手动去写。也不算太麻烦。
今天拿CB XE2写了另一个小程序。用到一个函数.SetCapture。我们先说下这个函数的功能。这个函数大致就是调用了以后,可以这让这个函数指定的那个窗口在那个窗口里面响应不在这个窗口的客户区的事件,直到调用ReleaseCapture.简单说就是这个函数调用以后,比如你要在这个窗口外面点鼠标的话。在这个窗口函数中就可以处理了。我写的程序中的一个功能就是响应窗口客户区外鼠标单击获取鼠标点击位置的坐标的功能。编完以后测试,发现老是有时候行,有时候不行。别的我就不说了,我就说问题。
我把程序简化。放VS2010里面测试。
看图。写了个简化的测试函数,功能就是点下确定。再点下窗口外,弹出一个对话框。主要代码如下。
void CsetcapturetestDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
::SetCapture(m_hWnd);
}
void CsetcapturetestDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
MessageBox(L"Test");
::ReleaseCapture();
CDialogEx::OnLButtonUp(nFlags, point);
}
运行后每次都有对话框弹出来。
然后转CB6
代码如下。
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
::SetCapture(this->Handle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
ShowMessage("test");
::ReleaseCapture();
}
//---------------------------------------------------------------------------
点那个Button1.然后再点窗口外,每次也有提示框弹出来。
再转CBXE2
图我不截了。和CB6的一样。代码也一样。测试以后问题就来了。有时候有窗口弹出来,有时候没有。后来我用GetCapture这个函数放到MouseUp函数中取他的窗口。发现窗口的返回值有时是0。也就是说SetCatpure以后,不知道在什么时候把这个窗口给释放掉了。这个BUG就很烦了。比上面那个要严重很多。这个会导致编写过程中很多的不确定性。
总结:
1,不知道出现这个问题的原因是不是因为我用的是破解版造成的。
2,如果希望用VCL。还是用d7或CB6吧。
3,XE2的BUG还非常多。就我发现的还不止这两个。不过就足以让我放弃这个工具了。可能以后的新版本还会用来试试。但是就目前这个版本,绝对是浪费时间。