When closing an application on close button (FormClose handler is called), there is a dialog if user is sure that he wants to close the application. If the result of the dialog is mrCancel, then I try to set the ModalResult of a main form to mrNone like I do with other forms, but even though, the application still closes. What is the solution? Cheers.
我正在尝试使用C++模板'mixins'来创建一些具有共享附加功能的新VCL组件.例...
template <class T> class Mixin : public T
{
private:
typedef T inherited;
// ...additional methods
public:
Mixin(TComponent *owner) : inherited(owner)
{
// .. do stuff here
};
};
Run Code Online (Sandbox Code Playgroud)
像这样使用:
class MyLabel : public Mixin<TLabel>
{
....
}
class MyEdit : public Mixin<TEdit>
{
....
}
Run Code Online (Sandbox Code Playgroud)
现在,一切编译都很好,mixin的东西似乎工作 - 直到我尝试使用TStream-> WriteComponent将组件保存到流中,其中继承的属性(例如TLabel.Width/Height/etc.)不会被写入.即使使用如上所示的'null'mixin也是如此.
直接从TForm,TEdit等派生类时,我的代码工作正常 - 并且该类已正确地注册到流系统.
这是一个后续问题.是否可以在Codegear 2009中为命令行构建设置构建配置?
例如:
msbuild /property:BuildConfiguration=Release workspaceX.groupproj
Run Code Online (Sandbox Code Playgroud) 我需要用列显示一些分层数据.
所以一种混合了树视图的列表框.
我看一下标准组件和JCL/JVCL,但没什么相似之处.任何的想法 ?
编辑
我正在使用RADStudio XE,因此该组件应该是最新的!
我有一个带有Generator的firebird 2.x数据库和一个生成关键字段的触发器.我需要从下面的查询中获取返回的值.
INSERT INTO XXXX (vdate,description) values ('"+ VDate +"','"+ Description +"') returning vno INTO :ParamVoucherNo
Run Code Online (Sandbox Code Playgroud)
我尝试了以下代码的几个版本,但它不会破坏我得到
动态sql错误sql错误代码= -104
是否真的可以使用TIBQuery在delphi中获取返回值?
Query1->SQL->Clear();
Query1->SQL->Add("INSERT INTO XXXX (vodate,description) values ('"+ VDate +"','"+ Description +"') returning vno INTO :ParamVoucherNo");
Query1->Params->ParamByName("ParamVoucherno")->ParamType = ptResult;
Query1->Params->ParamByName("ParamVoucherno")->DataType = ftInteger;
Query1->Params->ParamByName("ParamVoucherno")->Value = "";
Query1->Prepare();
Query1->ExecSQL();
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我在C++ Builder中使用VirtualTreeView并使用它的结构如下:
struct TVTNodeData
{
int Index;
UnicodeString Caption;
}
Run Code Online (Sandbox Code Playgroud)
我使用具有以下内容的循环预填充树的节点:
TVirtualNode *Node = VTree->AddChild(NULL);
pNode = (TVTNodeData *)VTree->GetNodeData(Node);
pNode->Index = 1;
pNode->Caption = "Whatever";
Run Code Online (Sandbox Code Playgroud)
我注意到应用程序的内存不断增加(内存泄漏),即使我清除树并重新加载它.此页面 - http://www.remkoweijnen.nl/blog/2010/06/09/memory-leaks-when-using-virtual-treeview-component/建议在OnFreeNode事件中执行Finalize().目前很好.
但是C++中没有Finalize().我pNode->Caption=""在OnFreeNode事件中尝试过并且内存不再被大量分配,但它仍然有点.我认为即使它被清空也可能会引用UnicodeString(引用计数> 0).
如何OnFreeNode在C++中为UnicodeString 释放节点数据?我知道UnicodeString是在所有引用计数为零之前分配的 - 那么如何强制引用计数变为零?
另外,如果节点被分配了OnNodeInit- 在OnFreeNode事件中同样适用吗?
如果TVTNodeData结构纯粹是虚拟的 - 节点永远不可见也不会使用AddChild和OnNodeInit初始化,那么需要Finalize,结构是否甚至存在于内存中呢?
更新:我后来发现我正在错误地测量内存使用情况,而对于将字符串设置为空字符串的字符串来说,它确实足以清除内存数据.但是 - 正如Rob Kennedy在下面的回答中所建议的那样,调用struct~destructor甚至比Finalize更好,并且更容易,因为它清除了整个结构(如果你有更多的字符串).
我正在连接到一个发送UDP数据包的系统,作为响应(发送到特定IP地址)和广播(根据WireShark,目标255.255.255.255)
我可以正确接收'直接'数据包,但我无法弄清楚如何获得广播数据包.我假设我需要第二个具有不同绑定的TIdUDPClient,但我无法让它工作.
TIdUDPClient *reader(new TIdUDPClient(NULL));
TIdUDPClient *broadcastReader(new TIdUDPClient(NULL));
reader->Port = 2000;
reader->Host = "192.168.0.1";
reader->Connect();
broadcastReader->Port = 2000;
// broadcastReader->Host = "0.0.0.0"; // This doesn't work, but is here as an example
broadcastReader->BroadcastEnabled = true;
broadcastReader->Connect();
Run Code Online (Sandbox Code Playgroud)
然后,我有其他几乎相同的线程调用reader/broadcastReader->ReceiveBuffer().在reader一个工作正常,但broadcastReader->receiveBuffer()不会返回......
为C++代码和Delphi标签道歉;-)
我正在使用线程包装器,它检查是否从主线程调用更新VCL(也有一些参数)的函数,然后在主线程的上下文中执行.
它有效,但我想让它变得更简单.问题是我必须在需要VCL同步的每个函数中重复此代码,这很容易出错.有没有办法让这个包装器更简单,更可重用?请注意,此特定包装器仅使用一个参数,但可以有任意数量的参数复制TLocalArgs并传递.
当前代码:
boost::scoped_ptr<TIdThreadComponent> WorkerThread;
...
void TForm1::SetMemoMessage(UnicodeString Msg)
{
// Check which thread called function, main thread or worker thread
if (GetCurrentThreadId() != System::MainThreadID)
{
struct TLocalArgs
{
TForm1 *Form;
UnicodeString Msg;
void __fastcall SetMemoMessage() // Same name as main function to make it easier to maintain
{
// We are in main thread now, safe to call message update directly
Form->SetMemoMessage(Msg);
}
};
// We are in worker thread, wrap into Synchronize
TLocalArgs Args = { …Run Code Online (Sandbox Code Playgroud) 我需要使用链接的静态库构建我的C++ Builder XE项目,这样我就可以在Project的Debug\Win32目录中获得一个大的可执行文件,但我不能.
每次我尝试构建我的项目时,它都不会使用运行时库构建可执行文件,而我已将Project的选项设置为禁用"使用动态RTL链接"并启用"使用运行时包构建",如下所示:

这里出了什么问题?任何的想法?
非常感谢提前.
我正在C++ Builder 10 Seattle中编译应用程序,并尝试使用OpenSSL进行RSA工作.
我按照本教程:
这是代码:
#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
bool generate_key()
{
int ret = 0;
RSA *r = NULL;
BIGNUM *bne = NULL;
BIO *bp_public = NULL, *bp_private = NULL;
int bits = 2048;
unsigned long e = RSA_F4;
// 1. generate rsa key
bne = BN_new();
ret = BN_set_word(bne,e);
if(ret != 1){
goto free_all;
}
r = RSA_new();
ret = RSA_generate_key_ex(r, bits, bne, NULL);
if(ret != 1){
goto free_all;
}
// 2. save public …Run Code Online (Sandbox Code Playgroud) c++builder ×10
delphi ×5
vcl ×3
c++ ×2
bpl ×1
dll ×1
firebird ×1
indy10 ×1
memory-leaks ×1
openssl ×1
rsa ×1
templates ×1
treeview ×1
udp ×1
uicomponents ×1