标签: c++builder

让C++ Builder/Delphi在启动时创建TForms,还是手动创建?

在Builder(或Delphi)中创建TForm时,会main在应用程序启动时添加代码以创建这些表单:

Application->CreateForm( __classid( TxForm), &xForm );
Run Code Online (Sandbox Code Playgroud)

这使事情变得更容易,但是当应用程序有10,20,50,100个表单时它是否明智?我假设这可以抓住各种内存和系统句柄.通过使用Project-> Options-> Forms对话框删除表单,可以在需要时随时创建表单,并且:

std::auto_ptr< TxForm > myForm( new TxForm( this ));

myForm->ShowModal();
Run Code Online (Sandbox Code Playgroud)

所以问题是,哪个更好,让C++ Builder以自己的方式完成它,或者在需要时手动创建表单?

delphi vcl c++builder

6
推荐指数
3
解决办法
1296
查看次数

是什么解释了这个奇怪的PeekMessage行为(尝试处理完整的消​​息队列,过滤特定的消息)?

我们的应用程序充当COM服务器,其中所有自动化都发生在单个STA公寓内(在应用程序的主线程中),并且一些进行冗长(> 10分钟)调用的VBS脚本失败,并显示错误"系统调用失败(80010100)" .一些研究(,,)表明这可能是由消息队列填满引起的,因此当COM尝试调用下一个方法时,它无法进行.

如果它很重要,该应用程序是使用Embarcadero RAD Studio 2010开发的(主要是C++,对于某些COM类的Delphi.)

我想我会在漫长的COM方法调用结束时检查线程的消息队列(即,在它返回之前),通过使用GetQueueStatus和查看它包含的内容PeekMessage.虽然看起来队列已经满了,但我看到了一些奇怪的行为,我无法弄清楚为什么PeekMessage它的行为方式,以及为什么队列已满 - 即它充满了什么.

前面稍微冗长的解释:

测试线程的消息队列已满

像这样的代码:

int iMessages = 0;
DWORD dwThreadId = GetCurrentThreadId();
while (::PostThreadMessage(dwThreadId, WM_USER, 0, 0)) {
  iMessages++;
}
if (GetLastError() == ERROR_NOT_ENOUGH_QUOTA) {
  String strError = L"Not enough quota, posted " + IntToStr(iMessages) + L" messages";
  // Do something with strError
}
Run Code Online (Sandbox Code Playgroud)

当在一个简短的COM调用方法结束时运行可以发布数千(例如,9996)消息; 在导致脚本失败的冗长方法调用结束时,它可以发布0.我的结论是消息队列已满是真正导致问题的原因.我的系统的消息队列限制是默认值10000(请参阅"备注"部分.)

调用Application->ProcessMessages()(调用应用程序的消息循环,直到它为空,对于那些不是Delphi/C++ Builder用户的人来说 - …

delphi com winapi c++builder message-queue

6
推荐指数
1
解决办法
2095
查看次数

在TClientDataset中聚合计算字段

是否可以在计算字段上添加聚合字段?

假设有一个cds包含以下字段:

  • ID(自动增量)
  • 名称(字符串)
  • 价格(浮动)
  • 数量(整数)
  • 总计(整数) - 计算字段 - 价格*数量

我想添加一个agregate来获得Total列的总和.可能吗?

delphi vcl c++builder tclientdataset aggregate-functions

6
推荐指数
1
解决办法
1484
查看次数

在Borland C++ Builder中是否有类似C#的"十进制"类型?

在C#中,有一个名为decimal(System.Decimal结构)的类型.我找到的信息显示它比某些情况更好floatdouble类型:

Borland C++ Builder程序有类似的类型吗?

c# floating-point decimal c++builder

6
推荐指数
1
解决办法
1826
查看次数

这是reinterpret_cast可以做的

我是EE,而不是代码专家,所以请在这里请耐心等待.

我正在使用Embarcadero C++ Builder(XE3).

我有一个FFT算法,它对复数进行了大量的操作.我发现如果我绕过Embarcadero的复杂数学库,并在我自己的代码中进行所有计算,我的FFT运行速度将快4.5倍.这里显示的4个操作都需要过多的时间.

#include <dinkumware\complex>
#define ComplexD std::complex<double>
ComplexD X, Y, Z, FFTInput[1024];
double x, y;
Z = X * Y; 
x = X.real();
y = X.imag();
Z = ComplexD(x,y); 
Run Code Online (Sandbox Code Playgroud)

用我自己的交叉乘法替换乘法将我的执行时间减半.然而,我关心的是我访问输入数组的实部和虚部的方式.我这样做:

double *Input;
Input = reinterpret_cast<double *>(FFTInput);
// Then these statements are equivalent.
x = FFTInput[n].real();
y = FFTInput[n].imag();
x = Input[2*n];
y = Input[2*n+1];
Run Code Online (Sandbox Code Playgroud)

这样做可以将执行时间再缩短一半,但我不知道这种reinterpret_cast是否是明智之举.我可以将输入数组更改为两个双精度而不是复数,但我在许多程序中使用此FFT并且不想重写所有内容.

这个reinterpret_cast好吗,还是我有内存问题?另外,有没有办法让Embarcadero复杂的数学函数运行得更快?最后,虽然它对我来说不是非常重要,但是这个reinterpret_cast是否可移植?

c++ c++builder reinterpret-cast

6
推荐指数
1
解决办法
755
查看次数

std :: getline用于逗号分隔的表文件,其中包含某些字段的引号

我基本上运行以下代码.此代码逐行执行并获取通用逗号分隔表文件的不同字段.我的问题是,有时"标题"字段可以包含逗号.当它这样时,它被引号括起来:"这,这是我的头衔".但是当我的代码看到逗号时,它只会将其后的所有内容视为下一个字段.并非所有标题都有引号,只有引号括起来.我的问题是,我不知道如何使代码检查这....我怎样才能让我的代码检查这个问题?

非常感谢,你好.这对我的有酬工作意义重大!

while (getline(BookLine, ImpLine, '\n'))  // Get each line
{
   // create a string stream from the standard string
   std::istringstream StrLine(ImpLine);

   std::string
   bookNumber,
   chk,
   author,
   title,
   edition;

   // Parse lines
   std::getline(StrLine,bookNumber,',');
   std::getline(StrLine,chk,',');
   std::getline(StrLine,author,',');
   std::getline(StrLine,title,',');            
   std::getline(StrLine,edition,',');
}
Run Code Online (Sandbox Code Playgroud)

c++ c++builder

5
推荐指数
1
解决办法
2163
查看次数

在构造函数中的神秘堆栈溢出

这是我的程序使用的类层次结构:

在此输入图像描述

TForm_Upgrade_Database的构造函数如下所示:

__fastcall TForm_Upgrade_Database :: TForm_Upgrade_Database(TComponent*Owner,int newest_version):TForm(Owner){}

在尝试创建公式的实例之后

TForm_Upgrade_Database *dlg = new TForm_Upgrade_Database(this, newest_version);
Run Code Online (Sandbox Code Playgroud)

我的程序抛出EStackOverflow异常

在此输入图像描述

我停止了程序并在TForm_Upgrade_Database构造函数中使用断点再次运行它.几步之后callstack看起来像这样:

在此输入图像描述

如何TCustomForm构造函数继续尝试调用其后代的构造函数???

最小的测试用例:

so_project.cpp:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "f_form.h"
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
   TForm_Upgrade_Database *form = new TForm_Upgrade_Database(NULL, 10);
   delete form;
   form = NULL; 

   return 0;
}
//---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

f_form.cpp:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "f_form.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm_Upgrade_Database *Form1;
//---------------------------------------------------------------------------
__fastcall TForm_Upgrade_Database::TForm_Upgrade_Database(TComponent* Owner, int x)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

f_form.h:

//---------------------------------------------------------------------------

#ifndef f_formH
#define …
Run Code Online (Sandbox Code Playgroud)

c++ stack-overflow constructor c++builder c++builder-6

5
推荐指数
1
解决办法
504
查看次数

使用TAction作为"仅图标"TButton

我有一个用于菜单项和TButton的TAction.我希望菜单项显示标签,TButton 显示图标.但是,当分配一个Action时,Vcl会自动设置TButton的Caption属性,我无法摆脱它.

有任何想法吗?

delphi c++builder taction

5
推荐指数
1
解决办法
468
查看次数

当值变小时,为什么这些计算需要20倍的时间

我是电路设计师,而不是软件工程师,所以我不知道如何追踪这个问题.

我正在使用一些IIR过滤器代码,当我通过过滤器处理极小的值时,我遇到极慢的执行时间问题.为了找到问题,我写了这个测试代码.

通常,循环将在大约200毫秒左右运行.(我没有测量它.)但是当TestCheckBox-> Checked时,它需要大约7秒才能运行.问题在于环路内A,B,C和D的大小减小,这正是IIR滤波器输入变为零后的值所发生的情况.

我认为问题在于变量的指数值小于-308.一个简单的解决方法是将变量声明为long double,但这在实际代码中并不是一个简单的修复,而且我似乎不应该这样做.

任何想法为什么会发生这种情况以及简单的修复可能是什么

如果它很重要,我使用的是C++ Builder XE3.

int j;
double A, B, C, D, E, F, G, H;
//long double A, B, C, D, E, F, G, H; // a fix
A = (double)random(100000000)/10000000.0 - 5.0;
B = (double)random(100000000)/10000000.0 - 5.0;
C = (double)random(100000000)/10000000.0 - 5.0;
D = (double)random(100000000)/10000000.0 - 5.0;
if(TestCheckBox->Checked)
 {
  A *= 1.0E-300;
  B *= 1.0E-300;
  C *= 1.0E-300;
  D *= 1.0E-300;
 }
for(j=0; j<=1000000; j++)
{
 A *= 0.9999;
 B *= 0.9999;
 C …
Run Code Online (Sandbox Code Playgroud)

c++ x86 c++builder

5
推荐指数
2
解决办法
593
查看次数

在知道墙壁的位置的同时计算房间

这个问题是关于C++ builder 6的代码.赏金对标准C++算法感兴趣,以便在给定标准化输入的情况下解决问题(有关更多信息,请参阅内容.)

城堡

txt文件也代表我在数组中的数据:

1101 0110 1101 0110 1100 0101 0110
1110 1001 0110 1011 1010 1111 1010
1000 0101 0011 1110 1011 1110 1010
1011 1101 0101 0001 0101 0011 1011

txt的说明:
txt文件中的数字是房间墙壁的4位表示,其中一个位表示墙.壁位按顺时针顺序开始,最重要的位是西墙.例如,1101代表一个房间,其中:

  • 位于最重要位置的位置表示西方的一堵墙
  • 下一个最重要位置的设定位表示朝向北方的墙
  • 未设置的位表示没有东墙
  • 位于最低位置的设置位表示南边的墙

鉴于:

  1. 房间的外墙总是有一面墙
  2. 内墙总是在两个房间都有表达(在这个例子中,因为(1,1)的房间是1101,它包含一个向南的墙,在(1,2)1110的房间必须包含一个向北的墙
  3. 永远不会有numeric_limits<int>::max()房间

被要求发布我的代码,所以这里是:
我试图解决这个问题,但我得到EAAccessviolation有人可以告诉我我做错了什么?

  int rn=0,z=0, global=0,coord[15],c[411],b1[411];

void peruse ( int i, int j,int* bb)
{
bool top=false,bottom=false,right=false,left=false;
//truth checks

if (bb[i*m+j]<1000)  left=true;

if (bb[i*m+j]<100)   top=true; …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm c++builder variable-assignment

5
推荐指数
2
解决办法
710
查看次数