以前は、 を呼び出した後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 に設定されています。