假设我有一个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)中公开它?
我想知道是否有相当于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.
有任何想法吗?
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 2010项目,并希望为它添加测试.因此,我不想暂停控制台窗口的输出来读取测试结果,而是希望将相同的信息打印到C++ Builder中的输出窗口(而不是在事件日志中).
所以OutputDebugString对我来说不是一个选择.是否有一些特定的方法可以将控制台输出重定向到输出窗口或直接在那里打印?

在Embarcadero RAD Studio 2010中,静态库的项目选项中有一个名为"Dynamic RTL"的设置.(它在TLib部分.)
我的印象是,关于是动态还是静态链接RTL的决定是在链接时进行的,而不是在编译时进行的.但静态库只能编译; 没有链接步骤.那么,更改此选项如何影响我的静态库?
我有一些使用这些静态库的.exe和.dll项目,我在这些项目中设置了"动态RTL"选项.这是有道理的,因为它们实际上有链接的东西,但我不明白这个设置对静态库有什么影响.
如果静态库具有动态RTL = true而使用此库的DLL和EXE具有动态RTL = false,是否会导致任何问题?
我有一个包含四个单词行的列表框.当我点击一行时,应在四个不同的文本框中看到这些单词.到目前为止,我已经完成了所有工作,但我遇到了字符转换的问题.列表框中的字符串是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++编程.谁能告诉我如何转换这个?
由于我不时在使用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中).