Раньше после вызова VirtualStringGrid -> CopyToClipBoard
я мог вставить сетку как текст с вкладками в блокноте или как полностью отформатированную сетку (заголовки, цвет и границы) при вставке в Excel или Outlook.
Однако у меня возникли проблемы с CopyToClipboard
с тех пор, как я перешел с Embarcadero XE8 на RAD Seattle с VirtualTreeView V6.2: я могу вставлять текст только в том случае, если целевое приложение является текстовым редактором. Вставка в любое «богатое» приложение, которое может принимать 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 установлено значение true.