之前调用 后VirtualStringGrid -> CopyToClipBoard
,我可以将网格粘贴为记事本中的选项卡式文本,或者在粘贴到 Excel 或 Outlook 时作为完全格式化的网格(标题、颜色和边框)。
但是,自从我使用 VirtualTreeView V6.2 从 Embarcadero XE8 迁移到 RAD Seattle 后,我遇到了问题CopyToClipboard
:如果目标应用程序是某种文本编辑器,我只能粘贴为文本。粘贴到任何可以接受 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。