2009-04-16 14 views
10

Opracowujemy aplikację bazy danych. Użytkownik prosi o nową funkcję: Kopiuj obiekty typu blob do schowka, tak aby Eksplorator Windows mógł wkleić je jako nowe pliki. Jednym z rozwiązań jest zapisanie obiektów typu blob w folderze tymczasowym i dodanie tych plików tymczasowych do schowka.W jaki sposób kopiujesz dowolne dane do schowka jako plik?

Ale szukam lepszego rozwiązania. Czy możliwe jest przechwycenie akcji wklejania w Eksploratorze Windows i samodzielne zapisanie obiektów BLOB do ścieżki docelowej?

Odpowiedz

5

Powiedziałbym, że eksplorator kopiuje do plików docelowych, więc nie ma możliwości bezpośredniego napisz pliki docelowe, to ma sens, ponieważ nazwy plików źródłowych mogą pochodzić tylko z aplikacji, która skopiowała dane do schowka, które nie muszą być eksploratorem OTOH nazwy plików docelowych mogą faktycznie różnić się, ponieważ pliki ta sama nazwa mogła już istnieć w folderze docelowym, a tylko odkrywca może tworzyć zmodyfikowane nazwy plików docelowych (np. dodając "Kopię" lub dołączając "(2)" do nazwy pliku podstawowego)

Będziesz musiał podać format schowka dla Eksploratora Windows o to, że może wkleić pliki. Model documentation of standard clipboard formats sugeruje, że jest on prawidłowy. W tym formacie schowka podajesz listę nazw plików źródłowych, ale pliki muszą oczywiście istnieć, więc musisz je zapisać na dysku.

Można jednak spróbować uczynić proces możliwie lekkim. Zwykle, gdy użytkownik kopiuje dane do schowka, jest tam umieszczany natychmiast, bez względu na to, czy zostanie użyty do wklejenia. W przypadku aplikacji oznacza to, że za każdym razem trzeba utworzyć pliki i umieścić listę nazw plików w schowku. Jednak system Windows obsługuje tryb o nazwie Delayed Rendering, który jest używany dokładnie w takich przypadkach. Zasadniczo w schowku umieszczasz tylko pusty fragment danych i tylko wtedy, gdy inna aplikacja próbuje uzyskać dostęp do danych, których zażąda aplikacja. Możesz więc zaimplementować to w taki sposób, że tylko wtedy, gdy użytkownik spróbuje wkleić pliki do eksploratora, zapiszesz je na dysku i zwróci listę nazw plików.

1

Minęło trochę czasu, odkąd bawiłem się kopią/wklejaniem, ale jestem pewien, że możesz zrobić to, co sugerujesz (włóż blob jako nowy plik do schowka).

Wydaje mi się, że pamiętam, że w zależności od sposobu dodania do schowka można określić, jakie dane kopiujesz. Myślę, że jeśli uzyskasz odpowiedni typ danych, będziesz mógł wklejać tak, jak skopiowałeś z Eksploratora Windows.

Postaram i odkopać trochę więcej szczegółów tego wieczoru, jeśli mam szansę (nie mam tu na wszystkie moje prace zakładki) ...

[Edytuj] Zapraszamy do obejrzenia the wxWidgets documentation on drag and drop. To było to, z czym pracowałem i daje pewne wskazówki dotyczące typów danych.

W czym piszesz? Delphi?

[Edytuj2] Myślę, że to może być ograniczenie systemu Windows (?). Może to być po prostu dokumentacja wxWidgets, ale jest a suggestion that you only copy filenames rather than the files themselves. Jeśli tak jest, musisz najpierw utworzyć oryginalną propozycję utworzenia pliku tymczasowego :-(

13

Nigdy tego nie próbowałem, ale myślę, że jest to rzeczywiście możliwe. Zapoznaj się z dokumentacją MSDN dla Shell Clipboard Formats.CFSTR_FILECONTENTS i CFSTR_FILEDESCRIPTOR to formaty, które prawdopodobnie będą obsługiwane.

Dodatkowo znalazłem artykuł w Code Project, który zapewnia program demonstracyjny: How to drag a virtual file from your app into Windows Explorer.

Aktualizacja: Przykładem napisane w .NET:

+0

Interesujące rzeczy - dzięki za linki :-) –

+0

Dziękuję również ode mnie. Naucz się czegoś nowego każdego dnia! –

7

Z artykułu MSDN Handling Shell Data Transfer Scenarios

  • Istniejące pliki powinny być oferowane w formacie CF_HDROP.
  • Oferować dane plikopodobne za pomocą formatów CFSTR_FILECONTENTS/CFSTR_FILEDESCRIPTOR . To podejście pozwala obiektowi utworzyć plik z obiektu danych o numerze , bez konieczności znajomości pamięci danych. Powinieneś normalnie prezentować dane jako interfejs IStream. Ten mechanizm przesyłania danych jest bardziej elastyczny niż obiekt pamięci globalnej i zużywa znacznie mniej pamięci.

Dwa inne dobre artykuły do ​​odczytu z MSDN są:

Kiedy zaczynałem pracę na zawartość schowka do przesyłania plików I wydrukowany wszystkie trzy artykuły i przeczytaj je kilka razy.

Radzenie sobie z interfejsami może być dość zaangażowane. Znalazłem dwie dobre biblioteki, które pomagają w tym.

The The Drag and Drop Component Suite for Delphi. Po przewinięciu strony głównej zobaczysz, że niektóre często zadawane pytania są dobre. Istnieje również wiele przykładowych aplikacji do pobrania. Wydaje mi się, że prezentacje AsyncSource powinny być pomocne dla tego, czego szukasz. Pakiet jest darmowy ze źródłem. Kod wydaje się dobrze komentowany.

Obecnie używam komponentu [email protected] z Quasidata. Nie jest darmowy, ale jest bardzo tani. Początkowo korzystałem z Transfer @ Once, ponieważ w tamtym czasie było ono lepiej obsługiwane niż pakiet składników Drag and Drop. Jednak sytuacja się odwróciła. Transfer @ Once nie obsługuje jeszcze Delphi 2009. Kiedy przejdę do przeniesienia aplikacji, prawdopodobnie zmienię komponenty. Kod Transfer @ Once jest dołączony do zakupu. Osobiście znalazłem kod przeciągania i upuszczania, który był znacznie łatwiejszy do odczytania i śledzenia.

Powiązane problemy