Ранее после вызова VirtualStringGrid -> CopyToClipBoard
я мог вставлять сетку в виде текста с вкладками в блокнот или в виде полностью отформатированной сетки (заголовки и цвет и границы) при вставке в Excel или Outlook.TVirtualStringGrid CopyToClipboard issue Embarcadero Seattle C++
Однако у меня возникают проблемы с 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: платформа dev - это Win8 и Win10, а в VirtualStringTree для ClipboardFormats установлено значение true.
Привет, Реми, я пропустил трюк SetClipboardData. Однако вызов только VST-> ContentToRTF (TVSTTextSourceType :: tstAll); 'приводит к нарушению доступа. Я расскажу о проблеме CopyToClipboard для Jam Software. Спасибо за вашу помощь! –
FYI вот отчет об ошибке и исправление, анонсированное в версии 6.2.1: [link] (https://github.com/Virtual-TreeView/Virtual-TreeView/issues/588) –