Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TVirtualStringGrid CopyToClipboard发行Embarcadero Seattle C++;_C++_C++builder_Virtualtreeview_Tvirtualstringtree - Fatal编程技术网

C++ TVirtualStringGrid CopyToClipboard发行Embarcadero Seattle C++;

C++ TVirtualStringGrid CopyToClipboard发行Embarcadero Seattle C++;,c++,c++builder,virtualtreeview,tvirtualstringtree,C++,C++builder,Virtualtreeview,Tvirtualstringtree,以前,在调用VirtualStringGrid->CopyToClipBoard后,我可以将网格粘贴为记事本中的选项卡文本,或者粘贴到Excel或Outlook时粘贴为完全格式化的网格(标题、颜色和边框) 但是,自从我使用VirtualTreeView V6.2从Embarcadero XE8迁移到RAD Seattle后,我遇到了CopyToClipboard的问题:我只能在目标应用程序是某种文本编辑器的情况下粘贴为文本。粘贴到任何一种接受RTF或html的“富”应用程序都会导致错误 我尝试调

以前,在调用
VirtualStringGrid->CopyToClipBoard
后,我可以将网格粘贴为记事本中的选项卡文本,或者粘贴到Excel或Outlook时粘贴为完全格式化的网格(标题、颜色和边框)

但是,自从我使用VirtualTreeView V6.2从Embarcadero XE8迁移到RAD Seattle后,我遇到了
CopyToClipboard
的问题:我只能在目标应用程序是某种文本编辑器的情况下粘贴为文本。粘贴到任何一种接受RTF或html的“富”应用程序都会导致错误

我尝试调用
ContentToXXX
方法(请参见下面的代码)文本导出正常。Html被导出,但结果的
Data2Export
字符串包含Html页面上的全部代码,例如,无法粘贴到Outlook。 任何对
contentortf
的调用都会导致崩溃

我在谷歌上搜索过这类问题,但没有找到任何相关的

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。

每次调用
SetClipboardData()
后,您都在调用
GlobalFree()
。除非
SetClipboardData()
失败,否则不能执行此操作。文件对此问题非常清楚:

如果SetClipboardData成功,则系统拥有由hMem参数标识的对象一旦所有权转移到系统,应用程序可能不会写入或释放数据,但它可以锁定和读取数据,直到调用CloseClipboard函数。(关闭剪贴板前必须解锁内存。)如果hMem参数标识内存对象,则必须使用带有GMEM_MOVEABLE标志的函数分配该对象

此外,您正在使用相同的
CF_Text
格式将文本和RTF数据块保存到剪贴板。您的RTF数据应该使用
CF\u RTF
格式

试试这个:

#include <richedit.h>

void __fastcall TForm::ExportGrid( void )
{
    // old code that used to work fine
    //  VST->CopyToClipboard();

    Virtualtrees::TVSTTextSourceType exportSrcType = tstAll;

    if ( !OpenClipboard( Handle ) ) return;
    try
    {
        EmptyClipboard();

        AnsiString Data2Export;
        HGLOBAL hg;

        // tabbed text
        Data2Export = VST->ContentToText( exportSrcType, "\t" );
        hg = GlobalAlloc( GMEM_MOVEABLE, Data2Export.size() + 1 );
        if ( hg )
        {
            memcpy( GlobalLock( hg ), Data2Export.c_str(), Data2Export.Length() + 1 );
            GlobalUnlock( hg );
            if ( !SetClipboardData( CF_TEXT, hg ) ) // or maybe CF_CSV instead...
                GlobalFree( hg );
        }

        // html
        Data2Export = VST->ContentToHTML( exportSrcType );
        hg = GlobalAlloc( GMEM_MOVEABLE, Data2Export.Length() + 1 );
        if ( hg )
        {
            memcpy( GlobalLock( hg ), Data2Export.c_str(), Data2Export.Length() + 1 );
            GlobalUnlock( hg );

            if ( !SetClipboardData( CF_HTML, hg ) )
                GlobalFree( hg );
        }

        // RTF
        Data2Export = VST->ContentToRTF( exportSrcType );
        hg = GlobalAlloc( GMEM_MOVEABLE, Data2Export.Length() + 1 );
        if ( hg )
        {
            memcpy( GlobalLock( hg ), Data2Export.c_str(), Data2Export.Length() + 1 );
            GlobalUnlock( hg );

            if ( !SetClipboardData( CF_VRTF, hg ) )
                GlobalFree( hg );

        }
    }
    __finally
    {
        CloseClipboard();
    }
}
#包括
void\uu fastcall TForm::ExportGrid(void)
{
//以前工作正常的旧代码
//VST->CopyToClipboard();
Virtualtrees::TVSTextSourceType exportSrcType=tstAll;
如果(!OpenClipboard(Handle))返回;
尝试
{
清空电路板();
传输数据2出口;
全球汞;
//选项卡式文本
Data2Export=VST->ContentToText(exportSrcType,“\t”);
hg=全局Alloc(GMEM_可移动,Data2Export.size()+1);
if(汞柱)
{
memcpy(GlobalLock(hg),Data2Export.c_str(),Data2Export.Length()+1);
GlobalUnlock(hg);
如果(!SetClipboardData(CF_TEXT,hg))//或者可能改为CF_CSV。。。
全球自由度(hg);
}
//html
Data2Export=VST->ContentToHTML(exportSrcType);
hg=全局Alloc(GMEM_可移动,数据2导出长度()+1);
if(汞柱)
{
memcpy(GlobalLock(hg),Data2Export.c_str(),Data2Export.Length()+1);
GlobalUnlock(hg);
如果(!SetClipboardData(CF_HTML,hg))
全球自由度(hg);
}
//RTF
Data2Export=VST->ContentToRTF(exportSrcType);
hg=全局Alloc(GMEM_可移动,数据2导出长度()+1);
if(汞柱)
{
memcpy(GlobalLock(hg),Data2Export.c_str(),Data2Export.Length()+1);
GlobalUnlock(hg);
如果(!SetClipboardData(CF_VRTF,hg))
全球自由度(hg);
}
}
__最后
{
CloseClipboard();
}
}

如果查看VirtualTreeView的
CopyToClipboard()
方法的源代码,它使用的实现与上面的代码非常不同。它将树数据检索到
IDataObject
COM对象(
TVTDataObject
)中,该对象表示VirtualTreeView的
ClipboardFormats
属性中列出的剪贴板格式,以及VirtualTreeView的
OnGetUserClipboardFormats
事件提供的任何其他格式。包括文本、HTML、RTF和CSV。然后调用将COM对象放到剪贴板上。如果任何应用程序使用
GetClipboardData()
而不是,Windows会根据需要自动提取数据。因此,
TVTDataObject
的实现可能在v6.2中被破坏了。您应该联系(VirtualTreeView的当前维护人员)并提交一份关于此问题的错误报告。

嗨,雷米,我错过了SetClipboardData的技巧。然而,调用只需
VST->contentortf(tvstextsourcetype::tstAll)导致访问冲突。我将向Jam软件报告CopyToClipboard问题。谢谢你的帮助!仅供参考,以下是版本6.2.1中发布的错误报告和修复: