Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Как поместить в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.048 c
15-1351557893
Вепрь
2012-10-30 04:44
2013.03.22
Как получить список всех процессов?


15-1332852071
stas
2012-03-27 16:41
2013.03.22
У кого есть Galaxy tab


15-1338741213
М
2012-06-03 20:33
2013.03.22
Личная информация.


2-1340658279
Альманах
2012-06-26 01:04
2013.03.22
Создание одного фрейма два раз


2-1333194262
toropoff
2012-03-31 15:44
2013.03.22
= Record