Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Как поместить в Clipboard любой файл?   Найти похожие ветки 

 
Прогер   (2012-08-09 21:56) [0]

Я так понимаю он может хранить только текст и рисунки.
А как же делается Ctrl + C/ Ctrl + V? Для любого файла.


 
DVM ©   (2012-08-09 22:08) [1]

сам файл туда не кладется, имя файла только, точнее список имен файлов.


 
tesseract ©   (2012-08-09 22:09) [2]

Он может хранить ole-объекты.


 
Rouse_ ©   (2012-08-09 22:09) [3]

http://rouse.drkb.ru/winapi.php#fwoledragdrop


 
Прогер   (2012-08-09 22:19) [4]


> DVM ©   (09.08.12 22:08) [1]
>
> сам файл туда не кладется, имя файла только, точнее список
> имен файлов.


Есть список путей для файлов.
Как поместить их в TClipboard?
Я что-то не догоняю.

Спасибо.


 
Rouse_ ©   (2012-08-09 22:28) [5]


> Есть список путей для файлов.
> Как поместить их в TClipboard?

Мой пример посмотри.


 
Прогер   (2012-08-09 22:37) [6]


> Rouse_ ©   (09.08.12 22:28) [5]


Т.е. стандартный Clipboard этого делать не умеет?


 
Rouse_ ©   (2012-08-09 22:53) [7]


> Т.е. стандартный Clipboard этого делать не умеет?

Именно он это и делает :) Им просто нужно уметь пользоваться.


 
Прогер   (2012-08-09 23:03) [8]


> Rouse_ ©   (09.08.12 22:53) [7]


Так... Не уходите... :)
Ща буду спрашивать.


 
Прогер   (2012-08-09 23:07) [9]


> Rouse_ ©   (09.08.12 22:53) [7]
>
>
> > Т.е. стандартный Clipboard этого делать не умеет?
>
> Именно он это и делает :) Им просто нужно уметь пользоваться.
>


Но TClipboard даже не подключен?


 
Прогер   (2012-08-09 23:10) [10]

Как этим чудом пользоваться?



FList - TStringList со списком путей к файлам.

procedure FilesToClipboard;
var
 i: LongInt;
  O: TFWDataObject;
begin
 O:= TFWDataObject.Create;
  For i:= 0 to FList.Count - 1 do
     O.AddFile(FList[i]);

 O.Free;
end;



Нажимаю Ctrl + V - ничего не "вставляет".
Что не так делаю? :)


 
Прогер   (2012-08-09 23:52) [11]

Разобрался, но программа вылетает "Invalid pointer operation". Но копирует файлы в буфер.

Что не так?



procedure FilesToClipboard;
var
i: LongInt;
 O: TFWCopyDataProvider;
begin
O:= TFWCopyDataProvider.Create;
try
O.ClearClipboard;
 For i:= 0 to FList.Count - 1 do
    O.AddFile(FList[i]);
O.CopyToClibboard; // Тут вылетает.
finally
O.Free;
end;
end;


 
Palladin ©   (2012-08-09 23:57) [12]

если принять безошибочность Розыча, то в реальности исключение возникает строчкой выше (особенность дебуггера), а FList"а не существует


 
Прогер   (2012-08-10 00:06) [13]


> Palladin ©   (09.08.12 23:57) [12]
>
> если принять безошибочность Розыча, то в реальности исключение
> возникает строчкой выше (особенность дебуггера), а FList"а
> не существует


FList -существует. Он создается в другой функции.

Если эту строчку закомментить, то не вылетает. В чем подвох?


 O.CopyToClibboard; // Тут вылетает.


 
Германн ©   (2012-08-10 01:45) [14]


> Если эту строчку закомментить, то не вылетает. В чем подвох?

Для поиска и идентификации "подвоха" надо в IDE Дельфи нажать в нужной последовательности кнопки F5, F7 и F9. И не надо думать, что кто-то будет искать этот подвох за вас.
P.S.
Что-то, где-то, вроде читал не так давно об исключении Invalid pointer operation. Что-то вроде того, что иногда это исключение означает не совсем то, что следует из его названия. Но после отпуска нахожусь в запарке и забываю запоминать ссылки на интересное. :(


 
Псарь   (2012-08-10 02:35) [15]

А не, вылетает при O.Free.

А если не вызывать  O.CopyToClibboard, то O.Free нормально отрабатывается.


 
Прогер   (2012-08-10 02:35) [16]

А не, вылетает при O.Free.
А если не вызывать  O.CopyToClibboard, то O.Free нормально отрабатывается.


 
Германн ©   (2012-08-10 02:42) [17]


> А не, вылетает при O.Free.

Ещё раз. "надо в IDE Дельфи нажать в нужной последовательности кнопки F5, F7 и F9".


 
sniknik ©   (2012-08-10 08:14) [18]

возможно, структуру нужно завершить... не знаю как тут, но довольно часто встречал, что признаком является два нулевых символа, в отличие от одного завершающего строку.

попробуй после цикла добавить O.AddFile(#0#0);, хотя, конечно завершение может быть и другим. или не нужна вообще ... чисто предположение.


 
Прогер   (2012-08-10 20:19) [19]


> sniknik ©   (10.08.12 08:14) [18]
>
> возможно, структуру нужно завершить... не знаю как тут,
> но довольно часто встречал, что признаком является два нулевых
> символа, в отличие от одного завершающего строку.
>
> попробуй после цикла добавить O.AddFile(#0#0);


Не помогает.


> Германн ©   (10.08.12 02:42) [17]
>
>
> > А не, вылетает при O.Free.
>
> Ещё раз. "надо в IDE Дельфи нажать в нужной последовательности
> кнопки F5, F7 и F9".
>


Говорит "Invalid Pointer Operation".


 
sniknik ©   (2012-08-10 20:59) [20]

> Не помогает.
еще бы... я думал что то реально не то, а посмотрел... ты код Rouse исковеркал до полной "нерабочести" просто.


 
Прогер   (2012-08-10 21:39) [21]


> sniknik ©   (10.08.12 20:59) [20]
>
> > Не помогает.
> еще бы... я думал что то реально не то, а посмотрел... ты
> код Rouse исковеркал до полной "нерабочести" просто.


А что там коверкать то?


 
Palladin ©   (2012-08-10 21:49) [22]

епт, посмотрел исходники Саши... )
не... ну... а что тут удивляться )


 
sniknik ©   (2012-08-10 22:12) [23]

> А что там коверкать то?
действительно, как два пальца об... асфальт. и зачем машине мотор? ездит то она на колесах. :)


 
Германн ©   (2012-08-11 02:52) [24]


>
> > Германн ©   (10.08.12 02:42) [17]
> >
> >
> > > А не, вылетает при O.Free.
> >
> > Ещё раз. "надо в IDE Дельфи нажать в нужной последовательности
> > кнопки F5, F7 и F9".
> >
>
>
> Говорит "Invalid Pointer Operation".

Это мы уже слышали. Где именно (на какой строчке кода) говорит?


 
Rouse_ ©   (2012-08-11 10:52) [25]


> Что не так?

Все не так. Во первых ты пытаешся убить интерфейс. Во вторых ты не назначил обработчик получения данных на интерфейс.

Возьми код обработчка копирования и реализуй его:

procedure TForm2.N1Click(Sender: TObject);
var
 I: Integer;
 CopySource: TFWCopyDataProvider;
 DropSource: IDataObject;
begin
 CopySource := TFWCopyDataProvider.Create;
 DropSource := CopySource;
 CopySource.ShowUIDialog := True;
 CopySource.OnGetContent := OnGetContent;
 CopySource.OnEndCopy := OnEndCopy;
 for I := 0 to ListBox1.Count - 1 do
   if ListBox1.Selected[I] then
     CopySource.AddFile(ListBox1.Items[I]);
 CopySource.CopyToClibboard;
end;


построчно:
CopySource := TFWCopyDataProvider.Create; - создаем обертку над IDataObject

CopySource.ShowUIDialog := True; - выставляем свойство позволяющее отображать диалог копирования при вставке данных в проводник

CopySource.OnGetContent := OnGetContent; - назначаем обработчик получения содержимого виртуальных файлов (которые в примере сидят у нас в ресурсах приложения)

CopySource.OnEndCopy := OnEndCopy; - назначаем обработчик, вызывающийся по завершении копирования

 for I := 0 to ListBox1.Count - 1 do
   if ListBox1.Selected[I] then
     CopySource.AddFile(ListBox1.Items[I]);
- накидываем в IDataObject список имен файлов, каждый из них будет добавлен в виде TFileDescriptor, описывающий непосредственно каждый виртуальный или физический файл.

CopySource.CopyToClibboard; - IDataObject создает соответствующую запись о подготовленных для копирования данных непосредственно в клипборде.

Дальше схема такая, пока приложение живо и буфер обмена не очищен, при вызове из проводника меню "Paste" будет найден наш экземпляр IDataObject и у него будут запрашиваться данные посредством вызовов функций интерфейса EnumFormatEtc/QueryGetData/GetData и т.п.
Для тебя это будет абсолютно прозрачно, обертка сама обработает нужные методы и тебе наружу дернет только обработчик OnGetContent.
В этом обработчике ты должен по имени файла, передаваемого в параметре FileDescriptor, заполнить стрим Data непосредственно содержимым самого файла.

Собственно реализация обработчика тебе уже показана:

procedure TForm2.OnGetContent(Sender: TObject;
 const FileDescriptor: TFileDescriptor; Data: TStream);
var
 I: Integer;
 R: TResourceStream;
begin
 for I := 0 to 4 do
   if PChar(@FileDescriptor.cFileName[0]) = ListBox1.Items[I] then
   begin
     R := TResourceStream.Create(HInstance, "RES" + IntToStr(I + 1),
       "DRAG_RES");
     try
       Data.CopyFrom(R, 0);
     finally
       R.Free;
     end;
   end;
end;


после того как все файлы будут скопированы, вызовется обработчик окончания копирования OnEndCopy, в принципе там можешь ничего не делать.

как-то так в кратце...


 
sniknik ©   (2012-08-11 10:58) [26]

> Где именно (на какой строчке кода) говорит?
без разницы, может на любой... посмотри на код Rouse и его... колбека (двух) нет (раз, два поинтер), объект/интерфейс уничтожается до срабатывания (три поинтер).



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.098 c
15-1340483402
Юрий
2012-06-24 00:30
2013.03.22
С днем рождения ! 24 июня 2012 воскресенье


15-1345149004
Юрий
2012-08-17 00:30
2013.03.22
С днем рождения ! 17 августа 2012 пятница


6-1264678262
madacar
2010-01-28 14:31
2013.03.22
Поиск письма на сервере


15-1352384190
Artem
2012-11-08 18:16
2013.03.22
Можно ли сменить размер виртуального диска в VirtualBox?


2-1343342978
tggbg
2012-07-27 02:49
2013.03.22
Tlist запись и загрузка из файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский