默认情况下使用VirtualTreeView拖动操作时[doCopy,doMove].移动操作由带有小方框的箭头指针指示,复制操作由相同的指针图标指示,但旁边添加了[+].
默认情况下,VT使用复制操作,如果按下修改键(SHIFT键),则会修改操作以移动,从而从指针中删除[+].
这就是我需要的:
任何指向正确方向的指标都值得赞赏.
我一般用的功能在线北京 TEditCut,TEditCopy,TEditPaste并且TEditSelectAll除了他们不不属于标准的任何控制工作.
例如,它们可以正常工作TEdit或TMemo控制,但不能正常工作TEmbeddedWB- 使用它,无论是否选择了文本,标准操作总是被禁用,即使TEmbeddedWB有类似CopyToClipboard和的方法SelectAll.
如何使标准操作起作用TEmbeddedWB?标准操作如何确定是应该启用还是禁用它们(以及它们在什么情况下执行它 - 是否在OnUpdate事件中)?我是否可以扩展标准操作以添加对无法识别的组件的支持,还是需要编写替换组件?
我有一个带有 EV 代码签名证书的 Thales SafeNet 令牌。
signtool要签署我在命令行中使用的可执行文件:
signtool sign /tr "http://timestamp.digicert.com" /td sha256 /fd sha256 /as /n "CERTIFICATE NAME ON TOKEN" /v "D:\path\to\file.exe"
这个过程有效。对文件进行签名后,将弹出SafeNet 身份验证客户端密码提示,并且文件已成功签名。
但是,当在批处理循环中使用上述命令行对每个文件进行签名时,每次都会出现密码弹出窗口。
有没有办法在会话中只询问一次(或者将其作为命令行参数放入批处理文件中signtool- 我可以使用变量在批处理文件本身中提示密码SET)?
(密码)参数仅在从文件(参数)/p签名时才有效,因此这不适用于令牌。.PFX/f
到目前为止,我一直在使用 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更好,并且更容易,因为它清除了整个结构(如果你有更多的字符串).
我使用此代码来填充VirtualStringTree并允许重命名项目:
//---------------------------------------------------------------------------
// Structure for the tree
//---------------------------------------------------------------------------
struct TVSTdata
{
UnicodeString Name;
};
//---------------------------------------------------------------------------
// Initialization of the tree
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
VirtualStringTree1->NodeDataSize = sizeof(TVSTdata);
// Fill all nodes with initial data
InitializeTree();
}
//---------------------------------------------------------------------------
// Fill all nodes with data and assign FocusedNode
//---------------------------------------------------------------------------
void TForm1::InitializeTree()
{
TVirtualNode* pNode;
TVirtualNode* pActiveNode;
TVSTdata* pData;
VirtualStringTree1->BeginUpdate();
VirtualStringTree1->Clear();
pNode = VirtualStringTree1->AddChild(NULL); pData = static_cast<TVSTdata*>(VirtualStringTree1->GetNodeData(pNode)); pData->Name = "This is name 1";
pNode = VirtualStringTree1->AddChild(NULL); pData = static_cast<TVSTdata*>(VirtualStringTree1->GetNodeData(pNode)); pData->Name …Run Code Online (Sandbox Code Playgroud) 我正在使用线程包装器,它检查是否从主线程调用更新VCL(也有一些参数)的函数,然后在主线程的上下文中执行.
它有效,但我想让它变得更简单.问题是我必须在需要VCL同步的每个函数中重复此代码,这很容易出错.有没有办法让这个包装器更简单,更可重用?请注意,此特定包装器仅使用一个参数,但可以有任意数量的参数复制TLocalArgs并传递.
当前代码:
boost::scoped_ptr<TIdThreadComponent> WorkerThread;
...
void TForm1::SetMemoMessage(UnicodeString Msg)
{
// Check which thread called function, main thread or worker thread
if (GetCurrentThreadId() != System::MainThreadID)
{
struct TLocalArgs
{
TForm1 *Form;
UnicodeString Msg;
void __fastcall SetMemoMessage() // Same name as main function to make it easier to maintain
{
// We are in main thread now, safe to call message update directly
Form->SetMemoMessage(Msg);
}
};
// We are in worker thread, wrap into Synchronize
TLocalArgs Args = { …Run Code Online (Sandbox Code Playgroud) Internet Explorer 10内置了拼写检查功能,工作正常.我尝试创建一个小的HTML页面,用以下内容对其进行测试:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML lang=en xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"><HEAD>
<META name=GENERATOR content="MSHTML 10.00.9200.16721"></HEAD>
<BODY spellcheck=true contentEditable=true style="MARGIN: 0.5em">
<P>Theze ara mispeled wordz</P>
</BODY></HTML>
Run Code Online (Sandbox Code Playgroud)
所需要的只是放置属性spellcheck=true和contentEditable=true.
我也试过添加<meta http-equiv="X-UA-Compatible" content="IE=10" />例如
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML lang=en xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"><HEAD>
<meta http-equiv="X-UA-Compatible" content="IE=10" />
<META name=GENERATOR content="MSHTML 10.00.9200.16721"></HEAD>
<BODY spellcheck=true contentEditable=true style="MARGIN: 0.5em">
<P>Theze ara mispeled wordz</P>
</BODY></HTML>
Run Code Online (Sandbox Code Playgroud)
就此而言,使用IE = edge而不是IE = 10没有任何区别: <meta http-equiv ="X-UA-Compatible"content …
delphi spell-checking c++builder webbrowser-control twebbrowser
当TWebBrowser控制太小时会变得灰暗.
如果TWebBrowser控件对齐alClient并且表单上没有其他控件,我可以使它非常小(例如50x10).然而,当我添加其他控件,如面板,工具栏,主菜单等等都浮在顶部(alTop) - 我添加的控件越多,TWebBrowser我可以得到更小的窗口而不会变灰.当窗口调整大小变大时,它会再次变为未分组.
在这个例子中,我放置TToolBar了2个按钮对齐alTop,并TWebBrowser对齐alClient.如果我使工具栏不可见,我可以使网页浏览器非常小.但是,在工具栏可见的情况下,它会变灰.我添加的控件越多,它在变灰之前似乎拥有越来越少的可用空间.

正如您在上一个示例中所看到的,Web浏览器甚至比第二个示例中的更小,但仍然可见,除了顶部没有工具栏外,一切都是相同的.如果在Windows 7或8或Internet Explorer 10或11上使用,则同样适用.
这里的例子只是例子.将100x100控制作为最小尺寸我没有问题.问题是,当我放置相当多的控件时,它不允许我控制比550x250更小的控制,这是非常大的.
任何人都可以告诉我为什么其他控件对Web浏览器不能使用较小的大小,当它在表单上没有其他控件时可以完美地完成这一操作?
经过Google搜索以及我的头脑旋转和一堆误导性和矛盾的信息之后,我设法为应用程序清单编译了以下最小"模板",它应该定义以下内容:
我的清单文件是否足以满足上述目的,我是否有任何错误,我应该注意这些错误?我特别对xmlns命名空间版本感到困惑,以及为什么它们对于这个清单的部分不同?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity type="win32"
name="Manufacturer.Division.ApplicationName"
version="1.2.3.4"
processorArchitecture="x86"
/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> <!-- The application supports Windows Vista and Windows Server 2008 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- The application supports Windows 7 and Windows Server 2008 R2 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- The application supports Windows 8 and Windows Server 2012 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- The …Run Code Online (Sandbox Code Playgroud) c++builder ×9
delphi ×7
twebbrowser ×3
action ×1
c++ ×1
code-signing ×1
indy10 ×1
installation ×1
manifest ×1
memory-leaks ×1
safenet ×1
tms ×1
vcl ×1