标签: c++builder

向我的COM对象的VBScript用户公开事件处理程序

假设我有一个COM对象,用户可以通过以下呼叫访问:

Set s = CreateObject("Server")
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是允许用户为对象指定事件处理程序,如下所示:

Function ServerEvent

   MsgBox "Event handled"

End Function

s.OnDoSomething = ServerEvent
Run Code Online (Sandbox Code Playgroud)

这是可能的,如果是这样,我如何在我的C++类型库(特别是BCB 2007)中公开它?

com vbscript events c++builder

8
推荐指数
2
解决办法
3461
查看次数

C++ Builder中的#region等价物?与组代码类似?

我想知道是否有相当于RAD Studio中Visual Studio的#regions.

我在工作中使用Delphi和C++构建器IDE,我希望能够使用像region这样的东西.

我的同事和我还没有找到一种相同的分组代码方式......你知道吗?

delphi c++builder region

8
推荐指数
2
解决办法
3328
查看次数

TVirtualStringTree - 重置非可视节点和内存消耗

我有一个应用程序,从二进制日志文件加载记录,并在虚拟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.

有任何想法吗?

delphi vcl c++builder virtualtreeview

8
推荐指数
1
解决办法
2791
查看次数

如何在Delphi 2006或更早的可执行文件上启用DEP/NX和ASLR?

Delphi 2007(及更新版本)支持通过以下三种技术中的任何一种启用DEP和ASLR:

  • –dynamicbase使用dcc32编译时添加命令行开关
  • 将预处理器命令添加{$DYNAMICBASE ON}到源代码中
  • 手动或在标题中的位中,{$SETPEOPTFLAGS $40}在源代码中

我希望能够用Delphi 2006和C++ Builder 2006(又名BDS 2006)做同样的事情.有谁知道如何做到这一点?

delphi c++builder

8
推荐指数
2
解决办法
1843
查看次数

如何使用SATREARRAY为BSTR的VARIANT显示值

我的工作与功能的COM对象库,它返回一个VARIANT带有SAFEARRAYBSTR秒.如何显示此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)

delphi bstr c++builder safearray

8
推荐指数
1
解决办法
5761
查看次数

如何打印到C++ Builder输出窗口

我有一个C++ Builder 2010项目,并希望为它添加测试.因此,我不想暂停控制台窗口的输出来读取测试结果,而是希望将相同的信息打印到C++ Builder中的输出窗口(而不是在事件日志中).

所以OutputDebugString对我来说不是一个选择.是否有一些特定的方法可以将控制台输出重定向到输出窗口或直接在那里打印?

C++ Builder 2010输出窗口

ide delphi debugging c++builder c++builder-2010

8
推荐指数
1
解决办法
2020
查看次数

更改静态库的"动态RTL"设置有什么影响?

在Embarcadero RAD Studio 2010中,静态库的项目选项中有一个名为"Dynamic RTL"的设置.(它在TLib部分.)

我的印象是,关于是动态还是静态链接RTL的决定是在链接时进行的,而不是在编译时进行的.但静态库只能编译; 没有链接步骤.那么,更改此选项如何影响我的静态库?

我有一些使用这些静态库的.exe和.dll项目,我在这些项目中设置了"动态RTL"选项.这是有道理的,因为它们实际上有链接的东西,但我不明白这个设置对静态库有什么影响.

如果静态库具有动态RTL = true而使用此库的DLL和EXE具有动态RTL = false,是否会导致任何问题?

c++ c++builder static-linking

8
推荐指数
1
解决办法
3371
查看次数

将Unicodestring转换为Char []

我有一个包含四个单词行的列表框.当我点击一行时,应在四个不同的文本框中看到这些单词.到目前为止,我已经完成了所有工作,但我遇到了字符转换的问题.列表框中的字符串是UnicodeString,但strtok使用char [].编译器告诉met无法将UnicodeString转换为Char [].这是我用于此的代码:

{
 int a;
 UnicodeString b;

 char * pch;
 int c;

 a=DatabaseList->ItemIndex;   //databaselist is the listbox
 b=DatabaseList->Items->Strings[a]; 

 char str[] = b; //This is the part that fails, telling its unicode and not char[].
 pch = strtok (str," ");      
 c=1;                          
 while (pch!=NULL)
    {
       if (c==1)
       {
          ServerAddress->Text=pch;
       } else if (c==2)
       {
          DatabaseName->Text=pch;
       } else if (c==3)
       {
          Username->Text=pch;
       } else if (c==4)
       {
          Password->Text=pch;
       }
       pch = strtok (NULL, " ");
       c=c+1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我的代码看起来不太好,实际上非常糟糕.我只是在学习一些C++编程.谁能告诉我如何转换这个?

c++builder chars

8
推荐指数
1
解决办法
2万
查看次数

使用Set8087CW,SetMXCSR和TWebBrowser屏蔽浮点异常

由于我不时在使用TWebBrowser和TEmbeddedWB时收到"浮点除零"异常,我发现我需要屏蔽除零除异常Set8087CW或SetMXCSR.

Q1:这样做的最佳方法是什么:

  1. 在应用程序启动的早期屏蔽这些异常,再也不要再触摸它们(应用程序是多线程的)?
  2. 使用OnBeforeNavigateOnDocumentComplete事件掩盖/取消屏蔽异常?(文档加载后是否有可能发生异常?)

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而不是异常.我可以忍受 - 对于代码的生产版本,我将屏蔽它以避免错误,对于调试版本,它将被解除屏蔽以检测浮点除以零.

delphi exception c++builder webbrowser-control twebbrowser

8
推荐指数
1
解决办法
3585
查看次数

VirtualTreeView - 同一节点中不同颜色的文本

我正在尝试创建一个TVirtualStringTree类似于以下内容的视图:

用不同的字体颜色的文件夹视图

在上面的例子中,我展示了一些我想要达到的可能场景.FolderA具有粗体文本,之后在同一节点中位于其后面的红色非压缩文本.我正在寻找制作这种输出的方法.

但是,如果创建太难或太难,我会对FolderBFolderC类型的输出感到满意- 这可能是由2列组成的,一列包含文件夹名称,另一列包含内部文件的数量.

FolderD在这里仅作为没有文件的文件夹的示例和该文件夹的输出(文本是非文本的,没有数字).

我正在寻找任何方向如何产生这种效果,因为似乎VirtualTreeView每个节点只能有单色或粗体设置.任何提示或建议如何向FolderAFolderBFolderC的方向移动高度赞赏,所以我有一个起点.Delphi或C++ Builder示例都是受欢迎的(最终代码将在C++ Builder中).

delphi c++builder virtualtreeview tvirtualstringtree

8
推荐指数
1
解决办法
3594
查看次数