我最近开始将我的RAD Studio 2007项目升级到RAD Studio 2009.我注意到的一件事是看似简单的代码突然无法编译.
示例代码:
class CButtonPopupMenu
{
// Snip
public:
void Init( TButton* SrcButton )
{
SrcButton->OnClick = OnButtonClick;
}
private:
void __fastcall OnButtonClick( TObject* Sender )
{
// Do some button click stuff
}
};
// Snip
TButton button = new TButton( this );
TBitBtn bitBtn = new TBitBtn( this );
CButtonPopupMenu popupButton = new CButtonPopupMenu( button );
CButtonPopupMenu popupBitBtn = new CButtonPopupMenu( bitBtn );
Run Code Online (Sandbox Code Playgroud)
这一切都用于编译,但在2009年它失败了.看看2007年的继承链TBitBtn来源于TButton.因此,TButton该类共享任何按钮控件(即OnClick)上预期的事件.因此,我能够把我的TBitBtn班级视为一个TButton.
2007年继承链: …
有没有办法从窗体的OnCreate事件处理程序或C++ Builder构造函数中取消或中止表单创建?
基本上,我希望能够从OnCreate或构造函数中调用Close()并让它完全跳过显示表单.我有几种形式,作为初始化的一部分可能会确定它们根本不应该显示.(我意识到我可以拆分初始化的这一部分或者从调用表单或类似的内容中添加额外的检查,但是如果有办法从OnCreate或构造函数中干净地完成所有这些操作,那么这似乎是最简单的.)
编辑: 回应一些评论,一些不显示的逻辑是UI逻辑而不是业务逻辑; 表单可能会在显示之前显示确认,或者它可能使用公共对话框来获取表单的输入,然后在用户取消该对话框时中止.(其中一些是业务逻辑,需要重构,但通常很难找到时间来重构所有需要它的东西.)
我需要支持使用C++ Builder的6开发了一些软件代码,而目前的开发环境是CodeGear的C++ Builder的2009年.我想知道CodeGear的C++ Builder的2009年向后与C++ Builder的6兼容吗?
任何答案都表示赞赏.
提前致谢.
大卫.
如何在Borland C++ Builder 6中将XML用作简单的数据存储?
是否有内部课程,我可以使用?
感谢帮助
我仍在尝试实现我自己的LinkedList类版本,现在我遇到了为常量迭代器重载方法的问题.例如,当我尝试使用以下代码打印出列表时:
cout << "citer:" << endl;
for (UberList<int>::CIter it = ulist.begin(); it != ulist.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
Run Code Online (Sandbox Code Playgroud)
我有这些错误:
Error E2034 UberList2.cpp 532: Cannot convert 'UberList<int>::Iter' to 'UberList<int>::CIter' in function main()
Error E2094 UberList2.cpp 532: 'operator!=' not implemented in type 'UberList<int>::CIter' for arguments of type 'UberList<int>::Iter' in function main()
Run Code Online (Sandbox Code Playgroud)
所以据我所知,这意味着使用那些通常的end和begin迭代器方法.以下是我的类中声明这些方法的方法:
Iter begin();
Iter end();
CIter begin() const;
CIter end() const;
Run Code Online (Sandbox Code Playgroud)
和
template<class T>
typename UberList<T>::Iter UberList<T>::begin()
{
Iter it;
it.curr = head; …Run Code Online (Sandbox Code Playgroud) 我正在使用DBExpress使用C++ Builder(或Delphi 2007和XE2).我使用TSQLConnection连接两个数据库,一个用于firebird(我的本地硬盘),一个用于MySQL(在Web上).然后,我的问题是......我如何使用(make)SQL语句(或任何东西)将Firebird中的一个表复制到MySQL中的另一个表中?任何评论都会非常感激..非常感谢...
非常基本的C++ Builder问题.我想在运行时创建一个TButton.我原以为下面的代码会这样做,但我看到表单上没有按钮:
__fastcall TForm2::TForm2(TComponent* Owner): TForm(Owner)
{
TButton* b = new TButton(this);
b->Height = 100;
b->Width = 100;
b->Left = 0;
b->Top = 0;
b->Caption = "Testing";
b->Visible = true;
b->Enabled = true;
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
当我尝试包含<boost/thread.hpp>在C++ Builder中时,我收到警告.对于我所包含的每个单元,C++ Builder显示这两行:
thread_heap_alloc.hpp(59): W8128 Can't import a function being defined
thread_heap_alloc.hpp(69): W8128 Can't import a function being defined
Run Code Online (Sandbox Code Playgroud)
已经尝试了一些东西,但没有任何效果.
它编译正确,然而,它让我紧张.为什么要显示此消息?
这些线是:
#include <boost/config/abi_prefix.hpp>
namespace boost
{
namespace detail
{
inline BOOST_THREAD_DECL void* allocate_raw_heap_memory(unsigned size)
{
void* const eap_memory=detail::win32::HeapAlloc(detail::win32::GetProcessHeap(),0,size);
if(!heap_memory)
{
throw std::bad_alloc();
}
return heap_memory;
}
inline BOOST_THREAD_DECL void free_raw_heap_memory(void* heap_memory)
{
BOOST_VERIFY(detail::win32::HeapFree(detail::win32::GetProcessHeap(),0,heap_memory)!=0);
}
Run Code Online (Sandbox Code Playgroud)
其中59是{低于BOOST_THREAD_DECL69,看起来BOOST_THREAD_DECL没有正确定义或错误定义,试图通过Boost代码并不那么容易.
这是Boost 1.39.
当我将控件的TFont Name属性设置TRichEdit为"Courier"时,字体将更改为Courier.
Edit->Font->Name = "Courier";
Run Code Online (Sandbox Code Playgroud)
如果我想使用我不确定系统支持的字体(例如在较旧的操作系统上),该怎么办?据我所知,如果我将一个'未知'名称分配给TFont属性,实际字体不会改变,系统会处理它并坚持使用以前的字体,但我怎样才能以编程方式检查这个 ?
我想知道字体是否真的改变了(因为字体可用/已安装)?
或者我是否需要查询Screen-> Fonts以查明Name是否在列表中?
仅供参考:使用Borland C++ Builder(2009),但我确信与Delphi相关.
c++builder ×10
c++ ×5
delphi ×4
vcl ×3
boost ×1
components ×1
data-storage ×1
dbexpress ×1
forms ×1
iterator ×1
linked-list ×1
overloading ×1
runtime ×1
xml ×1