在調用VirtualStringGrid -> CopyToClipBoard
之前,我可以將網格作爲選項卡式文本粘貼到記事本中,或者在粘貼到Excel或Outlook時作爲完全格式化的網格(標題和顏色以及邊框)粘貼。TVirtualStringGrid CopyToClipboard問題Embarcadero Seattle C++
但是,我從使用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。
嗨,雷米,我錯過了SetClipboardData技巧。然而,僅僅調用'VST-> ContentToRTF(TVSTTextSourceType :: tstAll)'會導致訪問衝突。我會將CopyToClipboard問題報告給Jam Software。謝謝你的幫助! –
僅供參考這裏是在版本6.2.1中公佈的錯誤報告和修復:[link](https://github.com/Virtual-TreeView/Virtual-TreeView/issues/588) –