语境:
在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;
问题:
有没有人解决这个问题的简单方法?