1

语境:

在http://melander.dk/delphi/dragdrop/的帮助下,我创建了一个在 AdsTable 中保存附件的小原型(构建原型以便用户可以决定保存流的方式)。

到目前为止一切正常,除了.ZIP文件。

TDropEmptyTarget.OnDrop事件没有得到信息......更准确地说,甚至没有TDropEmptyTarget.OnEnter事件触发

我发现问题出在.ZIP文件的不同tagFORMATETC中。与 .EXE 文件相比,它们具有相同的格式,除了一个

.EXE = (49441, nil, 1, -1, 4) // ClipboardFormatname = 'FileContents'
.ZIP = (49159, nil, 1, -1, 1) // ClipboardFormatname = 'FileNameW'

我已经设法让组件接受格式并且我可以删除它......但它不会正确读取数据。

只需将扩展名从 .ZIP 更改为允许我将文件放在我的控件中的任何内容...保存并将其拖出...将其更改回 .ZIP 并且一切正常...但这是我想要的最后一件事.

[编辑1]

启用 .ZIP 拖放的代码(仅允许拖放 zip 文件但无法读取数据

  // ClipboardFormat for Zip
TFileContentsOnDemandZipFormat = class(TAnsiFileGroupDescriptorClipboardFormat)
public
  function GetClipboardFormat: TClipFormat; override;
end;

function TFileContentsOnDemandZipFormat.GetClipboardFormat: TClipFormat;
begin
  Result := RegisterClipboardFormat('DragContext'); // also tried 'FileNameW'
end;

...

// Enables to drop Zip-Format
aClipboardZipFormat := TFileContentsOnDemandZipFormat.CreateFormat(1 or 4);
// VirtualTargetFiles = TVirtualFileStreamDataFormat(fTargetData.DataFormat)
aIndex := VirtualTargetFiles.CompatibleFormats.Add(aClipboardZipFormat);
// fDropTarget = TDropEmptyTarget
fDropTarget.DataFormats.Formats[0].AcceptFormat(VirtualTargetFiles.CompatibleFormats[aIndex].FormatEtc);

.EXE 文件的所有格式 EXE 文件:

(49438, nil, 1, -1, 1)
(50098, nil, 1, -1, 1)
(50099, nil, 1, -1, 1)
(49454, nil, 1, -1, 4)
(50100, nil, 1, -1, 1)
(49453, nil, 1, -1, 1)
(15, nil, 1, -1, 1)
(49158, nil, 1, -1, 1)
(49441, nil, 1, -1, 4) = 'FileContents' // Used by the component 

ZIP 文件:

(49438, nil, 1, -1, 1)
(50098, nil, 1, -1, 1)
(50099, nil, 1, -1, 1)
(49454, nil, 1, -1, 4)
(50100, nil, 1, -1, 1)
(49453, nil, 1, -1, 1)
(15, nil, 1, -1, 1)
(49158, nil, 1, -1, 1)
(49159, nil, 1, -1, 1) = 'FileNameW'

组件接受的格式

(49441, nil, 1, -1, x)
(49442, nil, 1, -1, x)
(49443, nil, 1, -1, x)

[\编辑1]

[编辑2]

在将 .ZIP 文件启用到控件上后,组件仍然无法读取数据(显然),我已经设法按照代码执行功能:(看起来它可以读取数据但没有知道正确的做法)

 Unit DragDropFormats
 TCustomSimpleClipboardFormat.DoGetDataSized()

这似乎是重要的部分......但在这个深度上,它对我来说变得很复杂。

[\EDIT2]

可重复:

你可以在这里下载组件:http: //melander.dk/delphi/dragdrop/

并运行演示VirtualFileStream这个演示也不允许 .ZIP 文件出于同样的原因。

您可能希望通过删除删除 DropEmptyTarget1Drop 中的文件上限

if (BufferSize > MaxBufferSize) then
   BufferSize := MaxBufferSize;

问题:

有没有人解决这个问题的简单方法?

4

0 回答 0