以前は、 を呼び出した後VirtualStringGrid -> CopyToClipBoard、メモ帳にタブ付きテキストとしてグリッドを貼り付けたり、Excel または Outlook に貼り付けるときに完全にフォーマットされたグリッド (ヘッダーと色と境界線) として貼り付けることができました。
ただし、CopyToClipboardVirtualTreeView 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 に設定されています。