Формат Zip в виртуальном Drag&Drop от меландера?

Контекст:

С помощью http://melander.dk/delphi/dragdrop/ я создал небольшой прототип для сохранения вложений в AdsTable (он создан таким образом, чтобы пользователь мог выбрать способ сохранения потока).

Пока все работает нормально, за исключением файлов .ZIP.

Событие TDropEmptyTarget.OnDrop не получает информацию... точнее, даже не вызывает событие TDropEmptyTarget.OnEnter

Я обнаружил, что проблема заключается в другом tagFORMATETC файла .ZIP. По сравнению с.EXE-файлом они имеют одинаковые форматы, кроме одного

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

Мне удалось, что компоненты примут формат, и я могу отбросить его... но он не будет правильно читать данные.

Простое изменение расширения с.ZIP на все, что позволяет мне перенести файл в свой элемент управления... сохранить его и перетащить... изменить его обратно на.ZIP и все работает нормально... но это последнее, что я хочу,

[EDIT1]

Код для включения удаления.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)

[\ EDIT1]

[EDIT2]

После включения.ZIP-файла на элемент управления компонент все еще не может прочитать данные (по-видимому), и мне удалось выполнить Код в соответствии с Функцией: (Ну, похоже, он может читать данные, но не знать, что нужно с этим делать)

 Unit DragDropFormats
 TCustomSimpleClipboardFormat.DoGetDataSized()

Что, кажется, является важной частью... но на этой глубине это становится сложным для меня.

[\ EDIT2]

Повторяется:

Вы можете скачать компонент здесь: http://melander.dk/delphi/dragdrop/

и запустить демо VirtualFileStream, эта демка также не позволяет файл.ZIP по тем же причинам.

Вы можете удалить крышку файла в DropEmptyTarget1Drop, удалив

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

Вопрос:

У кого-нибудь есть простое решение этой проблемы?

0 ответов

Другие вопросы по тегам