我的源文件窗口正在快速增长(就我项目中的文件数量而言),并且在任何给定时间快速找到我需要访问的特定源文件会变得有点麻烦.我正在使用Embarcadero的C++ Builder,但我也在其他C++ IDE中遇到过这个问题.
在Java中,我经常使用包来创建源代码的逻辑分区,尤其是在单个项目中处理大量源文件时.虽然这,当然,是不是Java包的唯一目的,他们在这方面是非常方便的.
有没有人对如何在C++中实现类似的功能有任何想法?我应该将我的源分成物理文件夹吗?C++ Builder是否提供了某些我没有看到的虚拟文件夹/分组功能?任何想法都表示赞赏,谢谢.
我想知道是否有相当于RAD Studio中Visual Studio的#regions.
我在工作中使用Delphi和C++构建器IDE,我希望能够使用像region这样的东西.
我的同事和我还没有找到一种相同的分组代码方式......你知道吗?
我有一个应用程序,从二进制日志文件加载记录,并在虚拟TListView中显示它们.文件中可能有数百万条记录,用户可以过滤显示,因此我不会一次加载内存中的所有记录,并且ListView项目索引不是一对一的关系.文件记录偏移(例如,列表项1可以是文件记录100).我使用ListView的OnDataHint事件来加载ListView实际感兴趣的项目的记录.当用户滚动时,OnDataHint指定的范围发生变化,允许我释放不在新范围内的记录,并分配新记录如所须.
这样工作正常,速度可以忍受,并且内存占用非常低.
我目前正在评估TVirtualStringTree作为TListView的替代品,主要是因为我想添加扩展/折叠跨越多行的记录的能力(我可以通过动态递增/递减项目计数来使用TListView来捏造它,但这不是像使用真正的树一样直接).
在大多数情况下,我已经能够移植TListView逻辑并让一切工作正常.我注意到TVirtualStringTree的虚拟范例有很大的不同.它没有与TListView相同的OnDataHint功能(我可以使用OnScroll事件伪造它,这允许我的内存缓冲逻辑继续工作),我可以使用OnInitializeNode事件将节点与分配的记录相关联.
但是,一旦树节点初始化,它就会看到它在树的生命周期内保持初始化状态.这对我不好.当用户滚动并从内存中删除记录时,我需要重置那些非可视节点,而不是完全从树中删除它们,或者丢失它们的展开/折叠状态.当用户将它们滚动回视图时,我可以重新分配记录并重新初始化节点.基本上,就虚拟化而言,我希望尽可能使TVirtualStringTree像TListView一样.
我已经看到TVirtualStringTree有一个ResetNode()方法,但每次尝试使用它时都会遇到各种错误.我一定是错了.我还想过将每个节点内的数据指针存储到我的记录缓冲区中,然后分配并释放内存,相应地更新这些指针.最终效果也不是很好.
更糟糕的是,我最大的测试日志文件中有大约500万条记录.如果我一次初始化具有那么多节点的TVirtualStringTree(当日志显示未经过滤时),那么树的内部开销就会占用高达260MB的内存(还没有分配任何记录).而使用TListView,加载相同的日志文件及其背后的所有内存逻辑,我可以使用几个MB.
有任何想法吗?
我有很多数据文件.它们看起来像1.dat 2.dat .... .... 1000.dat
我想制作一部电影,使用这些文件按顺序绘制它们.有没有人有任何想法吗?如果你能帮助我,我将感到非常高兴.ND
Delphi 2007(及更新版本)支持通过以下三种技术中的任何一种启用DEP和ASLR:
–dynamicbase使用dcc32编译时添加命令行开关{$DYNAMICBASE ON}到源代码中{$SETPEOPTFLAGS $40}在源代码中我希望能够用Delphi 2006和C++ Builder 2006(又名BDS 2006)做同样的事情.有谁知道如何做到这一点?
我的工作与功能的COM对象库,它返回一个VARIANT带有SAFEARRAY的BSTR秒.如何显示此VARIANT实例的值并将其保存在TStringList?我试着在网上搜索没有明确的答案.
我尝试了以下但没有成功:
Variant V;
String mystr;
VarClear(V);
TVarData(V).VType = varOleStr;
V = ComFunction->GetValues(); //<<<<----- V is empty
mystr = (wchar_t *)(TVarData(V).VString);
Memo1->Lines->Add(mystr);
VarClear(V);
Run Code Online (Sandbox Code Playgroud) 我们有一个C++ Builder XE项目(VCL Forms Application),里面有几十个表单和单元.每当添加,删除或重命名属于项目的文件时,IDE都应该做两件事:
但是,IDE不是仅进行必要的更改,而是对现有的USEFORM和CppCompile记录进行洗牌,即使它们不受更改的影响.如果我添加一个单元(cpp和头文件),即使不需要对项目源进行任何更改,也只需要对cbproj文件进行任何更改,USEFORM都会被洗牌.
我没有看到新订单如何形成的具体模式.如果我编辑或重命名一个单元,大约一半的USEFORMs似乎改变了位置,只改变了一对或没有CppCompile记录.如果在两台不同的机器上对项目副本进行了更改,则大多数更改似乎都相似,但并非全部.这表明重新排序不是随机的.
使用Subversion合并更改时,该行为会导致问题,因为它会强制手动解决更改顺序造成的冲突.
所以问题是:什么可能导致上述行为以及如何摆脱它?
由于我不时在使用TWebBrowser和TEmbeddedWB时收到"浮点除零"异常,我发现我需要屏蔽除零除异常Set8087CW或SetMXCSR.
Q1:这样做的最佳方法是什么:
OnBeforeNavigate和OnDocumentComplete事件掩盖/取消屏蔽异常?(文档加载后是否有可能发生异常?)Q2:什么是最好的"命令"来屏蔽"除以零"而没有别的 - 如果应用程序是32位,是否需要屏蔽64位异常?
我正在使用它的应用程序,它一直可用于显示电子邮件内容的TWebBrowser控件.
此外,如果有人可以澄清 - 这是来自Microsoft的TWebBrowser控件的特定错误还是Delphi/C++ Builder和Microsoft工具之间的区别?如果我在Visual C++应用程序中托管TWebBrowser会出现如果出现除零错误会发生什么 - 它不会被转换为异常但会发生什么 - 那么Visual C++将如何处理"除以零"异常呢?
有点奇怪的是,微软在很长一段时间内没有注意到这个问题 - 也很奇怪,Embarcardero也没有注意到它.因为有效屏蔽浮点异常也会为此特定目的屏蔽您自己的程序异常.
UPDATE
经过一番检查,我的最终解决方案是
SetExceptionMask(GetExceptionMask() << exZeroDivide);
Run Code Online (Sandbox Code Playgroud)
GetExceptionMask()的默认状态返回:TFPUExceptionMask() << exDenormalized << exUnderflow << exPrecision.很明显,一些例外已被掩盖 - 这只会增加exZeroDivide掩盖的异常.
因此,现在每个除零都会导致浮点数+ INF而不是异常.我可以忍受 - 对于代码的生产版本,我将屏蔽它以避免错误,对于调试版本,它将被解除屏蔽以检测浮点除以零.
我正在尝试创建一个TVirtualStringTree类似于以下内容的视图:

在上面的例子中,我展示了一些我想要达到的可能场景.FolderA具有粗体文本,之后在同一节点中位于其后面的红色非压缩文本.我正在寻找制作这种输出的方法.
但是,如果创建太难或太难,我会对FolderB或FolderC类型的输出感到满意- 这可能是由2列组成的,一列包含文件夹名称,另一列包含内部文件的数量.
FolderD在这里仅作为没有文件的文件夹的示例和该文件夹的输出(文本是非文本的,没有数字).
我正在寻找任何方向如何产生这种效果,因为似乎VirtualTreeView每个节点只能有单色或粗体设置.任何提示或建议如何向FolderA或FolderB或FolderC的方向移动高度赞赏,所以我有一个起点.Delphi或C++ Builder示例都是受欢迎的(最终代码将在C++ Builder中).
我正在迁移旧C++代码的一些部分,最初使用CodeGear C++Builder®2009版本12.0.3170.16989编译
以下代码 - 更大版本的最小版本 - -34使用任何现代编译器输出.虽然,在原始平台中输出84:
char Key[4];
Key[0] = 0x1F;
Key[1] = 0x01;
Key[2] = 0x8B;
Key[3] = 0x55;
for(int i = 0; i < 2; i++) {
Key[i] = Key[2*i] ^ Key[2*i + 1];
}
std::cout << (int) Key[1] << std::endl;
Run Code Online (Sandbox Code Playgroud)
for(int i = 0; i < 2; i++) {
char a = Key[2*i];
char b = Key[2*i + 1];
char c = a ^ b;
Key[i] = c;
}
Run Code Online (Sandbox Code Playgroud)
此外,手动展开循环似乎适用于两个编译器: …
c++builder ×10
delphi ×6
c++ ×2
bstr ×1
exception ×1
ide ×1
organization ×1
region ×1
safearray ×1
twebbrowser ×1
vcl ×1