到目前为止,我一直在使用 Indy 10,没有出现任何问题,但最近在安装 TMS 组件包时出现问题后,我正在寻找升级 Indy 的替代方法。TMS 在带有 CB2010 的干净系统上安装良好,但是当我使用以下过程升级 Indy 时,在启动 IDE 时以及 TMS 安装后立即出现错误 - 错误为:The procedure entry point @Idhttp@TidCustomHTTP@GetRequestHeaders$qqrv could not be located in the dynamic link library IndyProtocols140.bpl。显然我这边有一些问题,因为 TMS 确实是在干净安装时安装的,而没有 Indy 升级。
因此,如果我用较新的版本覆盖 Indy 文件,也许它可以正确安装。
以下是我现在使用的 Indy 升级的安装过程(在 TMS 安装之前一直有效):
启动IDE并删除Indy10 Protocols Design Time并Indy10 Core Design Time打包
运行此脚本来删除旧的 Indy 文件:
del /q "c:\Program Files\Embarcadero\RAD Studio\7.0\lib\Indy10\*.*"
del /q "c:\Program Files\Embarcadero\RAD Studio\7.0\lib\debug\Indy10\*.*"
del /q "c:\Program Files\Embarcadero\RAD Studio\7.0\include\Indy10\*.*"
del /q /s "c:\Program Files\Embarcadero\RAD …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更好,并且更容易,因为它清除了整个结构(如果你有更多的字符串).
我在Windows 7上遇到了VirtualTreeView组件的问题.我添加了一个TVirtualStringTree并使用OnGetImageIndex事件来分配ImageIndex,它始终处于调试器非零值.
VirtualStringTree使用带有16x16图标的TImageList作为Images属性.
在Windows XP上它可以正常工作,在Windows 7上,它在正常图标的顶部与TImageList的索引为0的图标重叠.我在Windows 7上运行与在XP上相同的程序,因此代码是相同的,但绘图是不同的.
此图片说明了问题:
virtualtreeview问题http://i42.tinypic.com/6sb8ko.jpg
灰色三角形图标的索引为0,文件夹图标的索引为5.
这是VirtualStringTree中的错误吗?我可以以某种方式避免这个吗?
我正在使用存储库中的最新VirtualTreeView版本.
关于TIdThreadComponent以下问题的简单而重要的问题:
在哪个线程是OnTerminate与OnStopped执行-主线程或者工作线程?
我在这些事件中(并调用VCL属性和方法)可以安全地假设我在主线程中吗?
更新:我想我可能会使用调试器,并在尝试之后,看起来像是OnStopped在工作线程内并且OnTerminate在主线程内.另外一个好处是调试器可以帮助确定执行启动/停止/控制线程的其他相关功能的位置,并减少可能的错误.
我有一个VirtualTreeView,它最初隐藏了一些列(coVisible不存在).
启用它们(添加coVisible到列选项)后会发生奇怪的事情 - 列出现但与前一列重叠.我可以通过将宽度更改为1像素更小,然后返回到列的原始宽度来强制重新绘制,然后正确显示列,从而解决问题.
除了添加coVisible以使列重新正确显示之外,还有什么我需要做的吗?
如果我要创建应用程序清单并将其作为资源嵌入到我的应用程序中,那么在将其编译为应用程序资源之前,我的MyApplication.manifest文件是否应包含UTF-8 BOM或不包含(0xEF,0xBB,0xBF)?
如果我要使用与主EXE分开的清单文件(通过在主EXE旁边添加它,例如MyApp.exe和MyApp.manifest),同样的问题也适用?
如果你有任何参考,这将是有用的,我找不到任何.
我正在使用 C++Builder 10.3 Rio 和 VCL Windows 应用程序。我正在使用 TScreen->Forms 来获取有关我的程序打开表单的信息。这显示 FormCount 比我预期的要高。我的应用程序有两个打开的窗体(1)主程序窗体和(2)数据输入对话框。当我检查 Screen->FormCount 时,它显示 6 个表单。当我检查下面的 for 循环中的表单名称和标题时,只有我的 2 个表单有名称和标题。其他表单名称和标题均为 NULL。我可以使用dynamic_cast或表单名称来识别我的表单。还有哪些额外的形式?我如何识别其他表格?
UnicodeString MyName, MyCaption;
for(int j=0; j<Screen->FormCount; j++){
MyName = Screen->Forms[j]->Name;
MyCaption = Screen->Forms[j]->Caption;
TMyForm *MyLocal = dynamic_cast<TMyForm *>( Screen->Forms[j] );
}
for(int j=0; j<Screen->CustomFormCount; j++){
MyName = Screen->CustomForms[j]->Name;
MyCaption = Screen->CustomForms[j]->Caption;
}
Run Code Online (Sandbox Code Playgroud) 我有一个定义带有默认参数的函数的类。只要函数定义在调用它的函数之前的头文件中,它就可以正常工作。
但是,如果我在调用函数 C++ Builder (2010) 报告参数太少错误后移动它。
标题可能是例如:
class TSomething
{
public:
void CallingFunction();
void Function(int a);
}
Run Code Online (Sandbox Code Playgroud)
和 cpp 文件可能是:
#include "Header.h"
TSomething::CallingFunction()
{
Function(); // "Too few arguments" here...
}
TSomething::Function(int a = 123)
{
//... some code here ...
}
Run Code Online (Sandbox Code Playgroud)
因此,如果调用函数在“函数”之前,它会报告参数太少。我不明白为什么,因为它在 cpp 文件的 #include 语句中包含函数定义。谁能告诉我如何重新排列它以便它正确接受默认参数?我可以将 Function(int a) 移到 CallingFunction 上方以使其工作到此为止。
据我所知,没有适当的可用于对齐TToolButton类似Layout属性的文本TSpeedButton.有没有办法以某种方式对齐右边的文本(相当于a的属性blGlyphLeft值)?LayoutTSpeedButton
我已经有一个专门用于添加按钮的功能 - AddButtonToToolBar()具有明显的目的.有没有办法添加一些东西来对齐按钮文字?
我ShellExecuteW在Windows8.1上调用标准调用来打开PPS(powerpoint slide)文件.
这在Windows 7上运行正常.在Windows 8.1上.它报告"没有与打开文件相关的程序".当然,文件关联已设置,如果文件已保存并从资源管理器中运行(双击),则打开就可以了.我还尝试更改关联并关联另一个程序,然后关联回PPS查看器,没有任何改进.它只对W8.1不起作用,但同样的调用适用于早期的Windows.
任何人都可以告诉我这里可能有什么问题吗?
用于打开文件的代码非常简单,我发现它没有错误:
HINSTANCE hinst = ShellExecuteW(NULL, L"open", L"C:\\path\\to\\file.pps", NULL, NULL, SW_SHOWNORMAL);
// Check if result is error
if ((int)hinst <= 32)
{
wchar_t buf[512] = { 0 };
FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 512, NULL);
MSGBOX(buf);
}
Run Code Online (Sandbox Code Playgroud)
我使用免费的PPS查看器,如下所示:http: //www.microsoft.com/en-us/download/details.aspx?id = 13
我发现类似的东西指出这可能是Win8.1中的一个错误.谁能证实这一点?或者揭示一个解决方法?
我是否认为以下代码块是正确的:
try
{
Screen->Cursor = crHourGlass;
try
{
throw Exception("error!");
}
catch(Exception& e)
{
Application->MessageBox(UnicodeString(e.Message).c_str(), L"Error", MB_OK);
}
}
__finally
{
Screen->Cursor = crDefault;
}
Run Code Online (Sandbox Code Playgroud)
实际上是否与此相同,并且__finally在这里毫无用处,因为在两种情况下,无论如何都将执行Screen-> Cursor = crDefault?
Screen->Cursor = crHourGlass;
try
{
throw Exception("error!");
}
catch(Exception& e)
{
Application->MessageBox(UnicodeString(e.Message).c_str(), L"Error", MB_OK);
}
Screen->Cursor = crDefault;
Run Code Online (Sandbox Code Playgroud) 谁能澄清为什么当我尝试删除时会收到“无效的指针操作” TStreamAdapter?或者...如何正确释放内存TStreamAdapter?如果我删除它,它会起作用,delete但这会导致内存泄漏。即使我使用 boost::scoped_ptr 它也会失败并出现相同的错误。
注意:我也尝试TStreamAdapter用soOwned值初始化,同样的错误。
代码:
HRESULT LoadFromStr(TWebBrowser* WB, const UnicodeString& HTML)
{
if (!WB->Document)
{
WB->Navigate("about:blank");
while (!WB->Document) { Application->ProcessMessages(); }
}
DelphiInterface<IHTMLDocument2> diDoc = WB->Document;
if (diDoc)
{
boost::scoped_ptr<TMemoryStream> ms(new TMemoryStream);
{
boost::scoped_ptr<TStringList> sl(new TStringList);
sl->Text = HTML;
sl->SaveToStream(ms.get(), TEncoding::Unicode);
ms->Position = 0;
}
DelphiInterface<IPersistStreamInit> diPSI;
if (SUCCEEDED(diDoc->QueryInterface(IID_IPersistStreamInit, (void**)&diPSI)) && diPSI)
{
TStreamAdapter* sa = new TStreamAdapter(ms.get(), soReference);
diPSI->Load(*sa);
delete sa; // <-- invalid pointer operation here???
// UPDATED …Run Code Online (Sandbox Code Playgroud) 我已将包含以下内容的文本文件添加到项目中:
1 24 "MyApplication.manifest"
Run Code Online (Sandbox Code Playgroud)
在同一个文件夹中还有MyApplication.manifest一个XML文件 - 这一个:
C++ Builder/Delphi 2010应用程序清单模板
在我尝试从RC构建资源后,我得到错误 - 源输入中的错误字符(1)
有什么想法吗?
RT_MANIFEST 值是24,但我不确定1应该是什么.
c++builder ×10
delphi ×6
c++ ×4
indy10 ×2
winapi ×2
com ×1
indy ×1
installation ×1
manifest ×1
memory-leaks ×1
properties ×1
shellexecute ×1
tms ×1
toolbar ×1
utf-8 ×1
windows ×1
windows-8.1 ×1