- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
之前在调用 VirtualStringGrid -> CopyToClipBoard
之后,我可以在记事本中将网格粘贴为选项卡式文本,或者在粘贴到 Excel 或 Outlook 中时将其粘贴为完全格式化的网格(标题、颜色和边框)。
但是,我在使用 CopyToClipboard
时遇到了问题自从我使用 VirtualTreeView V6.2 从 Embarcadero XE8 转移到 RAD Seattle 后:如果目标应用程序是某种文本编辑器,我只能粘贴为文本。粘贴到任何类型的接受 RTF 或 html 的“丰富”应用程序会导致错误。
我试着调用 ContentToXXX
方法(见下面的代码)文本导出正常。 Html 已导出,但结果 Data2Export
字符串包含 html 页面上的全部代码,不能粘贴到 Outlook,例如。任何电话 ContentToRTF
导致崩溃。
我用谷歌搜索了这类问题,但没有找到任何相关的内容。
void __fastcall TForm::ExportGrid( void )
{
// old code that used to work fine
// VST->CopyToClipboard();
Virtualtrees::TVSTTextSourceType exportSrcType = tstAll;
OpenClipboard( Handle );
EmptyClipboard();
std::string Data2Export = "";
HGLOBAL hg;
// tabbed text
Data2Export = AnsiString( VST->ContentToText( exportSrcType, "\t" ) ).c_str();
hg = GlobalAlloc( GMEM_MOVEABLE, Data2Export.size() + 1 );
if ( !hg )
{
CloseClipboard();
return;
}
memcpy( GlobalLock( hg ), Data2Export.c_str(), Data2Export.size() + 1 );
GlobalUnlock( hg );
SetClipboardData( CF_TEXT, hg );
GlobalFree( hg );
// html
Data2Export = AnsiString( VST->ContentToHTML( exportSrcType ) ).c_str();
hg = GlobalAlloc( GMEM_MOVEABLE, Data2Export.size() + 1 );
if ( !hg )
{
CloseClipboard();
return;
}
memcpy( GlobalLock( hg ), Data2Export.c_str(), Data2Export.size() + 1 );
GlobalUnlock( hg );
SetClipboardData( CF_HTML, hg );
GlobalFree( hg );
// RTF
Data2Export = AnsiString( VST->ContentToRTF( exportSrcType ).c_str() ).c_str();
hg = GlobalAlloc( GMEM_MOVEABLE, Data2Export.size() + 1 );
if ( !hg )
{
CloseClipboard();
return;
}
memcpy( GlobalLock( hg ), Data2Export.c_str(), Data2Export.size() + 1 );
GlobalUnlock( hg );
SetClipboardData( CF_TEXT, hg );
GlobalFree( hg );
CloseClipboard();
}
知道如何解决或解决这个问题吗?
代码有问题吗?
PD:开发平台为Win8和Win10,VirtualStringTree ClipboardFormats都设置为true。
最佳答案
您在每次调用 SetClipboardData()
之后调用 GlobalFree()
。除非 SetClipboardData()
失败,否则您不得这样做。关于这个问题,文档非常清楚:
If SetClipboardData succeeds, the system owns the object identified by the hMem parameter. The application may not write to or free the data once ownership has been transferred to the system, but it can lock and read from the data until the CloseClipboard function is called. (The memory must be unlocked before the Clipboard is closed.) If the hMem parameter identifies a memory object, the object must have been allocated using the function with the GMEM_MOVEABLE flag.
此外,您还使用相同的 CF_TEXT
格式将文本和 RTF 数据 block 保存到剪贴板。您的 RTF 数据应改用 CF_RTF
格式。
试试这个:
#include <richedit.h>
void __fastcall TForm::ExportGrid( void )
{
// old code that used to work fine
// VST->CopyToClipboard();
Virtualtrees::TVSTTextSourceType exportSrcType = tstAll;
if ( !OpenClipboard( Handle ) ) return;
try
{
EmptyClipboard();
AnsiString Data2Export;
HGLOBAL hg;
// tabbed text
Data2Export = VST->ContentToText( exportSrcType, "\t" );
hg = GlobalAlloc( GMEM_MOVEABLE, Data2Export.size() + 1 );
if ( hg )
{
memcpy( GlobalLock( hg ), Data2Export.c_str(), Data2Export.Length() + 1 );
GlobalUnlock( hg );
if ( !SetClipboardData( CF_TEXT, hg ) ) // or maybe CF_CSV instead...
GlobalFree( hg );
}
// html
Data2Export = VST->ContentToHTML( exportSrcType );
hg = GlobalAlloc( GMEM_MOVEABLE, Data2Export.Length() + 1 );
if ( hg )
{
memcpy( GlobalLock( hg ), Data2Export.c_str(), Data2Export.Length() + 1 );
GlobalUnlock( hg );
if ( !SetClipboardData( CF_HTML, hg ) )
GlobalFree( hg );
}
// RTF
Data2Export = VST->ContentToRTF( exportSrcType );
hg = GlobalAlloc( GMEM_MOVEABLE, Data2Export.Length() + 1 );
if ( hg )
{
memcpy( GlobalLock( hg ), Data2Export.c_str(), Data2Export.Length() + 1 );
GlobalUnlock( hg );
if ( !SetClipboardData( CF_VRTF, hg ) )
GlobalFree( hg );
}
}
__finally
{
CloseClipboard();
}
}
如果您查看 VirtualTreeView 的 CopyToClipboard()
方法的源代码,它使用的实现与上面的代码截然不同。它将树数据检索到 IDataObject
COM 对象 (TVTDataObject
) 中,表示 VirtualTreeView 的 ClipboardFormats
属性中列出的剪贴板格式,以及提供的任何其他格式通过 VirtualTreeView 的 OnGetUserClipboardFormats
事件。这包括文本、HTML、RTF 和 CSV。然后调用 OleSetClipboard()
将该 COM 对象放在剪贴板上。如果任何应用程序使用 GetClipboardData()
而不是 OleGetClipboard()
, Windows 会根据需要自动提取数据。所以可能 TVTDataObject
的实现在 v6.2 中被破坏了。你应该联系JAM Software (VirtualTreeView 的当前维护者)并就此提交错误报告。
关于c++ - TVirtualStringGrid CopyToClipboard 问题 Embarcadero Seattle C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33341986/
Delphi Seattle 默认字体很大,我不喜欢它。 尝试用脚本更改它,就像我对 XE8 所做的那样 Windows Registry Editor Version 5.00 [H
也许你们中的一些人可以帮助我......当我尝试输入时,我正在使用 Delphi Seattle、Windows 10、葡萄牙语键盘布局(也尝试使用英语布局)和代码选项卡(设计选项卡完美运行): “]
我是 Delphi 新手,来自 Visual Studio,这是一个简单的问题(我猜):如何防止 Delphi 10 Seattle 在启动 IDE 时打开上次使用的项目(组)? 我找到了一些有关 .
昨天我在“ Delphi 10 Seattle”中遇到了“ Vista对话框”问题。对于某些VCL样式,它似乎不能很好地工作。 在我的应用中使用“ Windows 10 Dark”作为默认样式时,发生
在 Delphi XE8 中,我使用了 Castalia Inline Variable Integration和 Code Analysis设施。 我在 Delphi 10 Seattle 中找不到
当我阅读 Delphi 10 Seattle 中的新功能列表时,我看到了这些: 改进了 IDE 中的多显示器支持,能够将大多数表单和 Pane 放置在不同的辅助显示器上 增强的 IDE 项目选项可轻松
我有一个 100% Delphi 代码的应用程序。它是一个 64 位 Windows 控制台应用程序,具有工作负载管理器和固定数量的工作人员。这是通过创建线程来完成的,每个线程都是一个工作线程。线程不
我正在使用生成的 DS 客户端代理类通过 TDSRESTConnection 连接到 DataSnap 服务器。连接工作正常,我可以调用服务器方法。我现在想通过代理服务器进行连接,因此我在 TDSRE
当表单类添加对运行时 DPI 切换的支持时,没有考虑菜单等基本 UI 元素。 菜单绘制从根本上被破坏,因为它依赖于 Screen.MenuFont,这是一个系统范围的指标,而不是特定于显示器。因此,虽
我使用 Delphi 10 Seattle update1,我有一个从主机应用程序启动的 android 服务,但我不知道如何从主机应用程序停止该服务。谁能告诉我,好吗? 最佳答案 您正在使用 TLo
在尝试实现 Notifications 时在我的项目中,Delphi Seattle 无法正确引用 FMX.Notification。 这是我得到的: [DCC Fatal Error] UnitMa
Java 开发人员的共识(多数票)似乎是 private boolean isMyServiceRunning(Class serviceClass) { ActivityManager ma
我正在尝试使用来自 MSVC 的名为 NEC2++ 的开源代码 https://github.com/tmolteno/necpp 有一个名为 complex_array 的未定义类型,Builder
我正在使用移动开发工具运行 Delphi 10 Seattle。 我已多次重新安装 Android 工具/SDK/NDK,但无济于事。 我从来没有设法编译过一个 android 项目,我总是遇到各种错
我正在使用 Delphi 10 Seattle Pro,无法成功将 TestInsight 安装到 IDE 中。我之前已经顺利将它安装到 XE5 Pro 中。 我下载了最新的版本,分别是 1.0 版和
TFileOpenDialog 的预览 Pane 设置似乎存在问题,选择某些图像时应用程序会崩溃。有解决办法吗? Test image 演示来源: procedure TForm1.Button1Cl
在我们的 DataSnap TCP 服务器中添加对 https 网站的调用后,它在最终确定时开始崩溃。 崩溃发生在 Data.DBXOpenSSL.pas 上,更具体地说是在此方法上: class p
我正在使用 Delphi DX Seattle 并在 Android 设备上进行测试 当用户单击按钮时,我正在创建多个计划通知 当用户单击另一个按钮时,我会清除剩余的通知 我似乎无法让 TNotifi
之前在调用 VirtualStringGrid -> CopyToClipBoard 之后,我可以在记事本中将网格粘贴为选项卡式文本,或者在粘贴到 Excel 或 Outlook 中时将其粘贴为完全格
Delphi 10 Seattle Update1 有此错误修复:对 IDE 的额外高 DPI 支持(请参阅 http://edn.embarcadero.com/article/44619 )我在
我是一名优秀的程序员,十分优秀!